SymPy入门
什么是SymPy?SymPy是一个用于符号数学的Python库。 它旨在成为一个功能齐全的计算机代数系统(CAS),同时保持代码尽可能简单,以便易于理解和易于扩展。为什么要写这篇文章呢,Python本身已经是一个强大的计算器了,内置函数就可以进行三角函数和复数的运算等等,之前也提到了cmath库,它的全部用法也就是那么多,作为对复数运算的一个简单扩充。但是,在高等数学中,常见的极限、求导和积分运算却难以在Python中表达,因此SymPy这一符号库应运而生。谈谈我个人对“易于理解和易于扩展”的理解:SymPy与Python配合的很好,SymPy使用Python的语法来构建表达式,换言之,熟悉Python编程的可以很快地适应并掌握SymPy;同时,SymPy支持LaTeX,MathML和Dot等格式输出,有很好的扩展性,我在初次使用SymPy时是被它的简洁优雅而打动。下面的代码绝大多数来自官方文档,引用在此作为对常用属性和方法的一个总结,不求全,但求精。
abc模块
该模块的作用就是方便调用符号变量,提高效率。提供英文字母大小写和希腊字母,以下是abc模块中部分代码:
1 | a, b, c, d, e, f, g, h, i, j = symbols('a, b, c, d, e, f, g, h, i, j') |
这样做的好处就是,可以很快创建符号变量,需要哪个字母(或希腊字母)直接调用就好,例如:
1 | from sympy.abc import x, y |
创建符号变量
符号变量和变量有什么不同呢?打个比方,符号变量就如同数学函数f(x)中的自变量x,而变量就如同一个容器,里面存放着数值。注意,符号变量不能被赋值,但是可以计算在某一点的值,而变量是可以被赋值的,这是很大的不同。在SymPy中,存在大写开头的Symbol()和小写开头的symbols(),前者是一个类,创建Symbol对象。后者是一个操作函数,功能和结果一样,只是实现方法上是有区别的。(ps:参数传递单双引号皆可。)
1 | from sympy import * |
迭代创建变量
1 | 'x:5') symbols( |
1 | 'x:z') symbols( |
创建指定特点的符号变量
1 | 'a', integer=True) a = symbols( |
基础运算
变量替换(Substitution)
1 | 1 expr = cos(x) + |
变量替换的两个作用:
求出某一点的值
1
20) expr.subs(x,
2用某个表达式去替换另一个表达式
1
2
3
4expr = x**y
expr = expr.subs(y, x**y)
expr
x**(x**y)
subs方法返回新的表达式,但是不改变SymPy对象。(SymPy表达式是不可变的,所有函数不改变他们,所有函数返回新的表达式。)
1 | expr = cos(x) |
转换字符串为SymPy表达式
1 | "x**2 + 3*x - 1/2" str_expr = |
evalf函数(evaluate floating point number)
1 | 8) expr = sqrt( |
打印输出
临时交互测试SymPy的时候,可用以下命令,其中init_printing()函数会自动使用当前环境中最好的打印方式。
1 | from sympy import init_session |
在SymPy中,有以下常用的打印方式:
str
1
2
3from sympy.abc import x
1/x), x)) print(Integral(sqrt(
Integral(sqrt(1/x), x)srepr
ASCII pretty printer
1
2
3
4
5
6
7
8
91/x), x), use_unicode=False) pprint(Integral(sqrt(
/
|
| ___
| / 1
| / - dx
| \/ x
|
/Unicode pretty printer
1
2
3
4
5
6
71/x), x), use_unicode=True) pprint(Integral(sqrt(
⌠
⎮ ___
⎮ ╱ 1
⎮ ╱ ─ dx
⎮ ╲╱ x
⌡LaTeX
1
21/x), x))) print(latex(Integral(sqrt(
\int \sqrt{\frac{1}{x}}\, dxMathML
Dot
化简
simplify
函数的作用是简化数学表达式,该函数是一个通用的函数,计算会很耗时;若使用特定的函数则会提高运算速度,接下来的一些函数都是一些特定的化简方法。但是要注意它只适用主要的简化操作,因为简化的定义不是非常明确。
1 | 2 + cos(x)**2) simplify(sin(x)** |
expand
SymPy中最常用的化简函数之一,用于展开多项表达式。可能展开与化简是对立的,因为它使表达式变得更加复杂,但有些情况下的确会变短。
1 | 1)**2) expand((x+ |
factor
对于多项式,factor()是与expand()相反的。
1 | 3 - x**2 + x - 1) factor(x** |
trigsimp(三角化简)
1 | 2 + cos(x)**2) trigsimp(sin(x)** |
微积分
求导—diff
1 | diff(sin(x), x) |
积分—integrate
积分分为定积分和不定积分。对于不定积分就是求导的逆运算,因此在表达式后传入变量即可。对于定积分,参数的格式是(integration_variable, lower_limit, upper_limit)。FYI,无穷大在SymPy中的表示为oo。例如:
1 | integrate(cos(x), x) |
对于双重积分,依次传入参数,例如:
1 | 2 - y**2), (x, -oo, oo), (y, -oo, oo)) integrate(exp(-x** |
如果是不可积的积分,SymPy会返回未计算的积分对象。
1 | expr = integrate(x**x, x) |
对应于求导的类Derivative,积分的类是Integral。既保留了待积分式,又可以进行积分运算。
1 | 2, x) expr = Integral(log(x)** |
极限—limit
参数格式:limit(f(x), x, x0)
1 | 0) limit(sin(x)/x, x, |
同样地,极限的类是Limit。
1 | 1)/x, x, 0) expr = Limit((cos(x) - |
计算单侧极限,添加第三个参数,例如求:
1 | 1/x, x, 0, '+') limit( |
级数展开
SymPy可计算函数在某一点的渐进级数展开。参数格式:f(x).series(x, x0, n),其中x0和n是可省略的,省略时x0=0且n=6。
1 | expr = exp(sin(x)) |
SymPy给开发者提供了很好的程序接口,除了以上提到的函数方法,还包括矩阵运算,解方程,解微分方程等其他诸多的内容,主要内容列举于此以供参考。