我刚开始尝试使用SymPy,有些行为让我感到惊讶,例如这不是我期望的结果:
>>> import sympy as s
>>> (-1)**s.I == s.E**(-1* s.pi)
False
>>> s.I**s.I == s.exp(-s.pi/2)
False
这些为什么返回False,是否有办法将一个复数的书写方式转换为另一种方式?
从常见问题解答中:
为什么SymPy会说两个相等的表达式不相等?
等号(==)测试表达式是否具有相同的形式,而不是它们在数学上是否等价。
为了使基本情况下的等式测试有用,SymPy在计算它们时尝试将数学上等价的表达式重写为规范形式。例如,SymPy将x+x和-(-2*x)都简化为2*x,将x*x简化为x**2。
默认转换无法生成规范形式的最简单的示例是非线性多项式,它可以表示为分解和展开形式。尽管显然 a(1+b) = a+ab
在数学上是正确的,但SymPy给出:
>>> bool(a*(1+b) == a + a*b) False
>>> bool(a*(1+b) - (a+a*b) == 0) False
如果您想确定非平凡表达式的数学等价性,应该对方程两边应用更高级的简化程序。在多项式的情况下,可以通过完全展开表达式来将其重写为规范形式。这可以使用SymPy中的.expand()
方法来完成:
>>> A, B = a*(1+b), a + a*b
>>> bool(A.expand() == B.expand()) True
>>> (A - B).expand() 0
.expand()
没有帮助,尝试使用 simplify()
、trigsimp()
等更高级的转换方法。例如,>>> trigsimp(cos(x)**2 + sin(x)**2) == 1 True
因为它们不相等。试试这个:
s.E **(s.I * s.pi)== s.I * s.I