Sympy入门之微积分基本运算

news2025/3/22 15:54:20

 

        Sympy是一个专注于符号数学计算的数学工具,使得用户可以轻松地进行复杂的符号运算,如求解方程、求导数、积分、级数展开、矩阵运算等。本文,我们将详细讲解Sympy在微积分运算中的应用。

获取方式

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

 注:本文所使用python环境为jupyter notebook,所有代码只有在jupyter ipynb环境中才可以正确输出

基本四则运算

        对于基本四则运算而言,我们只需要在定义变量后,使用python中的四则运算符对变量进行组合即可实现。

import sympy as sp
x,y=sp.symbols('x y')
expressions1=x+y**2
expressions2=sp.sqrt(x)+sp.sqrt(y)
#doit()方法用来将值带入后尽可能的保留原式(当表达式中含有根式,超越数(π,e),以及未赋值的变量时)
#evalf()方法用来将值带入计算
result1=sp.Subs(expressions1,(x,y),(sp.pi,sp.E)).doit()#π+e^2
result2=sp.Subs(expressions2,(x,y),(2,y)).doit()#只将x带入,y保留
result3=sp.Subs(expressions1,(x,y),(1,5)).evalf()#计算1^2+5^2
display(result1)
display(result2)
display(result3)

结果:

说明

         在许多运算中Sympy都提供了以该运算英文名称为名的一个类与函数,这个类主要用来表示未计算的运算表达式,函数则用来计算值该运算结果下的值。

极限运算 

       在极限运算中,sympy提供了一个名为 sp.limit()函数可以用来直接求解函数极限。

sp.limit()函数参数详解:

e极限表达式,使用定义过的变量书写
z极限自变量
z0极限自变量趋于的值
dir左极限还是右极限,使用'+',和'-'表示
#极限求解sp.limit()与sp.Limit()
import sympy as sp
'''
sp.limit()函数参数详解:
e:极限表达式,使用定义过的变量和sp.函数名来书写
z:极限自变量
z0:极限自变量趋于的值
dir:左极限还是右极限,用'+','-'表示
'''

'''
sp.Limit()类参数详解:
sp.Limit()类的参数与sp.limit()函数完全一致
二者唯一区别就是一个用来计算结果,一个用来返回表达式
'''

#定义x与y这两个符号变量
x=sp.Symbol('x')
y=sp.Symbol('y')
#极限表达式
expression=(sp.cos(sp.sin(x))-(sp.cos(x)))/(x**4)
result1=sp.limit(e=expression,z=x,z0=0)#result1为极限结果1/6
result2=sp.Limit(e=expression,z=x,z0=0)#result2为极限表示
latex_result1=sp.latex(result1)#转为latex
latex_result2=sp.latex(result2)#转为latex
#使用字符串形式的latex表达式与结果的latex格式字符串连接
#使用jupyter notebook内置的Math与display函数将latex表达式渲染后显示
display(Math(latex_result2))
display(Math(r'\lim_{x\to0}\frac{\cos(sinx)-\cos(x)}{x^4}='+latex_result1))

结果: 

         当然,对于sp.Limit()类表示的对象,若我们需要求解其极限值,那么只需在其表示的对象后边加一个.doits()方法即可,

微分运算

        在sympy中,sp.diff()函数可以用来求解函数的微分,sp.Derivative()类则主要用来表示未计算的微分表达式(当然,我们也可以通过doit()方法进行求解)。

sp.diff()函数与sp.Derivative()类使用方法:

  •  sp.diff(fx,(x,n))函数表示对函数表达式fx关于x求n阶导数的表达式。
  •  sp.Derivative(fx,(x,n))类则只是表示该函数的微分表达式表示出来。
  • 要想使用sp.Derivative()实现与sp.diff()一样的效果,只需在该对象后多加一个.doit()方法即可。如下方代码中的diff_result2。
#sp.diff(),sp.Derivative()函数微分求解
import sympy as sp
'''
sp.diff()函数使用方法:
sp.diff(fx,(x,n))表示对函数表达式fx关于x求n阶导数,返回值为微分结果
sp.Derivative()类使用方法:
sp.Derivative(fx,(x,n))表示对函数表达式fx关于x求n阶导数,返回值为微分表达式
'''
#定义x与y这两个符号变量
x,y=sp.symbols('x y')
#极限表达式
fx=sp.ln(1+x)
fxy=sp.ln(x+y)
#保留ln(1+x)5阶导数的表达式
diff_result1=sp.Derivative(fx,x,5)
#计算ln(1+x)关于x的5阶导数并使用doit()方法将Derivative的表达式进行求解
diff_result2=sp.Derivative(fx,x,5).doit()
#计算ln(x+y)关于x的5阶偏导数
diff_result3=sp.diff(fxy,(x,5))
latex_result1=sp.latex(diff_result1)#转为latex
latex_result2=sp.latex(diff_result2)#转为latex
latex_result3=sp.latex(diff_result3)#转为latex
#使用字符串形式的latex表达式与结果的latex格式字符串连接
#使用jupyter notebook内置的Math与display函数将latex表达式渲染后显示
display(Math(latex_result1))
display(Math(r'\frac{d^5ln(1+x)}{dx}='+latex_result2))
display(Math(r'\frac{\partial^5 ln(x+y)}{\partial x}='+latex_result2))

结果: 

        特别地,当我们想要求解上述导数在某一点处的值,那么只需要对上边的每个result使用subs()方法,将变量替换为数值即可

这里要注意的是,对于sp.Derivative()对象直接使用subs()方法得到的结果是这个:

        正如我们前边所说,这就是个表达式....

        因此,要想使用sp.Derivative()求解在某一点处的导数值,我们可以先试用doit()运算求解出导数表达式后再使用subs()方法将值带入,即:

      对于使用sp.diff()函数的对象而言,我们使用subs()方法后,返回值是n阶导数在该点处的导数值:

 当我们带入微分结果的点是不可导点时,比如\frac{sinx}{x}在x=0处的导数不存在,那么返回值为NaN

泰勒展开(泰勒级数)

       当我们想要获得某个函数在某点处的泰勒展开式时,使用sp.series()便可以快速实现这一过程。

sp.series()函数参数详解:

expr函数表达式
x待展开的函数中的自变量
x0展开点,通常是0,即麦克劳林级数
n阶数
#sp.series()泰勒级数
import sympy as sp
'''
sp.series()函数参数详解:
expr:函数表达式
x:待展开的函数中的自变量
x0:展开点,通常是0,即麦克劳林级数
n:阶数
'''
x=sp.symbols('x')
function=sp.sin(x)
Talyorseries1=sp.series(expr=function,x=x,x0=0,n=4)
Talyorseries2=sp.series(expr=function,x=x,x0=2,n=4)
display(Talyorseries1)
display(Talyorseries2)

结果: 

积分运算

       积分运算包括定积分与不定积分。对于这两种运算,我们都可以使用sp.integrate()函数与sp.Integral()类来进行求解。

sp.integrate()函数用法详解:

  • sp.integrate(fx,x)计算fx关于x的不定积分
  • sp.inegrate(fx,(x,a,b))计算fx在a,b上的定积分
  • sp.integrate(fxy,(x,a,b),(y,c,d))计算xy在abcd区域的二重积分
  • 三重积分同理,按照顺序将变量和积分上下限按照元祖的形式传入即可
#sp.integrate,sp. Integral求解积分与不定积分                                                                        
import sympy as sp
'''
sp.integrate()函数详解:
sp.integrate(fx,x)计算fx关于x的不定积分
sp.inegrate(fx,(x,a,b))计算fx在a,b上的定积分
sp.integrate(fxy,(x,a,b),(y,c,d))计算xy在abcd区域的二重积分
三重积分同理,按照顺序将变量和积分上下限按照元祖的形式传入即可

控制参数详解:

meijerg:bool类型 如果设置为True则使用meijjergG函数计算积分

conds:控制分段积分条件的显示方式。
'none': 不显示条件。
'separate': 单独显示条件。
'piecewise': 将条件合并到分段函数中。

risch:bool类型 如果设置为True则使用risch方法计算积分。

heurisch:bool类型 如果设置为True,则使用启发式算法计算积分。

manual:bool类型 如果设置为True,则手动计算积分(避免自动简化)。

sp.Integral()类使用方法:
传图
'''
x=sp.symbols('x')#积分变量x
a=sp.symbols('a')#未知参数a
result1=sp.integrate(sp.exp(a*x),x,conds='piecewise')#计算不定积分结果
result2=sp.Integral(sp.exp(a*x),x)#只是返回表达式
result3=sp.integrate(sp.exp(a*x),(x,1,2), conds='piecewise')#计算定积分结果sp.integrate()
result4=sp.Integral(sp.exp(a*x),(x,1,2)).doit()#计算定积分结果 sp.Integral().doit()
display(result1)
display(result2)
display(result3)
display(result4)

结果:

      这里需要注意的是,sympy在求解一些不定积分或定积分时,只能用于求解一下难度较低的积分,

技巧性稍多,难度稍大一点或者无法求解的积分将返回该积分表达式。

比如:\int_{0}^{1}\frac{ln(1+x)}{1+x^2}dx

        这是一个较为经典的区间再现积分,但是使用sp.integrate()函数却无法计算

       

          这里,我手动给出计算过程: 

       解:令原式=I,x=tant,三角换元后,I=\int_{0}^{\frac{\pi}{4}}ln(1+tant)dt

        令u=\frac{\pi}{4}-t,dt=-dut\in(0,\frac{\pi}{4}),u\in(\frac{\pi}{4},0)

        换元后I=\int_{0}^{\frac{\pi}{4}}ln(1+tan(u))du

        定积分结果与被积变量无关,那么便有:

        2I=\int_{0}^{\frac{\pi}{4}}ln(1+tant)+ln(1+tan(\frac{\pi}{4}-t))dt

        2I=\int_{0}^{\frac{\pi}{4}}ln2dt 

        I=\frac{\pi ln2}{8}

总结

          以上便是Sympy入门之微积分运算的一些基本操作,接下来我们还将介绍Sympy在其他类型运算中的一些应用。敬请期待!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2319653.html

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

相关文章

Qemu-STM32(十):STM32F103开篇

简介 本系列博客主要描述了STM32F103的qemu模拟器实现,进行该项目的原因有两点: 作者在高铁上,想在STM32F103上验证一个软件框架时,如果此时掏出开发板,然后接一堆的线,旁边的人估计会投来异样的目光,特别…

在 ABAP 开发工具 (ADT-ABAP Development Tools) 中创建ABAP 项目

第一步:安装 SAP NetWeaver 的 ABAP 开发工具 (ADT) 开发工具下载地址:https://tools.hana.ondemand.com/#abap 也可以在SAP Development Tools下载工具页面直接跳转到对应公开课教程页面,按课程步骤下载eclipse解压安装即可,过程…

【架构】单体架构 vs 微服务架构:如何选择最适合你的技术方案?

文章目录 ⭐前言⭐一、架构设计的本质差异🌟1、代码与数据结构的对比🌟2、技术栈的灵活性 ⭐二、开发与维护的成本博弈🌟1、开发效率的阶段性差异🌟2、维护成本的隐形陷阱 ⭐三、部署与扩展的实战策略🌟1、部署模式的本…

【鸿蒙开发】Hi3861学习笔记- WIFI应用AP建立网络

00. 目录 文章目录 00. 目录01. LwIP简介02. AP模式简介03. API描述3.1 RegisterWifiEvent3.2 UnRegisterWifiEvent3.3 GetStationList3.4 GetSignalLevel3.5 EnableHotspot3.6 DisableHotspot3.7 SetHotspotConfig3.8 GetHotspotConfig3.9 IsHotspotActive 04. 硬件设计05. 模…

大模型的微调技术(高效微调原理篇)

背景 公司有需求做农业方向的大模型应用以及Agent助手,那么适配农业数据就非常重要。但众所周知,大模型的全量微调对算力资源要求巨大,在现实的限制条件下基本“玩不起”,那么高效微调技术就非常必要。为了更好地对微调技术选型和…

区间震荡指标

区间震荡指标的逻辑如下: 一、函数注解 1. Summation函数 功能: 计算给定价格序列Price的前Length个数据点的和,或在数据点数量超过Length时,计算滚动窗口内的价格和。 参数: Price(1):价格序列&#…

HCIE-SLAAC

文章目录 SLAAC 🏡作者主页:点击! 🤖Datacom专栏:点击! ⏰️创作时间:2025年03月21日10点58分 SLAAC 帮助设备发现本地直连链路相连的设备,并获取与地址自动配置的相关前缀和其他…

JavaScript | 爬虫逆向 | 掌握基础 | 01

一、摘要 实践是最好的导师 二、环境配置 在开始之前,需要确保你的计算机上已经安装了 Node.js。Node.js 是一个开源的、跨平台的 JavaScript 运行时环境,它允许你在服务器端运行 JavaScript 代码。 1. 下载 安装地址:https://nodejs.org…

力扣算法Hot100——128. 最长连续序列

题目要求时间复杂度为O(n),因此不能使用两次循环匹配。 首先使用 HashSet 去重,并且 HashSet 查找一个数的复杂度为O(1)外循环还是遍历set集合,里面一重循环需要添加判断,这样才不会达到O( n 2 n^2 n2)判断是否进入最长序列查找循…

深入解析 Java Stream API:从 List 到 Map 的优雅转换!!!

🚀 深入解析 Java Stream API:从 List 到 Map 的优雅转换 🔧 大家好!👋 今天我们来聊聊 Java 8 中一个非常常见的操作:使用 Stream API 将 List 转换为 Map。🎉 具体来说,我们将深入…

当全球化成为商业常态,Shopify 如何为品牌生意铺平出海之路?

从独立站搭建到支付履约,从数据分析到生态整合,Shopify 为不同规模的企业提供可扩展的解决方案。 在数字化浪潮的推动下,跨境电商与品牌出海的黄金时代已然到来。然而,看似广阔的市场蓝海背后,是无数企业正在经历的“成…

RC6在线加密工具

RC6加密算法是一种基于RC5改进的分组密码算法,曾作为AES(高级加密标准)的候选算法之一。它采用了4个32位寄存器,增加了32位整数乘法运算,以增强扩散和混淆特性,提高了安全性。RC6的设计简单、高效&#xff…

python每日十题(5)

保留字,也称关键字,是指被编程语言内部定义并保留使用的标识符。Python 3.x版本中有35个保留字,分别为:and, as,assert,async,await,break,class,continue,def,del,elif,else, except, False, finally,for,from,global, if,import…

应用案例 | 核能工业:M-PM助力核工业科研项目

M-PM助力核工业科研项目 一、项目背景 在核工业复杂系统的研发进程中,MBSE(基于模型的系统工程)方法的应用愈发成熟,已然成为推动系统设计与优化的关键力量。如今,各相关设计系统的 MBSE 模型数据呈现出精细化、多元…

4.1、网络安全模型

目录 网络安全体系概述网络安全模型-BLP模型网络安全模型-Biba模型网络安全模型 - 信息流模型信息保障模型能力成熟度模型其它安全模型网络安全原则 网络安全体系概述 网络安全体系是网络安全保证系统的最高层概念抽象,是一个体系,体系一般是一个概念&a…

ManiWAV:通过野外的音频-视频数据学习机器人操作

24年6月来自斯坦福大学、哥伦比亚大学和 TRI 的论文“ManiWAV: Learning Robot Manipulation from In-the-Wild Audio-Visual Data”。 音频信号通过接触为机器人交互和物体属性提供丰富的信息。这些信息可以简化接触丰富的机器人操作技能学习,尤其是当视觉信息本身…

Floyd 算法——97. 小明逛公园

卡码网:97. 小明逛公园https://kamacoder.com/problempage.php?pid=1155 题目描述 小明喜欢去公园散步,公园内布置了许多的景点,相互之间通过小路连接,小明希望在观看景点的同时,能够节省体力,走最短的路径。 给定一个公园景点图,图中有 N 个景点(编号为 1 到 N),…

QT二 QT使用generate form 生成常用UI,各种UI控件

一 。没有使用general form 和 使用 general form 后,file层面和代码层面的不同比较 file层面的不同 代码层面的不同, 在 使用了general form之后,在主界面的构造方法中,使用ui->setupUi(this),就完成了所有UI的处理。 而之…

多条件排序(C# and Lua)

C# 升序排序 OrderBy 按升序对序列的元素进行排序 ThenBy 按升序对序列中的元素执行后续排序 降序排序 OrderByDescending 按降序对序列的元素排序 ThenByDescending 按降序对序列中的元素执行后续排序 public class Fruit {public int id;public string name;publi…

人工智能之数学基础:线性方程组求解的得力助手——增广矩阵

本文重点 增广矩阵是一个极具实用价值的工具,尤其在处理线性方程组时,它展现了卓越的功效。通过整合系数和常数项,增广矩阵简化了计算过程并提供了判断方程组解集的有效方法。 增广矩阵的起源与定义 增广矩阵的概念源于线性方程组求解的需求。在解决线性方程组时,我们常…