详解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.mzph.cn/bicheng/73818.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高频SQL 50 题(持续更新)

SQL的编写与运用 0. 写在前面 最近学习了数据库系统概论,其中涉及到了关于SQL语句的编写,感觉理论知识不足以让我掌握相关的编写方式,因此选择刷力扣上的题目进行复习巩固。 时间不是很多,可能不会经常更新,有时间写…

【Python】12、函数-02

文章目录 1. 返回值2.文档字符串3. 作用域4. 命名空间 1. 返回值 返回值就是函数执行以后返回的结果,可以通过return来指定函数的返回值。返回值可以通过变量接收返回值 return 后可以返回任意的对象,甚至是一个函数如果仅写一个return或者不写return&…

Unity插件-适用于画面传输的FMETP STREAM使用方法(三)基础使用

目录 一、插件介绍 二、组件介绍 三、Game View Streaming 1、使用 FM Network UDP 的基本设置 Server Scene Client Scene 2、使用使用 FM WebSocket 的基本设置 四、Audio Streaming 五、Microphone Streaming 一、插件介绍 ​​​​​​Unity插件-适用于画面传输的…

如何为预训练模型进行领域适配:全参数微调、LoRA 还是 Prompt Tuning?

目录 如何为预训练模型进行领域适配:全参数微调、LoRA 还是 Prompt Tuning? 1. 全参数微调(Full Fine-tuning) 适用场景 优缺点 示例代码(使用 Hugging Face Transformers 进行全参数微调) 2. LoRA&am…

C++ —— 线程同步(互斥锁)

C —— 线程同步(互斥锁) 线程同步互斥锁(互斥量)测试代码mutex互斥锁 线程同步 线程同步:多线程协同工作,协商如何使用共享资源。 C11线程同步包含三部分内容: 互斥锁(互斥量&…

UI设计中的加载动画:优化用户体验的细节

hello宝子们...我们是艾斯视觉擅长ui设计和前端数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 在数字产品泛滥的今天,用户对体验的要求早已超越功能本身。一个看似简单的加载动画&…

SpringBoot3+Vue3实战(Vue3快速开发登录注册页面并对接后端接口)(4)

目录 一、SpringBoot3Vue3实现基本增删改查。前后端通信交互、配置后端跨域请求。数据批量删除。(博客链接) 二、SpringBoot3Vue3快速开发登录、注册页面并实现对接。 &#xff08;1&#xff09;操作数据表employee(员工信息表)。 <1>修改employee表的字段组成。 <2&g…

Python标准库中bisect模块的bisect_right()函数在网格交易中的应用

本文将深入探讨Python标准库中bisect模块的bisect_right()函数在网格交易中的具体应用。 bisect模块 bisect模块是Python标准库中的一个模块&#xff0c;提供了对有序列表的插入和搜索操作的支持。它基于二分查找算法&#xff0c;可以高效地在有序列表中查找或插入元素&#x…

Excel(函数篇):IF函数、FREQUNCY函数、截取函数、文本处理函数、日期函数、常用函数详解

目录 IF函数等于判断区间判断与AND函数、OR函数一同使用IFNA函数和IFERROR函数 FREQUNCY函数、分断统计LEFT、RIGHT、MID截取函数FIND函数、LEN函数SUBSTITUTE函数ASC函数、WIDECHAR函数实战&#xff1a;如何获取到表中所有工作簿名称文本处理函数TEXT函数TEXTJOIN函数 日期函数…

生成PDF文件:从html2canvas和jsPdf渲染到Puppeteer矢量图

刚刚实现而已&#xff1a;第一次明白&#xff0c;双击或file:///打开html文件&#xff0c;居然和从localhost:3000打开同一个html文件有本质的区别。 字体居然还能以Base64代码嵌入到网页&#xff0c;只是太大太笨。 需要安装node.js&#xff0c;npm安装更多依赖&#xff1a;…

Git 分支删除操作指南(含本地与远程)

&#x1f680; Git 分支删除操作指南&#xff08;含本地与远程&#xff09; 在多人协作的开发过程中&#xff0c;定期清理已合并的临时分支&#xff08;如 feature/*、bugfix/*、hotfix/* 等&#xff09;可以保持仓库整洁&#xff0c;避免混乱。 &#x1f4cc; 分支命名规范回…

Qt中打开windows的cmd窗口并显示

在windows上&#xff0c;用Qt的GUI程序打开另一个程序&#xff0c;使用QProcess即可&#xff0c;并且被打开的程序通常也会显示出来&#xff0c;但是如果想要打开dos窗口并显示&#xff0c;并执行其中的命令或者批处理&#xff0c;则需要使用QProcess提供的windows特有的函数QP…

Modbus TCP到RTU:轻松转换指南!

Modbus TCP 到 RTU&#xff1a;轻松转换指南&#xff01; 在现代工业自动化领域&#xff0c;Modbus TCP和Modbus RTU两种通信协议因其高效、稳定的特点被广泛应用。然而&#xff0c;随着技术的发展和设备升级的需求&#xff0c;经常会遇到需要将这两种协议进行互相转换的场景。…

微信小程序订阅消息发送消息,点击消息进入小程序页面

1、在小程序官网订阅消息选用或创建消息模板获取模板ID可多个 如图&#xff1a; 2、微信小程序前端页面发送请求订阅权限 请求模板id的权限可以是一个可以是多个&#xff0c;用户同意订阅&#xff0c;获取code传递给后端——后端拿到code生成唯一的openid用于发送订阅消息 注…

卷积神经网络 - 卷积层

卷积神经网络一般由卷积层、汇聚层和全连接层构成&#xff0c;本文我们来学习卷积层。 卷积层&#xff08;Convolutional Layer&#xff09;是卷积神经网络&#xff08;CNN&#xff09;的核心组件&#xff0c;专门用于处理具有网格结构的数据&#xff08;如图像、音频、时间序…

Vue3全局化配置(ConfigProvider)

效果如下图&#xff1a; 在线预览 APIs ConfigProvider 参数说明类型默认值theme主题对象Theme{}abstractboolean是否不存在 DOM 包裹元素truetagstringConfigProvider 被渲染成的元素&#xff0c;abstract 为 true 时有效‘div’ Theme Type 名称说明类型默认值common?全…

LabVIEW烟气速度场实时监测

本项目针对燃煤电站烟气流速实时监测需求&#xff0c;探讨了静电传感器结构与速度场超分辨率重建方法&#xff0c;结合LabVIEW多板卡同步采集与实时处理技术&#xff0c;开发出一个高效的烟气速度场实时监测系统。该系统能够在高温、高尘的复杂工况下稳定运行&#xff0c;提供高…

若依excel工具类导出excel模板数据带下拉映射

导出模板代码&#xff0c;原理是combo属性 传递一个数组 里面是label下拉数组。 Overridepublic void downloadTemplate(HttpServletResponse response) {ExcelUtil<ThMachineryManageExcel> util new ExcelUtil<>(ThMachineryManageExcel.class);List<SysDist…

3.8 Spring Boot监控:Actuator+Prometheus+Grafana可视化

在Spring Boot应用中&#xff0c;通过整合Actuator、Prometheus和Grafana可以构建完整的监控体系&#xff0c;实现指标采集、存储和可视化。以下是具体实现步骤&#xff1a; 一、Spring Boot Actuator 配置 作用&#xff1a;暴露应用健康指标、性能数据等监控端点。 1. 添加依…

启幕数据结构算法雅航新章,穿梭C++梦幻领域的探索之旅——二叉树序列构造探秘——堆的奥义与实现诗篇

人无完人&#xff0c;持之以恒&#xff0c;方能见真我&#xff01;&#xff01;&#xff01; 共同进步&#xff01;&#xff01; 文章目录 一、堆的定义与结构二、堆的实现1.堆的初始化和销毁堆的初始化堆的销毁 2.向上调整算法和入堆向上调整算法入堆 3.向下调整算法和出堆顶数…