SymPy 是一个由 Python 语言编写的符号计算库。我将在本文中简要地介绍如何利用 SymPy 进行符号计算。在介绍 SymPy 之前,我们首先要明确何谓符号计算?计算机代数系统又是什么?
什么是符号计算 ?
处理数学对象的计算称为符号计算。在符号计算中,数学对象是精确表示的,而不是近似的,未计算的数学表达式会以符号形式保留。与符号计算相对应的是数值计算,下面将以两个例子来展示二者之间的区别。
数值计算示例
下面是一个计算
import math
math.pi
print(math.sin(math.pi))
符号计算示例
下面是一个计算
from sympy import *
sin(pi)
对比
明确了数值计算和符号计算之间的区别后,让我们再来认识什么是计算机代数系统。
什么是计算机代数系统 ?
计算机代数系统(Computer Algebra System,缩写作:CAS)是进行符号运算的软件。在计算机代数系统中运算的对象是数学表达式,通常表达式有如下几类:
- 多元多项式
- 标准函数(三角函数、指数函数等)
- 特殊函数(
函数、Bessel 函数等)
- 多种函数组成的复合函数
- 表达式的导数、积分、和与积等
- 级数
- 矩阵
以下列出了几种典型的符号计算:
- 表达式化简
- 表达式求值
- 表达式的变形:展开、积、幂、部分分式表示、将三角函数转换为指数函数等
- 一元或多元微分
- 带条件的化简
- 部分或完整的因式分解
- 求解线性或非线性方程
- 求解微分方程或差分方程
- 求极限
- 求函数的定积分、不定积分
- 泰勒展开、洛朗展开等
- 无穷级数展开
- 级数求和
- 矩阵运算
- 数学公式的
或显示
通常符号计算软件也具备一定的数值运算能力,例如可以进行如下运算:
- 求函数确切值
- 求高精度值,如
- 线性代数的数值运算
此外符号计算软件也具有描绘二维、三维函数图像的功能。
实际上,目前存在众多的计算机代数系统,下面列出了几种:
- Maple
- MuPAD
- Maxima
- Mathcad
- Mathematica
- MATLAB Symbolic Math Toolbox
- SageMath
为什么选择 SymPy ?
那么,是什么让 SymPy 从这众多软件中脱颖而出,让我们选择它呢?我觉得有如下 4 个原因:
- SymPy 是自由软件,免费开源,在遵守许可证条款的前提下,用户可以自由地根据自己的需求修改其源代码。与之形成对比的是,Maple、MuPad、Mathcad、MATLAB、Mathematica 等都是商业软件,价格昂贵;
- SymPy 使用 Python 编写而成,与使用自己发明的语言的计算机代数系统相比(如 Maxima 由 LISP 编写),SymPy 具有很强的通用性。SymPy 完全用 Python 编写,完全在 Python 中执行。这样,只要您熟悉 Python,那么 SymPy 将会很容易入门;
- 与另一个使用 Python 的符号计算软件——SageMath 相比,SymPy 的优点是安装包体积小;
- SymPy 的一个重要特性是,它可以作为库集成到其他软件中,为别的软件所用。SageMath 便是将 SymPy 作为其子模块,然后再加入其他模块,构建出一个功能齐全的数学软件。
准备知识
在学习如何使用 SymPy 进行符号计算之前,请确保您满足如下几个条件:
- 学习过微积分
- 学习过线性代数
- 熟悉 Python 基本语法
- 了解 Python 面向对象编程方法
- 会使用 JupyterLab Notebook 交互式开发环境
- 了解
是什么东西
如何使用 SymPy ?
前面的第 1 个符号计算示例展示了如何利用 SymPy 精确地计算三角函数,实际上,它的功能远不仅于此。作为一个强大的符号计算库,它几乎能够计算所有带符号变量的表达式。下面从本节开始将介绍如何使用 SymPy。
导入 SymPy 库
在使用 SymPy 之前需要先将其导入,有两种方式:
- 直接导入:
import sympy
2. 利用 from
语句导入:
from sympy import *
两种方式都导入了 SymPy 库中的所有函数、对象、变量等。区别是调用方式不同。比如在调用 sqrt
(
sympy.sqrt(2)
,后者则直接写成
sqrt(2)
。为了力求简洁,我们使用第 2 种方式导入 SymPy 。
注意:为了防止命名空间冲突,PEP 标准推荐使用第一种方式导入库。但是,通常一个符号运算 Python 源文件是单独使用的,稍加注意就可以避免命名空间冲突的问题。
新建符号
在使用符号之前,先要利用 symbols
函数定义符号,语句是:
# 新建符号 x, y
x, y = symbols('x y')
还有一个更简洁的方法是,利用 SymPy 的 abc 子模块导入所有拉丁、希腊字母:
# 利用 SymPy 的 abc 子模块新建符号 x, y
from sympy.abc import x, y
注意:希腊字母(lambda) 是 Python 保留关键字,当用户需要使用这个字母时,请写成lamda
(不写中间的 'b')。
新建符号变量时可以指定其定义域,比如指定
x = symbols('x', positive = True)
这样在求解过程中
可以利用 symbols
函数依次新建类似
vars = symbols('x_1:5')
vars
(x_1, x_2, x_3, x_4)
vars[0]
下面是一个符号计算的完整例子:
from sympy import *
x, y, z = symbols('x y z')
y = expand((x + 1)**2) # expand