详解Sympy:符号计算利器

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的一些常用方法,看完这篇文章,你将掌握一个符号计算利器!

相关推荐
大博士.J24 分钟前
MySQL实现全量同步和增量同步到SQL Server或其他关系型库
数据仓库·人工智能·python·mysql·adb
Sunshine_Cherish25 分钟前
当Anaconda的安装路径与我想创建的conda虚拟环境路径不一致时,应该怎么操作?
python·conda·anaconda
FreakStudio1 小时前
一文速通Python并行计算:00 并行计算的基本概念
python·嵌入式·面向对象·电子diy
myzzb1 小时前
python字符级差异分析并生成 Word 报告 自然语言处理断句
python·学习·自然语言处理·word·snownlp
水w1 小时前
【pyCharm Git】根据dev分支新建dev_y分支,本地也新建dev_y分支,并将代码提交到Gitlab上的新分支dev_y上。
开发语言·git·python·pycharm·pull·push·branch
范哥来了2 小时前
python 数据可视化matplotib库安装与使用
开发语言·python·信息可视化
dme.2 小时前
python爬虫Scrapy(6)之增量式
爬虫·python·scrapy
红虾程序员3 小时前
python函数的多种参数使用形式
开发语言·python·pycharm
SsummerC4 小时前
【leetcode100】搜索二维矩阵
python·线性代数·leetcode·矩阵
trust Tomorrow4 小时前
Python-docx库详解:轻松实现Word文档自动化生成与图片尺寸控制
python·自动化·word