对于手工计算来说,积分计算是非常困难的,对于一些简单的函数,我们可以直接通过已知的积分公式来求解,但在更多的情况下,原函数并没有简单的表达式,因此确定积分的反函数变得非常困难。

另外,相对于微分运算来说,积分运算则具有更多的多样性,包括不同的积分方法(如换元积分法、分部积分法等)和积分技巧,需要根据具体的函数形式选择合适的方法,这增加了积分运算的复杂性。
而微分运算有一条基本的规则,即导数运算具有线性性质,可以通过求导法则来简化计算。

Scipy库的积分子模块为我们提供了便捷的积分和微分方程计算接口。
利用Scipy,进行数学或科学研究时,可以把更多的时间花在原理和推导上,计算过程交由Scipy去处理。

1. 主要功能

Scipy的积分模块主要用于进行数学方程的求解和过程控制。
该模块提供了一组函数,可以用于求解一元和多元函数的导数、积分、二阶导数和偏导数等。
此外,该模块还提供了一些用于过程控制和优化的函数。

此模块的函数主要分为以下几类:

  1. 针对函数对象的积分
  2. 针对固定样本的积分
  3. 常微分方程

总之,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\)就是一个常微分方程
假设时间t0时,速度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 基础】--积分和微分方程的更多相关文章

  1. SciPy 基础功能

    章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...

  2. scipy应用积分操作

    1.什么是scipy? SciPy是一款方便.易于使用.专为科学和工程设计的Python工具包.它包括统计,优化,整合,线性代数模块,傅里叶变换,信号和图像处理,常微分方程求解器等等. integra ...

  3. SciPy 积分

    章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...

  4. 1 python大数据挖掘系列之基础知识入门

    preface Python在大数据行业非常火爆近两年,as a pythonic,所以也得涉足下大数据分析,下面就聊聊它们. Python数据分析与挖掘技术概述 所谓数据分析,即对已知的数据进行分析 ...

  5. python大数据挖掘系列之基础知识入门

    preface Python在大数据行业非常火爆近两年,as a pythonic,所以也得涉足下大数据分析,下面就聊聊它们. Python数据分析与挖掘技术概述 所谓数据分析,即对已知的数据进行分析 ...

  6. Python小白的数学建模课-09 微分方程模型

    小白往往听到微分方程就觉得害怕,其实数学建模中的微分方程模型不仅没那么复杂,而且很容易写出高水平的数模论文. 本文介绍微分方程模型的建模与求解,通过常微分方程.常微分方程组.高阶常微分方程 3个案例手 ...

  7. Python教程:进击机器学习(五)--Scipy《转》

    Scipy简介 文件输入和输出scipyio 线性代数操作scipylinalg 快速傅里叶变换scipyfftpack 优化器scipyoptimize 统计工具scipystats Scipy简介 ...

  8. SciPy 信号处理

    章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...

  9. SciPy 统计

    章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...

  10. SciPy 线性代数

    章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...

随机推荐

  1. Maven配置私有仓库

    前言   当公司或个人具有自己独有的jar时,不想公开,一般就会放在自己的私有Maven仓库中,在项目中需要引用,此时就需要将公司私有仓库配置到maven当中,一般我们的maven配置的都是aliyu ...

  2. salesforce零基础学习(一百二十九)Lead Convertion 有趣的经历

    本篇参考:https://help.salesforce.com/s/articleView?id=000382564&type=1 Lead Convertion 是salesforce中s ...

  3. Cilium 系列-7-Cilium 的 NodePort 实现从 SNAT 改为 DSR

    系列文章 Cilium 系列文章 前言 将 Kubernetes 的 CNI 从其他组件切换为 Cilium, 已经可以有效地提升网络的性能.但是通过对 Cilium 不同模式的切换/功能的启用,可以 ...

  4. error: failed to push some refs to 'https://gitee.com/xxxxxxxxx/xxxxxxxt'

    原因是ReadMe文件不在本地中, 此时我们要执行git pull --rebase origin master命令README.md拉到本地, 任何然后执行git push origin maste ...

  5. Linux中对管道命令中的任意子命令进行返回码校验

    ~~ linux return code with pipeline~~ ~~ linux 管道命令中的返回码~~ BASH SHELL中,通常使用 $? 来获取上一条命令的返回码. Shell Sc ...

  6. 2023NepCTF-RE部分题解

    2023NepCTF-RE部分题解 九龙拉棺 过反调试 很容易发现 void __stdcall sub_401700() 里面有tea的痕迹 接出来发现只是前半部分 #include <std ...

  7. 表格JS实现在线Excel的附件上传与下载

    摘要:本文由葡萄城技术团队于博客园原创并首发.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 前言 在本地使用Excel时,经常会有需要在Excel中添加一 ...

  8. C#程序配置读写例子 - 开源研究系列文章

    今天讲讲关于C#的配置文件读写的例子. 对于应用程序的配置文件,以前都是用的ini文件进行读写的,这个与现在的json类似,都是键值对应的,这次介绍的是基于XML的序列化和反序列化的读写例子.对于in ...

  9. Docker下elasticsearch8部署、扩容、基本操作实战(含kibana)

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本篇记录了用docker搭建ElasticS ...

  10. TCP 粘包

    TCP(Transmission Control Protocol,传输控制协议)是一种传输层协议. TCP提供了以下主要功能: 可靠性:TCP使用确认.重传和校验等机制来确保数据的可靠传输.它能够检 ...