我正在编写一些 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。