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
因为它们不相等。试试这个:
s.E**(s.I * s.pi) == s.I * s.I
9
来自常见问题解答:
为什么SymPy会说两个相等的表达式是不相等的?
在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