我目前正在编写一个程序来确定三次方程的根。这是我到目前为止所写的:
import math
def sols(a, b, c, d ):
disc = 18*a*b*c*d - 4*(b**3)*d + (b**2)*(c**2) - 4*a*(c**3) - 27*(a**2)*(d**2)
x = b**2.0 - 3.0*a*c
y = 2.0*(b**3.0) - 9.0*a*b*c + 27.0*(a**2.0)*d
alpha = complex(-0.5, 0.5*math.sqrt(3))
if disc >= 0:
C = ((y + complex (0, math.sqrt (27.*(a**2)*disc)))/2)**(1.0/3)
sol1 = -(1/3*a)*(b + C + x/C)
sol2 = -(1/3*a)*(b + C*alpha + x/(C*alpha))
sol3 = -(1/3*a)*(b + C*(alpha**2)) + x/(C*(alpha**2))
a,b,c,d是真实的。如果判别式大于零,我应该留下三个真正的根。 C计算一个复杂的数字,但是当sol1中使用C时,复杂的部分应该相互抵消,我应该留下一个真正的解决方案。
给定值a = 2,b = 3,c = -11 d = -6我获得C和x / C:
In[11]: C
Out[12]: (7.5+4.330127018922192j)
In[13]: x/C
Out[14]: (7.500000000000002-4.330127018922193j)
正如我之前所说的那样,两个复杂的部分应该取消,并且直到最后一个十进制数字为止。因此,而不是C - x / C = 15,我得到:
In[26]: C + x/C
Out[27]: (15.000000000000002-8.881784197001252e-16j)
我不明白如何解决这个问题。我不知道我的程序有什么问题,使我的C和x / C值相差一个小数。请有人可以提供任何形式的帮助!!!