作为我写的程序的一部分,我需要精确地求解一个三次方程(而不是使用一个数字根查找器):
a*x**3 + b*x**2 + c*x + d = 0.
我试图使用here中的方程式.但是,请考虑以下代码(这是Python,但它是非常通用的代码):
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
但输出的是:
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
所以输出不是零,所以x1实际上并不是一个解决方案.维基百科文章中有错误吗?
ps:我知道numpy.roots将会解决这种方程式,但是我需要为数百万的方程式做这个,所以我需要实现这一点来处理系数数组.