实数在python中变得复杂

实数在python中变得复杂,python,python-3.x,complex-numbers,Python,Python 3.x,Complex Numbers,代码是: A = b/a B = c/a C = d/a Q = (A**2-3*B)/9 R = (2*A**3-9*A*B+27*C)/54 M = R**2-Q**3 p = (3*B-A**2)/3 q = (2*A**3-9*A*B+27*C)/27 delta = (q/2)**2+(p/3)**3 if M <= 0 : from math import sqrt,acos,cos,pi Z = acos(R/sqrt(Q**3)) X1

代码是:

A = b/a
B = c/a
C = d/a

Q = (A**2-3*B)/9
R = (2*A**3-9*A*B+27*C)/54

M = R**2-Q**3

p = (3*B-A**2)/3
q = (2*A**3-9*A*B+27*C)/27

delta = (q/2)**2+(p/3)**3

if M <= 0 :
    from math import sqrt,acos,cos,pi

    Z = acos(R/sqrt(Q**3))
    X1 = -(2*sqrt(Q)*cos(Z/3))-A/3
    X2 = -(2*sqrt(Q)*cos((Z+2*pi)/3))-A/3
    X3 = -(2*sqrt(Q)*cos((Z-2*pi)/3))-A/3


elif delta > 0 :
    from math import sqrt
    import cmath

    u = ((-q/2)+sqrt(delta))**(1/3)
    v = ((q/2)+sqrt(delta))**(1/3)

    X1 = u-v-A/3
    X2 = -(1/2)*(u-v)-A/3+(u+v)*(sqrt(3)/2)*cmath.sqrt(-1)
    X3 = -(1/2)*(u-v)-A/3-(u+v)*(sqrt(3)/2)*cmath.sqrt(-1)
但它跳过了M,进入了三角洲

结果是:

X1 = 1.0
X2 = (-1+4.8e-09j)
X3 = (-1-4.8e-09j)
我不知道怎么了?
假设它转到M和X1,X2和X3通过在M中计算变为实数(负数提升为分数次幂,要么给出复数(在Python 3.x中)(对于奇数次幂,如1/3或1/5,偶数)要么给出Python 2.x中的值错误(
ValueError:负数不能提升为分数次幂)

范例-

>>> (-27)**(1/3)
(1.5000000000000004+2.598076211353316j)
您需要自己处理这种情况,例如,如果您正在执行(1/3)的幂运算,则必须像-

x = -27
if x < 0:
    pow = -((-x) **(1/3))
elif x > 0:
    pow = x **(1/3)
else:
    pow = 0
x=-27
如果x<0:
功率=-(-x)**(1/3))
elif x>0:
功率=x**(1/3)
其他:
功率=0

您的示例代码有一个
elif
没有前面的
if
。上面的另一个问题q=(A2-3*B)/9r=(2*A3-9*A*B+27*C)/54m=R2-Q3如果M再次出现,您的
u
v
以相同的方式计算,使用
((q/2)+sqrt(delta))**(1/3)
,这可能会导致复数,正如我在回答中所指出的,您可以编写一个函数来执行我回答中的第二个代码,并调用该函数来执行多维数据集。当我输入a=1 b=1 c=-1 d=-1 M=0时,我的代码是如果M,您在哪里使用
M
我在您问题的代码中看不到任何
M
x = -27
if x < 0:
    pow = -((-x) **(1/3))
elif x > 0:
    pow = x **(1/3)
else:
    pow = 0