简介
- SymPy是一个符号计算的Python库。它的目标是成为一个全功能的计算机代数系统,同时保持代码简 洁、易于理解和扩展。它完全由Python写成,不依赖于外部库。SymPy支持符号计算、高精度计算、模式匹配、绘图、解方程、微积分、组合数学、离散 数学、几何学、概率与统计、物理学等方面的功能。
安装及导入
- 使用命令行执行
conda install sympy
或pip install sympy
即可 - 以下示例代码事先均已
from sympy import *
基本数值类型
实数、有理数和整数
- SymPy有三个内建的数值类型:实数,有理数和整数。有理数类用两个整数来表示一个有理数,分子与分母,如
sympy.Rational(1, 2)
代表1/2
。
特殊的常数
- 我们也可以有一些特殊的常数,像
e
和pi
,它们会被当作符号去对待。(1+pi
不会求得值,反而它会保持为1+pi
),若要求出表达式的浮点值,可以使用evalf()
函数,如下:
>>> pi**2
pi**2
>>> pi.evalf()
3.14159265358979
>>> (pi+exp(1)).evalf()
5.85987448204884
- 如果对浮点数计算有确切的精度要求,或者要用于精确的数值计算,可用如下方法:
>>> (1/x).evalf(subs={x: 3.0}, n=21)
0.333333333333333333333
subs
表示用数值替换变量进行计算,n
指示小数位数。
无穷大
- 有一个无穷大的类型
oo
>>> oo + 1
oo
>>> print(oo > 99999)
True
定义变量与表达式
-
symbols()
函数用以定义变量,之后可以再定义表达式
>>> eg = symbols('x')
>>> eg + 1
x + 1
>>> z = symbols('z')
>>> expr = z**2 + 1
>>> print(expr)
z**2 + 1
- 也可以在定义变量的时候指定变量类型
>>> x = Symbol("x", real=True)
>>> y = Symbol("y", integer=True)
>>> z = Symbol("x", complex=True)
· 后面实例代码中所用的变量均需先定义好。
变量替换函数subs()
- 调用方式为
subs(*args, **kwargs)
>>> x = symbols('x')
>>> expr = x + 1
>>> expr.subs(x, 2)
3
>>> expr.subs(x, pi)
pi + 1
>>> (1 + x*y).subs({x:1, y:2})
3
>>> (1 + x*y).subs([(x, 1), (y, 2)])
3
>>> reps = [(x, 1), (y, 2)]
>>> (1 + x*y).subs(reps)
3
复数
使用sympy.I
:
>>> x = Symbol("x")
>>> exp(I*x).expand()
exp(I*x)
>>> exp(I*x).expand(complex=True)
I*exp(-im(x))*sin(re(x)) + cos(re(x))*exp(-im(x))
>>> x = Symbol("x", real=True)
>>> exp(I*x).expand(complex=True)
I*sin(x) + cos(x)
函数
支持初等函数、阶乘fractorial(x)
、伽玛函数、Zeta函数
多项式
- PASS
代数式展开,apart(expr, x)
>>> 1/((x+2)*(x+1))
1
───────────────
(2 + x)*(1 + x)
>>> apart(1/((x+2)*(x+1)), x)
1 1
───── - ─────
1 + x 2 + x
代数式的合并,together(expr, x)
:
>>> together((1/(1+x) - 1/(2+x)), x)
1/((x + 1)*(x + 2))
微积分
极限
使用limit( f(x), x, p)
,即计算x -> p
时f(x)
的极限。
>>> limit(sin(x)/x, x, 0)
1
>>> limit(1/x, x, oo)
0
- 求导,使用
diff(f(x), x, n)
即求f(x)
的n
阶导数
>>> diff(sin(2*x), x, 1)
2 * cos(2*x)
>>> diff(sin(2*x), x, 2)
-4 * sin(2*x)
级数展开
使用series(var, point, order)
:
>>> cos(x).series(x, 0, 10)
1 - x**2/2 + x**4/24 - x**6/720 + x**8/40320 + O(x**10)
积分
sympy支持不定积分、超越函数与特殊函数的定积分,使用integrate(f(x), x)
求不定积分,使用integrate(f(x), (x, a, b))
求定积分:
>>> integrate(6*x**5, x)
x**6
>>> integrate(exp(-x**2)*erf(x), x)
pi**(1/2)*erf(x)**2/4
>>> integrate(sin(x), (x, 0, pi/2))
1
>>> integrate(exp(-x), (x, 0, oo))
1
>>> integrate(log(x), (x, 0, 1))
-1
微分方程
- pass
代数方程
- pass
线性代数
矩阵
矩阵由矩阵类创建,既可以是数值矩阵,也可以是代数矩阵
>>> from sympy import Matrix
>>> Matrix([[1,0], [0,1]])
[1, 0]
[0, 1]
>>> Matrix([[1, x], [y, 1]])
[1, x]
[y, 1]
系数匹配
使用 match()
方法,引用Wild
类,来执行表达式的匹配。该方法会返回一个字典。
>>> x = Symbol(‘x‘)
>>> p = Wild(‘p‘)
>>> (5*x**2).match(p*x**2)
{p_: 5}
>>> q = Wild(‘q‘)
>>> (x**2).match(p*x**q)
{p_: 1, q_: 2}
打印输出
标准
print()
和 pprint()
>>> print(1/((x+2)*(x+1)))
1/((x + 2)*(x + 1))
>>> pprint(1/((x+2)*(x+1)))
1
───────────────
(2 + x)*(1 + x)
LaTex、MathML
>>> from sympy import Integral, latex
>>> pprint(latex(Integral(x**2, x)))
\int x^{2}\, dx
>>> print(mathml(x**2))
'<apply><power/><ci>x</ci><cn>2</cn></apply>'