SymPy的基础知识

时间:2009-12-23 19:19:48

标签: python sympy

我刚刚开始使用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并且有没有办法让它从一种编写复数的方式转换为另一种方式?

2 个答案:

答案 0 :(得分:9)

来自FAQ

为什么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 

同样,SymPy未能检测到差异为零:

 >>> 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

答案 1 :(得分:0)

因为他们不平等。试试这个:

s.E **(s.I * s.pi)== s.I * s.I