SymPy和复数的平方根

时间:2016-12-25 21:02:58

标签: python sympy symbolic-math

当使用solve计算二次方程的根时,SymPy返回可以简化的表达式,但我无法简化它们。最小的例子如下:

from sympy import *
sqrt(-24-70*I)

在这里,SymPy只返回sqrt(-24-70*I),而Mathematica或Maple将使用相当于5-7*I的回答。

我知道有两个平方根,但这种行为需要SymPy,例如,从

返回非常复杂的解决方案
z = symbols("z")
solve(z ** 2 + (1 + I) * z + (6 + 18 * I), z)

同时,Maple和Mathematica将很高兴地给我两个高斯整数来解决这个等式。

是否有选项或某些我不知道的内容?

2 个答案:

答案 0 :(得分:3)

找到z的平方根在逻辑上与求解方程(x + I * y)** 2 = z相同。所以你可以这样做:

from sympy import *
z = -24-70*I
x, y = symbols('x y', real=True)
result = solve((x+I*y)**2 - z, (x, y))

结果为[(-5, 7), (5, -7)]

为方便起见,可以将其包装为函数:

def my_sqrt(z):
    x, y = symbols('x y', real=True)
    sol = solve((x+I*y)**2 - z, (x, y))
    return sol[0][0] + sol[0][1]*I

现在您可以使用my_sqrt(-24-70*I)并获取-5 + 7*I

在您的示例中,相同的策略有助于使用二次方程:

x, y = symbols('x y', real=True)
z = x + I*y
solve(z ** 2 + (1 + I) * z + (6 + 18 * I), (x, y))

输出:[(-3, 3), (2, -4)]

答案 1 :(得分:0)

如果您拥有mpmath套餐,则可以执行类似

的操作
from sympy import *
import mpmath

a = -24-70*I
b = mpmath.mpc(re(a), im(a))  # a as mpmath.mpc object
c = mpmath.sqrt(b)
d = simplify(c)  # Convert back to sympy object
print(d)  # 5.0 - 7.0*I

请注意,转换回sympy对象的方式可能比(simplify更便宜)。

更新

正如评论中所指出的,这会执行数字评估,而不是符号。也就是说,上述并不是真的优于此:

import cmath
result = cmath.sqrt(-24 - 70j)
print(result)  # 5 - 7j

以上有两个有趣的方面。首先,cmath模块是标准库的一部分。其次,由于result以整数给出,我们保证result实际上是精确的符号值(并且可以很容易地转换为sympy对象)。如果解是非整数,则result表示为浮点数。这当然不是符号复杂平方根问题的一般好解决方案,但如果事先知道解是整数,那么它是有用的。