SymPy学习笔记(二)需要避免的坑
坑一:符号与变量
符号(Symbol)指的是SymPy提供的,用symbols()
定义的符号,而变量是Python提供的。
1 | >>> x = symbols('x') |
以上这个程序,并没有输出3
,而是输出了x + 1
,这是因为x = 2
只是将变量x
的值,从符号,变成了数字2,而符号并没有发生改变,因此expr
的值也就没有改变。
想要计算expr
在x=2条件下的值,可以使用subs
:
1 | >>> x = symbols('x') |
坑二:等于号
假如你用==
检测两个式子是否相等,你将会得到错误的结果:
1 | >>> (x + 1)**2 == x**2 + 2*x + 1 |
SymPy并没有扩展Python的语法,=
依然表示赋值,==
表示变量的相等,因此在SymPy中,主要用这两种方式表示两个式子相等:
- 这是官方文档中推荐的方法:假如你想要验证是否成立,可以检测是否成立,只要将两个式子相减,然后使用
simplify()
函数化简,如果结果是0,则必定相等,如果不是0,大多数情况下不相等,但也存在极少数情况,式子确实为0,但是SymPy无法将其化简,对于常见的数学式子,可以放心地使用这个方法检验其是否相等。
1 | >>> a = (x + 1)**2 |
- 另一种方法是使用
a.equals(b)
,但是这个方法并不是使用式子的化简得到的结论,而是通过随机地给式子赋多个值,比较二者是否相等。
1 | >>> a = cos(x)**2 - sin(x)**2 |
坑三:^符号
SymPy使用和Python一样的符号约定,用**
表示指数,^
表示异或(Xor),所以不应该尝试使用^
表示指数。
1 | >>> Xor(x, y) |
坑四:/符号
两个SymPy对象相除,或者一个SymPy对象相除的时候,返回值都是SymPy对象,这没有问题。但是当分子分母都是Python的int时,要小心了。两个SymPy对象相除会返回一个分数,但是两个Python的int相除会返回一个浮点数(Python3)。
1 | >>> x / y |
0.15789473684210525
不是我们想要的结果,这个值不是精确的,当处理两个整数相除的时候,可以使用Rational()
来避免这种结果:
1 | Rational(3, 19) |
如果和其他符号连接起来的时候这种错误就更难以察觉:
1 | >>> x + 1/3 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Cyrus' Blog!
评论