有没有一种方便的方法可以在 sympy (python) 中以极坐标形式添加复数?

Is there a convenient way to add complex numbers in polar form in sympy (python)?

我在 sympy 中添加极坐标形式的复数时遇到了一些问题。 以下代码

from sympy import I, exp, pi, re, im

a = exp(2*pi/3*I)
b = exp(-2*pi/3*I)

c = a+b 
print(c)
print(c.simplify())
print(c.as_real_imag())
print(re(c)+im(c)*I)
print(int(c))
print(complex(c))

给予

exp(-2*I*pi/3) + exp(2*I*pi/3)
-(-1)**(1/3) + (-1)**(2/3)
(-1, 0)
-1
-1
(-1+6.776263578034403e-21j)

我想要的是得到a+b最简单的答案,即-1。我可以通过使用 re(c)+im(c)*I 手动重建 c=a+b 来获得它。 为什么这是必要的?还有更好的方法吗?

简单地打印 c 保留了极坐标形式,混淆了答案,c.simplify() 保留了极坐标形式,但没有多大帮助,c.as_real_imag() returns 一个元组. int(c) 完成这项工作,但需要知道 c 是真实的(否则会抛出错误)和整数(否则,这不是我想要的答案)。 complex(c) 种工作,但我不想留下符号计算。请注意,float(c) 不起作用,因为 complex(c) 具有非零虚部。

https://whosebug.com/users/9450991/oscar-benjamin 已经为您提供了解决方案。如果您在极坐标中,您的表达式可能具有指数函数。如果您不想要这些,则必须重写三角函数,其中许多值都知道特殊值。例如,考虑 a2*pi/3 角度:

>>> cos(2*pi/3)
-1/2
>>> sin(2*pi/3)
sqrt(3)/2

当您根据 cos(或 sin)重写 a 时,它将成为这两个值的总和(Isin 值):

>>> a.rewrite(cos)
-1/2 + sqrt(3)*I/2

当您重写一个更复杂的表达式时,您将以这种方式重写整个表达式以及 cancel/combine 会这样做(或可能需要一些简化)的任何术语:

>>> c.rewrite(cos)
-1