
Sympy是一个专注于符号数学计算的数学工具,使得用户可以轻松地进行复杂的符号运算,如求解方程、求导数、积分、级数展开、矩阵运算等。其中比较流行的深度学习框架pytorch的用到了Sympy,主要用于将模型的计算图转换为符号化表达式,以便进行分析和优化。
获取方式
python
pip install -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple sympy
模块导入
python
import sympy as sp
#or
from sympy import *
Sympy符号定义
符号定义是指将特定字符经过sympy下的symbols函数或Symbol类后变成一个sympy变量,这些变量可以在后续的符号计算中被识别和操作。
定义单个变量
python
import sympy as sp
#使用Symbol类定义单个变量
x=sp.Symbol('x')
y=sp.Symbol('y')
python
import sympy as sp
#使用symbols函数定义单个变量
x=sp.symbols('x')
y=sp.symbols('y')
同时定义多个变量
python
import sympy as sp
#同时定义三个变量
x,y,z=sp.symbols('x y z')
注意,当同时定义多个变量时,symbols函数内的多个字符之间需要使用逗号或空格分隔开。
批量定义变量
当我们想要使用sympy定义诸如:x1,x2,x3,x4....这样的变量时,我们只需:
python
import sympy as sp
# 同时定义多个符号变量
variables = sp.symbols('x1:5') # 定义 x1, x2, ... x4
print(variables)
定义带上下标的变量
python
from IPython.display import display, Math
import sympy as sp
sp.init_printing()
# 同时定义多个符号变量
variablesx=sp.symbols('x^1:5') # 定义 x1, x2, ..., x5
variablesy=sp.symbols('y_1:5')
#sp.latex:用来将表达式按照latex输出
#display,Math:在 JupyterNotebook中,对sympy的latex表达式使用display(Math())会自动将其渲染为好看的数学公式样式
display(Math(sp.latex(variablesx)))
display(Math(sp.latex(variablesy)))
结果

变量类型参数
|----------------|----|
| positive=True | 正数 |
| negative=True | 负数 |
| imaginary=True | 虚数 |
| complex=True | 复数 |
[sympy符号变量类型设定]
Sympy初等函数表达式
当我们需要进行符号运算的表达式中含有一些基本初等函数时,我们需要借助其在sympy下的函数来对其进行表示。
指对函数
|-----------------------------------------------|-------------|
| (自然指数函数) | sp.exp |
| (自然对数函数) | sp.ln |
| (指数函数) | sp.Pow(a,x) |
| (对数函数) | sp.log(x,a) |
[指对函数在sympy中的表示]
三角函数
|-------------|---------|
| sin(正弦) | sp.sin |
| cos(余弦) | sp.cos |
| tan(正切) | sp.tan |
| cot(余切) | sp.cot |
| sec(正割) | sp.sec |
| csc(余割) | sp.csc |
| arcsin(反正弦) | sp.asin |
| arccos(反余弦) | sp.acos |
| arctan(反正切) | sp.atan |
| arcsec(反正割) | sp.asec |
| arccsc(反余割) | sp.acsc |
[基本三角函数在sympy中的表示]
双曲函数
|----------------|----------|
| sinh(双曲正弦) | sp.sinh |
| cosh(双曲余弦) | sp.cosh |
| tanh(双曲正切) | sp.tanh |
| coth(双曲余切) | sp.coth |
| sech(双曲正割) | sp.sech |
| csch(双曲余割) | sp.csch |
| arcsinh(反双曲正弦) | sp.asinh |
| arccosh(双反曲余弦) | sp.acosh |
| arctanh(反双曲正切) | sp.atanh |
| arcsech(反双曲正割) | sp.asech |
| arccsch(反双曲余割) | sp.acsch |
[双曲函数在sympy中的表示]
其他函数
|----------------------------------------------|--------------|
| (根号函数) | sp.sqrt |
| |x|(绝对值函数) | sp.Abs |
| u(x)(阶跃函数) | sp.Heaviside |
| sign(x)(符号函数) | sp.Sign |
其他类型的函数,诸如幂函数,多项式函数等都可以使用定义过的符号变量,使用python中的运算符进行组合得到。
Sympy表达式化简
因式展开sp.expand()
sp.expand()函数可以实现将给定的表达式展开, 这里,我们对这个式子展开
python
from IPython.display import display, Math
import sympy as sp
# 同时定义多个符号变量
x,y,z=sp.symbols('x,y,z')
#sp.latex:用来将表达式按照latex输出
#display,Math:在 JupyterNotebook中,对symoy的latex表达式使用display(Math())会自动将其渲染为好看的数学公式样式
expressions=(x+1/y+3/z)**2
expanded_expressions=sp.expand(expressions)
display(Math(sp.latex(expanded_expressions)))
结果

因式分解sp.factor()
sp.factor()主要用于将多项式进行因式分解。这里我们以为例
python
from IPython.display import display,Math
import sympy as sp
x,y=sp.symbols('x y')
expressions=x**3-1
result=sp.factor(expressions)
display(Math(sp.latex(result)))
结果:

分式因式分解sp.cancel()
sp.cancel()和sp.factor()函数用法一致,都可以用来进行因式分解,不过sp.cancel()多用于有理函数分式的因式分解。这里我们以为例。
python
from IPython.display import display,Math
import sympy as sp
x,y=sp.symbols('x y')
expressions=(x**2-1)/(x**3-1)
result=sp.cancel(expressions)
display(Math(sp.latex(result)))
结果:

分式拆分(裂项)化简sp.apart()
分式拆分化简是指将分式差分成若干个多项式与分式或分式与分式之和的分式,比如我们最常见的裂项相消的形式,它可以拆分成两个分式相加的形式。
python
from IPython.display import display,Math
import sympy as sp
x,y=sp.symbols('x y')
expressions=(1/(x**2+x))
result=sp.apart(expressions)
display(Math(sp.latex(result)))
结果:

分式合并sp.together()
与sp.apart()函数恰恰相反,sp.together()函数用来将多个分式之间(也可以包含多项式)求和的形式和并为同一个分式。这里我们以为例。
python
from IPython.display import display,Math
import sympy as sp
x,y=sp.symbols('x y')
expressions=(1/x)+1/(x+1)+x
result=sp.together(expressions)
display(Math(sp.latex(result)))
结果:

三角函数化简sp.trigsimp()
sp.trigsimp()是考虑到了一系列三角函数关系后专门针对三角函数表达式进行化简的函数。
这里我们以为例。
python
from IPython.display import display,Math
import sympy as sp
x,y=sp.symbols('x y')
expressions=sp.sin(x)+sp.cos(x)
result=sp.trigsimp(expressions)
display(Math(sp.latex(result)))
结果:

指数化简sp.powsimp()
sp.powsimp()是考虑到了指数函数的性质后专门针对指数函数表达式进行化简的函数。这里我们以为例。
python
#指数函数化简
from IPython.display import display,Math
import sympy as sp
x,y=sp.symbols('x y')
expressions=2*sp.exp(x)*sp.exp(y**2)
result=sp.powsimp(expressions)
display(Math(sp.latex(result)))
结果:

嵌套指数化简sp.powdenest()
嵌套指数是指形如:的形式,使用sp.powdenest()后将被化简为
,当然,直接使用sp.powsimp()函数也可以实现该类型化简。
python
#嵌套指数化简
from IPython.display import display,Math
import sympy as sp
x,y=sp.symbols('x y')
expressions=2*sp.exp(x)**2
result=sp.powdenest(expressions)
display(Math(sp.latex(result)))
结果:

对数合并sp.logcombine()
sp.logcombine()主要用来合并相加的对数表达式。这里我们以为例,注意(必须在定义变量时,指明该变量positive=True)才可以使用该方法合并对数表达式。
python
#对数函数化简合并
from IPython.display import display,Math
import sympy as sp
x,y=sp.symbols('x y',positive=True)
expressions=sp.log(x)+sp.log(x**2)
result=sp.logcombine(expressions)
display(Math(sp.latex(result)))
结果:

根式化简sp.sqrtsimp()
sp.sqrtsimp()主要用来化简根式,特别是对根式进行有理化操作时。这里我们以为例。
python
#根式化简
from IPython.display import display,Math
import sympy as sp
x,y=sp.symbols('x y')
expressions=1/(sp.sqrt(1+x)-sp.sqrt(x))
result=sp.radsimp(expressions)
display(Math(sp.latex(result)))
结果:

Sympy表达式赋值
当我们定义了一些符号变量,并对其表达式进行合并化简后,我们需要将变量的值带入表达式进行数值计算时,可以使用sp.subs()函数来实现该功能。
sp.subs()函数参数
python
#根式化简
from IPython.display import display,Math
import sympy as sp
x,y=sp.symbols('x y')
expressions=1/(sp.sqrt(1+x)-sp.sqrt(x))
simplify_result=sp.radsimp(expressions)
result=sp.Subs(simplify_result,x,1).evalf()
display(Math(sp.latex(result)))
总结

以上便是关于Sympy的一些常用方法,看完这篇文章,你将掌握一个符号计算利器!