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

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

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. 树莓派使用Golang+MQ135检测室内空气质量

      MQ135是一个比较便宜的空气质量传感器,可以用在家庭以及工业场所中.树莓派是一个小巧但很强大的卡片电脑,基于Linux,同时提供了很多硬件接口,方便开发出各种电子产品.Golang是一款简单高效 ...

  2. 模拟ArrayList(顺序表)的底层实现

    模拟ArrayLIst的底层实现 package com.tedu.api04.list; import java.util.Objects; /** * @author LIGENSEN * Dat ...

  3. 1.简述Hibernate的工作原理。

    (1).首先,Configuration读取Hibernate的配置文件和映射文件中的信息,即加载配置文件和映射文件,并通过Hibernate配置文件生成一个多线程的SessionFactory对象: ...

  4. LiveCD 与 救援模式、紧急模式

    LiveCD 参考:live CD LiveCD 能够使你在不安装到硬盘的前提下,体验操作系统.大多数 Linux 桌面发行版都提供 LiveCD,这是宣传自己的一种很有效的方式. 救援模式 救援模式 ...

  5. HTML的总结与回顾(思维导图

  6. EF 管理数据库架构

    本章会主要了解EF提供的独立迁移项目,用独立迁移项目自动创建dgml设计关系图和sql脚本. 迁移项目通常也叫(CodeFirst代码优先),在EF中迁移项目是在,在代码中设计数据库,每次对数据库的设 ...

  7. Ubuntu 用户的切换

    1.普通用户转成root su root 输入密码 确认密码(此时root账户已经建立) 2. root 转回 普通用户 su  用户名

  8. SpringBoot 启动流程追踪(第二篇)

    上一篇文章分析了除 refresh 方法外的流程,并着重分析了 load 方法,这篇文章就主要分析 refresh 方法,可以说 refresh 方法是 springboot 启动流程最重要的一环,没 ...

  9. Azure Data Factory(六)数据集类型为Dataverse的Link测试

    一,引言 之前有讲过 Azure Data Factory 的 Copy Data 的操作,演示了将 Blob Storage1 的数据通过 Azure Data Factory 复制到 Blob S ...

  10. Netty源码学习3——Channel ,ChannelHandler,ChannelPipeline

    系列文章目录和关于我 零丶引入 在Netty源码学习2--NioEventLoop的执行中,我们学习了NioEventLoop是如何进行事件循环以及如何修复NIO 空轮询的bug的,但是没有深入了解I ...