SymPy 虚数

mic*_*ard 6 python sympy

我正在编写一些 SymPy 代码来处理带有虚数的符号表达式。

首先,我想让它把 x 和 y 作为实数,并找到 x=iy 的解决方案。所以我可以这样做。

x, y = sympy.symbols("x y", real=True)  
print(sympy.solve([x-sympy.I*y]))
Run Code Online (Sandbox Code Playgroud)

(SymPy solve 需要一个值列表,所有这些都必须是 0。所以 x-iy=0 => x=iy)。SymPy 会正确地告诉我

[{x: 0, y: 0}]
Run Code Online (Sandbox Code Playgroud)

但是,如果我以(理论上相同的)方式执行此操作:

x, y = sympy.symbols("x y")
print(sympy.solve([x-sympy.I*y, sympy.im(y), sympy.im(x)]))
Run Code Online (Sandbox Code Playgroud)

然后现在 SymPy 告诉我

[{re(y): y, re(x): I*y, im(x): 0, x: I*y, im(y): 0}]
Run Code Online (Sandbox Code Playgroud)

这在技术上是正确的,但并没有为我做所有的事情。这只是 SymPy 中的一个限制,还是我可以通过以这种方式约束复数 x 和 y 来给我 x=y=0 ?

小智 7

由于 SymPy 比复数更擅长简化实数对,因此以下策略有帮助:为实部/虚部设置实变量,然后从它们形成复变量。

from sympy import *
x1, x2, y1, y2 = symbols("x1 x2 y1 y2", real=True)  
x = x1 + I*x2
y = y1 + I*y2
Run Code Online (Sandbox Code Playgroud)

现在 x 和 y 可以用作等式中的复杂变量,例如您的

sol = solve([x-I*y, im(y), im(x)])
print(x.subs(sol[0]), y.subs(sol[0])) 
Run Code Online (Sandbox Code Playgroud)

输出:0 0