【scipy 基础】--积分和微分方程
对于手工计算来说,积分计算是非常困难的,对于一些简单的函数,我们可以直接通过已知的积分公式来求解,但在更多的情况下,原函数并没有简单的表达式,因此确定积分的反函数变得非常困难。
另外,相对于微分运算来说,积分运算则具有更多的多样性,包括不同的积分方法(如换元积分法、分部积分法等)和积分技巧,需要根据具体的函数形式选择合适的方法,这增加了积分运算的复杂性。
而微分运算有一条基本的规则,即导数运算具有线性性质,可以通过求导法则来简化计算。
Scipy库的积分子模块为我们提供了便捷的积分和微分方程计算接口。
利用Scipy,进行数学或科学研究时,可以把更多的时间花在原理和推导上,计算过程交由Scipy去处理。
1. 主要功能
Scipy的积分模块主要用于进行数学方程的求解和过程控制。
该模块提供了一组函数,可以用于求解一元和多元函数的导数、积分、二阶导数和偏导数等。
此外,该模块还提供了一些用于过程控制和优化的函数。
此模块的函数主要分为以下几类:
- 针对函数对象的积分
- 针对固定样本的积分
- 常微分方程
总之,scipy.integrate模块提供了丰富的函数和算法,用于解决各种数学问题和过程控制问题。
下面通过一些示例来了解其使用方法。
2. 积分运算
2.1. 一重积分
比如计算曲线 \(y = e^{-x}\)在 \(-0.75 \leqslant x \leqslant 0.5\)范围内的面积。
也就是计算积分:\(\int_{-0.75}^{0.5}e^{-x}dx\)
from scipy.integrate import quad
y = lambda x: np.exp(-x)
integral, integral_err = quad(y, -0.75, 0.5)
print("面积为:{}".format(integral))
# 运行结果
面积为:1.5104693569000414
2.2. 二重积分
所谓二重积分,就是积分变量有两个,依次在两个变量上积分得出最终的结果。
比如,对于函数:\(z = x^2 + y^2\),相当于如下的三维曲面。
计算上面的曲面在 \(-2 \leqslant x \leqslant 2\)且 \(-1 \leqslant y \leqslant 1\)情况下,与XY平面所包围的体积。
即:\(\int_{-2}^2\int_{-1}^1(x^2+y^2)dydx\)
from scipy.integrate import dblquad
integrand = lambda y, x: x**2 + y**2
integral, integral_error = dblquad(integrand, -2, 2, -1, 1)
print("体积为:{}".format(integral))
# 运行结果
体积为:13.333333333333334
这个示例中的曲面在X平面和Y平面上是对称的,计算二重积分时,先积分x,还是先积分y,结果是一样的。
也就是:\(\int_{-2}^2\int_{-1}^1(x^2+y^2)dydx = \int_{-2}^2\int_{-1}^1(x^2+y^2)dxdy\)
其他的曲面不一定是对称的,所以二重积分时一定要注意积分的顺序。
3. 常微分方程求解
常微分方程是一类以未知函数和其导数为主要研究对象的数学方程,适合描述不断变化的场景。
3.1. 一元常微分方程
比如计算物体速度的时候,如果加速度恒定,根据牛顿运动定律,很容易就能计算出速度和时间的关系。
但是若加速度也会不断变化的话,如何确定速度和时间的关系呢?
比如假设加速度随速度和时间变化的关系是: \(a = v+3t\)
因为加速度也可以表示为:\(a = \frac{dv}{dt}\),也就是速度对时间的微分,即:\(a = v'\)。
这样,就得到:\(a = \frac{dv}{dt} = v' = v+3t\),其中,\(v' = v+3t\)就是一个常微分方程。
假设时间t为0时,速度v也为0,则得到:\(v'-v-3t=0, v(0)=0\)
下面利用Scipy来求解这个一元常微分方程。
from scipy.integrate import odeint
# v是速度,t是时间
def dvdt(v, t):
return v + 3*t
v0 = 0
t = np.linspace(0, 1, 100)
# 结果res是 N行1列的二维数组(因为是一元方程)
res = odeint(dvdt, v0, t)
# 转置之后第一行就是各个时间点的速度
res_v = res.T[0]
# 绘制速度和时间的关系
plt.plot(t, res_v)
plt.show()

图中曲线的斜率就是加速度,可以看出加速度是随时间不断变大的。
3.2. 二元常微分方程组
对于二元常微分方程组,同样也可以用 scipy 来求解。
比如如下方程组:
\(\begin{align*}
& y_1' = y_1 + y_2^2 - 5x \quad & y_1(0)=0\\
& y_2' = 2y_1 + y_2^3 + sin(x) \quad & y_2(0)=0
\end{align*}\)
求解方法:
from scipy.integrate import odeint
# 创建方程组
def dSdx(S, x):
y1, y2 = S
return [
y1 + y2**2 - 5 * x,
2 * y1 + y2**3 + np.sin(x),
]
# 方程组初始值
y1_0 = 0
y2_0 = 0
S_0 = (y1_0, y2_0)
x = np.linspace(0, 1, 100)
sol = odeint(dSdx, S_0, x)
y1_sol = sol.T[0]
y2_sol = sol.T[1]
# 分别绘制y1,y2和x的关系
plt.plot(x, y1_sol, label="y1")
plt.plot(x, y2_sol, label="y2")
plt.legend()
plt.show()

4. 总结
积分和常微分方程算是应用非常广,但手工计算非常麻烦的两种数学工具,
在学校学习高等数学的时候应该没少吃过这两种计算的苦。
有了Scipy的帮助,则可以摆脱这类复杂计算带来的痛苦,让我们可以专注于创建解决问题的方程。
【scipy 基础】--积分和微分方程的更多相关文章
- SciPy 基础功能
章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...
- scipy应用积分操作
1.什么是scipy? SciPy是一款方便.易于使用.专为科学和工程设计的Python工具包.它包括统计,优化,整合,线性代数模块,傅里叶变换,信号和图像处理,常微分方程求解器等等. integra ...
- SciPy 积分
章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...
- 1 python大数据挖掘系列之基础知识入门
preface Python在大数据行业非常火爆近两年,as a pythonic,所以也得涉足下大数据分析,下面就聊聊它们. Python数据分析与挖掘技术概述 所谓数据分析,即对已知的数据进行分析 ...
- python大数据挖掘系列之基础知识入门
preface Python在大数据行业非常火爆近两年,as a pythonic,所以也得涉足下大数据分析,下面就聊聊它们. Python数据分析与挖掘技术概述 所谓数据分析,即对已知的数据进行分析 ...
- Python小白的数学建模课-09 微分方程模型
小白往往听到微分方程就觉得害怕,其实数学建模中的微分方程模型不仅没那么复杂,而且很容易写出高水平的数模论文. 本文介绍微分方程模型的建模与求解,通过常微分方程.常微分方程组.高阶常微分方程 3个案例手 ...
- Python教程:进击机器学习(五)--Scipy《转》
Scipy简介 文件输入和输出scipyio 线性代数操作scipylinalg 快速傅里叶变换scipyfftpack 优化器scipyoptimize 统计工具scipystats Scipy简介 ...
- SciPy 信号处理
章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...
- SciPy 统计
章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...
- SciPy 线性代数
章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...
随机推荐
- Maven配置私有仓库
前言 当公司或个人具有自己独有的jar时,不想公开,一般就会放在自己的私有Maven仓库中,在项目中需要引用,此时就需要将公司私有仓库配置到maven当中,一般我们的maven配置的都是aliyu ...
- salesforce零基础学习(一百二十九)Lead Convertion 有趣的经历
本篇参考:https://help.salesforce.com/s/articleView?id=000382564&type=1 Lead Convertion 是salesforce中s ...
- Cilium 系列-7-Cilium 的 NodePort 实现从 SNAT 改为 DSR
系列文章 Cilium 系列文章 前言 将 Kubernetes 的 CNI 从其他组件切换为 Cilium, 已经可以有效地提升网络的性能.但是通过对 Cilium 不同模式的切换/功能的启用,可以 ...
- error: failed to push some refs to 'https://gitee.com/xxxxxxxxx/xxxxxxxt'
原因是ReadMe文件不在本地中, 此时我们要执行git pull --rebase origin master命令README.md拉到本地, 任何然后执行git push origin maste ...
- Linux中对管道命令中的任意子命令进行返回码校验
~~ linux return code with pipeline~~ ~~ linux 管道命令中的返回码~~ BASH SHELL中,通常使用 $? 来获取上一条命令的返回码. Shell Sc ...
- 2023NepCTF-RE部分题解
2023NepCTF-RE部分题解 九龙拉棺 过反调试 很容易发现 void __stdcall sub_401700() 里面有tea的痕迹 接出来发现只是前半部分 #include <std ...
- 表格JS实现在线Excel的附件上传与下载
摘要:本文由葡萄城技术团队于博客园原创并首发.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 前言 在本地使用Excel时,经常会有需要在Excel中添加一 ...
- C#程序配置读写例子 - 开源研究系列文章
今天讲讲关于C#的配置文件读写的例子. 对于应用程序的配置文件,以前都是用的ini文件进行读写的,这个与现在的json类似,都是键值对应的,这次介绍的是基于XML的序列化和反序列化的读写例子.对于in ...
- Docker下elasticsearch8部署、扩容、基本操作实战(含kibana)
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本篇记录了用docker搭建ElasticS ...
- TCP 粘包
TCP(Transmission Control Protocol,传输控制协议)是一种传输层协议. TCP提供了以下主要功能: 可靠性:TCP使用确认.重传和校验等机制来确保数据的可靠传输.它能够检 ...