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