Scipy基础--积分和微分方程

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

另外,相对于微分运算来说,积分运算则具有更多的多样性,包括不同的积分方法(如换元积分法、分部积分法等)和积分技巧,需要根据具体的函数形式选择合适的方法,这增加了积分运算的复杂性。

而微分运算有一条基本的规则,即导数运算具有线性性质,可以通过求导法则来简化计算。

Scipy库的积分 子模块为我们提供了便捷的积分和微分方程计算接口。

利用Scipy,进行数学或科学研究时,可以把更多的时间花在原理和推导上,计算过程交由Scipy去处理。

1. 主要功能

Scipy的积分模块主要用于进行数学方程的求解和过程控制。

该模块提供了一组函数,可以用于求解一元和多元函数的导数、积分、二阶导数和偏导数等。

此外,该模块还提供了一些用于过程控制和优化的函数。

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

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

总之,scipy.integrate模块提供了丰富的函数和算法,用于解决各种数学问题和过程控制问题。

下面通过一些示例来了解其使用方法。

2. 积分运算

2.1. 一重积分

比如计算曲线 y = e − x y = e^{-x} y=e−x在 − 0.75 ⩽ x ⩽ 0.5 -0.75 \leqslant x \leqslant 0.5 −0.75⩽x⩽0.5范围内的面积。

也就是计算积分: ∫ − 0.75 0.5 e − x d x \int_{-0.75}^{0.5}e^{-x}dx ∫−0.750.5e−xdx

python 复制代码
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 z = x^2 + y^2 z=x2+y2,相当于如下的三维曲面 。

计算上面的曲面在 − 2 ⩽ x ⩽ 2 -2 \leqslant x \leqslant 2 −2⩽x⩽2且 − 1 ⩽ y ⩽ 1 -1 \leqslant y \leqslant 1 −1⩽y⩽1情况下,与XY平面所包围的体积。

即: ∫ − 2 2 ∫ − 1 1 ( x 2 + y 2 ) d y d x \int_{-2}^2\int_{-1}^1(x^2+y^2)dydx ∫−22∫−11(x2+y2)dydx

python 复制代码
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,结果是一样的。

也就是: ∫ − 2 2 ∫ − 1 1 ( x 2 + y 2 ) d y d x = ∫ − 2 2 ∫ − 1 1 ( x 2 + y 2 ) d x d y \int_{-2}^2\int_{-1}^1(x^2+y^2)dydx = \int_{-2}^2\int_{-1}^1(x^2+y^2)dxdy ∫−22∫−11(x2+y2)dydx=∫−22∫−11(x2+y2)dxdy

其他的曲面不一定是对称的,所以二重积分时一定要注意积分的顺序。

3. 常微分方程求解

常微分方程是一类以未知函数和其导数为主要研究对象的数学方程,适合描述不断变化的场景。

3.1. 一元常微分方程

比如计算物体速度的时候,如果加速度恒定,根据牛顿运动定律,很容易就能计算出速度 和时间 的关系。

但是若加速度也会不断变化的话,如何确定速度和时间的关系呢?

比如假设加速度 随速度和时间 变化的关系是: a = v + 3 t a = v+3t a=v+3t

因为加速度也可以表示为: a = d v d t a = \frac{dv}{dt} a=dtdv,也就是速度对时间的微分,即: a = v ′ a = v' a=v′。

这样,就得到: a = d v d t = v ′ = v + 3 t a = \frac{dv}{dt} = v' = v+3t a=dtdv=v′=v+3t,其中, v ′ = v + 3 t v' = v+3t v′=v+3t就是一个常微分方程 。

假设时间t 为0时,速度v 也为0,则得到: v ′ − v − 3 t = 0 , v ( 0 ) = 0 v'-v-3t=0, v(0)=0 v′−v−3t=0,v(0)=0

下面利用Scipy来求解这个一元常微分方程。

python 复制代码
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*}

求解方法:

python 复制代码
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的帮助,则可以摆脱这类复杂计算带来的痛苦,让我们可以专注于创建解决问题的方程。

相关推荐
Asa121385 天前
R语言实现多组学因子分析(MOFA)
数据分析
漂着的圆木5 天前
Agent 功能参与度:Copilot 怎么算
sql·数据分析·agent·githubcopilot·度量
2603_965148116 天前
AI+API选品:下一代智能商务助手雏形已现
java·大数据·数据库·人工智能·数据挖掘
成为深度学习高手6 天前
CrossLinear:即插即用的跨相关嵌入,让线性模型也能用好外生变量
人工智能·python·深度学习·数据挖掘
paopaokaka_luck6 天前
智慧社区综合服务小程序(人脸识别、AI问答、Echarts图形化分析)
前端·javascript·spring boot·spring·数据分析·echarts
Aloudata6 天前
语义层和SQL Copilot:一个降低写SQL门槛,一个统一业务逻辑
大数据·人工智能·数据分析·data agent·语义层
IT研究室6 天前
最新大数据毕业设计选题推荐-基于大数据的信用等级数据分析与可视化-大数据-Spark-Hadoop-Bigdata
大数据·信息可视化·数据分析·spark·课程设计
paopaokaka_luck6 天前
考研政治刷题小程序(AI推荐题目、ECharts数据分析、章节练习与专项训练、模拟考试、错题本与收藏夹、学习打卡与目标管理、题库和组卷维护)
前端·javascript·spring boot·spring·数据分析·echarts
是翎6 天前
深度长文|2026产品经理AI实践手册
人工智能·深度学习·学习·自然语言处理·数据挖掘
2601_960620376 天前
2026校招市场策略岗项目准备指南:调研/竞品/活动/竞赛4类项目
数据分析