2015-09-20 2 views
0

Étant donné une fonction quadratique, c'est f(x) = ax^2 + bx + c, quel est le moyen le plus rapide pour trouver x dans [-1, 1] qui minimise f(x)?Minimiseur quadratique rapide

Jusqu'à présent, c'est la fonction que je suis venu avec:

double QuadraticMinimizer(double a, double b, double c) { 
    double x = 1 - 2*(b > 0); 
    if (a > 0) { 
     x = -b/(2*a); 
     if (fabs(x) > 1) 
      x = Sign(x); 
    } 
    return x; 
} 

Est-il possible de faire mieux?

+1

Le minimum/maximum peut se situer à l'une des trois positions suivantes: un point final de l'intervalle ou l'endroit où f '(x) == 0 ou x == -b/(2a) (ne peut pas être dans l'intervalle). Vérifiez-les tous. –

+0

@Cong Ma: Correct, c'est ce que fait l'extrait de code ci-dessus. Mais il est possible de le faire dans des étapes plus petites? – user92382

+0

Vous avez une étape, à quelle vitesse un code peut-il être plus rapide? Aussi, pourquoi a> 0 et non abs (a)> 0. – user1095108

Répondre

1

Il n'y a pas de "voie la plus rapide" car le temps de fonctionnement dépend de la machine particulière et de la distribution particulière des paramètres d'entrée. En outre, il n'y a pas grand-chose que vous pouvez supprimer du code initial.

Si l'emplacement de l'extremum -b/2a se situe fréquemment en dehors de l'intervalle [-1,1], vous pouvez éviter la division dans ces cas.

Si vous permettez à pirater le bit de signe de la représentation en virgule flottante à mettre en œuvre rapide abs, sgn et setsgn fonctions, vous pouvez utiliser quelque chose comme

a*= -2; 
if (hack_abs(b) >= hack_abs(a)) 
    return hack_setsgn(1, hack_sgn(a)^hack_sgn(b)); 

return b/a; 

Vous pouvez également essayer avec le copysign plus portable fonction .