SymPy和复数的平方根

Fru*_*lax 5 python symbolic-math sympy

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

from sympy import *
sqrt(-24-70*I)
Run Code Online (Sandbox Code Playgroud)

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

我知道有两个平方根,但这种行为需要SymPy,例如,将返回相当复杂的解决方案

z = symbols("z")
solve(z ** 2 + (1 + I) * z + (6 + 18 * I), z)
Run Code Online (Sandbox Code Playgroud)

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

有没有选项或我缺少的东西?

小智 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))
Run Code Online (Sandbox Code Playgroud)

结果是[(-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
Run Code Online (Sandbox Code Playgroud)

现在您可以使用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))
Run Code Online (Sandbox Code Playgroud)

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