Résoudre une équation cubique
Dans le cadre d'un programme que je suis en train d'écrire, j'ai besoin pour résoudre une équation mètres exactement (plutôt que d'utiliser un numérique racine finder):
a*x**3 + b*x**2 + c*x + d = 0.
Je suis en train d'utiliser les équations de ici. Cependant, considérons le code suivant (c'est Python, mais c'est assez générique code):
a = 1.0
b = 0.0
c = 0.2 - 1.0
d = -0.7 * 0.2
q = (3*a*c - b**2) / (9 * a**2)
r = (9*a*b*c - 27*a**2*d - 2*b**3) / (54*a**3)
print "q = ",q
print "r = ",r
delta = q**3 + r**2
print "delta = ",delta
# here delta is less than zero so we use the second set of equations from the article:
rho = (-q**3)**0.5
# For x1 the imaginary part is unimportant since it cancels out
s_real = rho**(1./3.)
t_real = rho**(1./3.)
print "s [real] = ",s_real
print "t [real] = ",t_real
x1 = s_real + t_real - b / (3. * a)
print "x1 = ", x1
print "should be zero: ",a*x1**3+b*x1**2+c*x1+d
Mais la sortie est:
q = -0.266666666667
r = 0.07
delta = -0.014062962963
s [real] = 0.516397779494
t [real] = 0.516397779494
x1 = 1.03279555899
should be zero: 0.135412149064
de sorte que la sortie n'est pas nulle, et donc x1 n'est pas vraiment une solution. Est-il une erreur dans l'article de Wikipedia?
ps: je sais que numpy.les racines de résoudre ce genre d'équation, mais j'ai besoin de faire cela pour des millions d'équations et donc j'ai besoin pour mettre en œuvre ce travail sur les tableaux de coefficients.
source d'informationauteur astrofrog
Vous devez vous connecter pour publier un commentaire.
De wikipédia en notation
(rho^(1/3), theta/3)
ne signifie pas querho^(1/3)
est la partie réelle ettheta/3
est la partie imaginaire. Plutôt, c'est en coordonnées polaires. Ainsi, si vous voulez la partie réelle, vous devez prendrerho^(1/3) * cos(theta/3)
.J'ai fait ces changements à votre code et il a travaillé pour moi:
(Bien sûr,
s_real = t_real
ici parce quecos
est même.)J'ai regardé l'article de Wikipédia et à votre programme.
J'ai aussi résolu l'équation à l'aide de Wolfram Alpha et les résultats ne correspondent pas à ce que vous obtenez.
Je venais de passer par votre programme à chaque étape, utilisez beaucoup d'imprimer les relevés de compte, et obtenir chaque résultat intermédiaire. Puis aller de l'avant avec une calculatrice et faire vous-même.
Je ne trouve pas ce qui se passe, mais lorsque votre main calculs et le programme de divergent est un bon endroit pour chercher.
Voici A. Rex de la solution en JavaScript:
Dans le cas où quelqu'un a besoin d'un code C++, vous pouvez utiliser cette pièce d'OpenCV:
https://github.com/opencv/opencv/blob/master/modules/calib3d/src/polynom_solver.cpp
Le programme ci-dessous résout parfaitement le Cube Équation de la forme Ax^3 + Bx^2 + Cx + D.
Le bon code est écrit .Net C#.
Le réel et l'imaginaire racines sont séparées par des couleurs noir et rouge, respectivement.
Simplement mettre à jour les valeurs des variables A, B, C et D pour voir les réponses, c'est à dire la solution de l'équation.
Pour trouver les 2 racines, d'une solution d'une équation Quadratique, visitez ici.
Source