当使用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将很高兴地给我两个高斯整数来解决这个等式。
是否有选项或某些我不知道的内容?
答案 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
表示为浮点数。这当然不是符号复杂平方根问题的一般好解决方案,但如果事先知道解是整数,那么它是有用的。