SymPy基础知识

4 投票
2 回答
1619 浏览
提问于 2025-04-15 17:19

我刚开始接触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

撰写回答