我刚开始玩SymPy,我对它的一些行为感到有些惊讶,例如这不是我期望的结果:
>>> import sympy as s
>>> (-1)**s.I == s.E**(-1* s.pi)
False
>>> s.I**s.I == s.exp(-s.pi/2)
False
Run Code Online (Sandbox Code Playgroud)
为什么这些返回False并且有没有办法让它从一种复杂数字转换为另一种方式?
来自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
Run Code Online (Sandbox Code Playgroud)
同样,SymPy无法检测到差异为零:
>>> bool(a*(1+b) - (a+a*b) == 0) False
Run Code Online (Sandbox Code Playgroud)
如果要确定非平凡表达式的数学等价,则应该在等式的两边应用更高级的简化例程.在多项式的情况下,表达式可以通过完全展开来以规范形式重写.这是使用.expand()SymPy中的方法完成的:
>>> A, B = a*(1+b), a + a*b
>>> bool(A.expand() == B.expand()) True
>>> (A - B).expand() 0
Run Code Online (Sandbox Code Playgroud)
如果.expand()没有帮助,尝试simplify(),trigsimp()等等,这些尝试更先进的转换.例如,
>>> trigsimp(cos(x)**2 + sin(x)**2) == 1 True
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1220 次 |
| 最近记录: |