贡献者: shizy0808; addis
符号计算又称计算机代数,通俗地说就是用计算机推导数学公式,如对表达式进行因式分解、化简、微分、积分、解代数方程、求解常微分方程等。在SciPy 数值微分与积分部分我们已经介绍了如何利用 python
实现相关数值计算,这里面我们将进一步介绍符号计算在 python
中的实现。那么数值计算与符号计算有什么区别与联系呢?个人认为:首先在数值计算过程中,所有出现的 变量
或者 参数
在使用之前必须给定具体取值,并且计算结果大多数是近似的;相反的是,在符号计算过程中,变量可以预先不给定取值,计算结果是准确的,解析的。不太准确的表述为:符号计算就是对表达式进行的操作;数值计算是对数据进行的操作。
在 python
中,专门进行符号计算的库是 sympy (symbol python 的简写)。利用这个库可以进行符号表达式的加减乘除等四则运算、符号化简、求导、积分、极限、解方程(组)、解微分方程(组)等等。下面我们将进行逐一介绍。
我们首先导入 sympy
库:
定义单个变量(类型为 sympy.core.symbol.Symbol
)
sm.symbols('x0, x1')
中的 ,
用空格隔开也是可以的。即 sm.symbols('x0 x1')
。
当定义多个连续变量时,也可以这样
注意不包括x8
.
sympy
库中预置了许多常量:圆周率
python
代码为:
上面只是列举了部分函数与常量,sympy
库只能还有非常多,感兴趣的读者可以参考官方文档
另外需要注意的是,sympy
中的符号不能与 numpy, scipy
中的混用,否则会报错,例如
此处返回错误
正确的用法为
我们在看这个例子
为了巩固上面符号计算的一些细节我们来做一个练习。
利用 sympy
计算
sm.cancel() | 分子分母化简 |
sm.expand() | 展开表达式 |
sm.factor() | 因式分解表达式 |
sm.radsimp() | 分母有理化 |
sm.simplify() | 化简表达式 |
sm.trigsimp() | 仅仅化简表达式的三角函数部分 |
例如,化简表达式
展开表达式
约分表达式
因式分解
三角函数化简
需要说明的是以上各种表达式化简不会改变原有表达式。
sympy
库中提供了表达式替换函数 subs
与计算函数 evalf
,它的用法为
sympy
库还提供了函数 lambdify
函数,此函数相当于匿名函数,它的用法是
例如
仔细的观察我们发现,虽然我们定义的是符号变量与符号表达式,但是该函数返回值是浮点型数据。默认情况下,lambdify
函数调用了 math
模块,也就是说 sm.sin()
被转化为 math.sin()
.
sympy
库中提供了 solve
函数进行方程的求解,它的用法为
利用 solve_linear_system
求解线性方程组,例如
对应的代码为:
sympy
提供了两种方法计算符号表达式的导数,分别为 sm.Derivative()
与 sm.diff()
,用法为:
sympy
提供了两种方法计算符号表达式的积分,分别为 Integral()
与 sm.integrate()
,这两个方法与求导的两种方法一一对应。用法为:
友情链接: 超理论坛 | ©小时科技 保留一切权利