当前位置: 首页 > news >正文

详解Sympy:符号计算利器

        

        Sympy是一个专注于符号数学计算的数学工具,使得用户可以轻松地进行复杂的符号运算,如求解方程、求导数、积分、级数展开、矩阵运算等。其中比较流行的深度学习框架pytorch的用到了Sympy,主要用于将模型的计算图转换为符号化表达式,以便进行分析和优化。

获取方式

pip install -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple sympy

模块导入

import sympy as sp
#or
from sympy import *

Sympy符号定义

        符号定义是指将特定字符经过sympy下的symbols函数或Symbol类后变成一个sympy变量,这些变量可以在后续的符号计算中被识别和操作。

定义单个变量

import sympy as sp
#使用Symbol类定义单个变量
x=sp.Symbol('x')
y=sp.Symbol('y')
import sympy as sp
#使用symbols函数定义单个变量
x=sp.symbols('x')
y=sp.symbols('y')

 同时定义多个变量

import sympy as sp
#同时定义三个变量
x,y,z=sp.symbols('x y z')

注意,当同时定义多个变量时,symbols函数内的多个字符之间需要使用逗号或空格分隔开。

批量定义变量

当我们想要使用sympy定义诸如:x1,x2,x3,x4....这样的变量时,我们只需:

import sympy as sp
# 同时定义多个符号变量
variables = sp.symbols('x1:5')  # 定义 x1, x2, ... x4
print(variables)

定义带上下标的变量


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)))

结果 

变量类型参数 

sympy符号变量类型设定
positive=True正数
negative=True负数
imaginary=True虚数
complex=True复数

Sympy初等函数表达式 

当我们需要进行符号运算的表达式中含有一些基本初等函数时,我们需要借助其在sympy下的函数来对其进行表示。

指对函数

指对函数在sympy中的表示
e^x(自然指数函数)sp.exp
lnx(自然对数函数)sp.ln
a^x(指数函数)sp.Pow(a,x)
\log_{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

其他函数 

\sqrt{x}(根号函数)sp.sqrt
|x|(绝对值函数)sp.Abs
u(x)(阶跃函数)sp.Heaviside
sign(x)(符号函数)sp.Sign

        其他类型的函数,诸如幂函数,多项式函数等都可以使用定义过的符号变量,使用python中的运算符进行组合得到。

Sympy表达式化简

因式展开sp.expand()

        sp.expand()函数可以实现将给定的表达式展开, 这里,我们对(x+\frac{1}{y}+\frac{3}{z})^2这个式子展开


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()主要用于将多项式进行因式分解。这里我们以x^3-1为例

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()多用于有理函数分式的因式分解。这里我们以\frac{x^2-1}{x^3-1}为例。

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()

        分式拆分化简是指将分式差分成若干个多项式与分式或分式与分式之和的分式,比如我们最常见的裂项相消的形式\frac{1}{(x+1)x},它可以拆分成两个分式相加的形式。

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()函数用来将多个分式之间(也可以包含多项式)求和的形式和并为同一个分式。这里我们以\frac{1}{x}+\frac{1}{x+1}+x为例。

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()是考虑到了一系列三角函数关系后专门针对三角函数表达式进行化简的函数。

这里我们以\sin(x)+\cos(x)为例。

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()是考虑到了指数函数的性质后专门针对指数函数表达式进行化简的函数。这里我们以2e^xe^{y^2}为例。

#指数函数化简
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() 

        嵌套指数是指形如:(x^a)^b的形式,使用sp.powdenest()后将被化简为x^{ab},当然,直接使用sp.powsimp()函数也可以实现该类型化简。

#嵌套指数化简
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()主要用来合并相加的对数表达式。这里我们以lnx+ln(x^2)为例,注意(必须在定义变量时,指明该变量positive=True)才可以使用该方法合并对数表达式。

#对数函数化简合并
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()主要用来化简根式,特别是对根式进行有理化操作时。这里我们以\frac{1}{\sqrt{1+x}-\sqrt{x}}为例。

#根式化简
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()函数参数

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


http://www.mrgr.cn/news/95102.html

相关文章:

  • MySQL 调优
  • Firebase崩溃:ViewBinding not init!!
  • Quartus + VScode 实现模块化流水灯
  • MySQL 入门大全:查询语言分类
  • 【免费网址/插件】视频和图片数据采集推荐~
  • Python散点图(Scatt Plot):数据探索的“第一张图表”
  • 数仓开发那些事(10)
  • YOLOv11 目标检测
  • 网络编程之客户端通过服务器与另外一个客户端交流
  • springCloud集成tdengine(原生和mapper方式) 其一
  • SpringBoot对接DeepSeek
  • dify+deepseek联网搜索:免费开源搜索引擎Searxng使用(让你的大模型也拥有联网的功能)
  • Python功能完美的宝库——内置的强大“武器库”builtins
  • 春天遇到了冬天的吻
  • 【Java】Mybatis学习笔记
  • 火星探测发展概述2025.3.20
  • 如何判断 MSF 的 Payload 是 Staged 还是 Stageless(含 Meterpreter 与普通 Shell 对比)
  • scrollIntoView 的behavior都有哪些属性
  • STM32HAL库,解决串口UART中断接收到的第一个字节数据丢失
  • 基于springboot的房屋租赁系统(008)