📌 目录
scipy.integrate
模块简介- 一维定积分:
quad
函数 - 多重积分:
dblquad
与tplquad
- 积分中的误差与参数说明
- 常微分方程(ODE)求解:
solve_ivp
- 示例:一阶微分方程建模
- 示例:二阶系统模拟(如弹簧振子)
- 出站链接与参考资料
1. scipy.integrate
模块简介
该模块提供了强大的数值积分与微分方程求解能力,适用于:
- 计算函数的积分(单变量、多变量)
- 数值求解微分方程组(ODE)
它广泛用于物理模拟、信号处理、生物建模、天体力学等领域。
2. 一维定积分:quad
函数
quad(func, a, b)
可计算函数 func
在区间 [a, b]
上的积分。
示例:积分 sin(x) 从 0 到 π
import numpy as np
from scipy.integrate import quad
result, error = quad(np.sin, 0, np.pi)
print("积分结果:", result)
print("估计误差:", error)
✅ 输出应接近 2,因为 ∫₀^π sin(x) dx = 2。
3. 多重积分:dblquad
与 tplquad
用于计算二维和三维定积分。
示例:二维积分 ∫∫ xy dxdy over [0,1]x[0,1]
from scipy.integrate import dblquad
func = lambda y, x: x * y
result, error = dblquad(func, 0, 1, lambda x: 0, lambda x: 1)
print("二维积分结果:", result)
函数参数顺序为 (y, x)
,外积分先对 x
,内积分对 y
。
4. 积分中的误差与参数说明
quad
和 dblquad
的返回值通常包括:
- 积分结果;
- 误差估计值(计算时的上下界、精度控制);
你还可以传入 epsabs
和 epsrel
控制误差阈值。
5. 常微分方程求解:solve_ivp
该函数支持求解一阶或高阶微分方程系统。
常用参数:
参数 | 说明 |
---|---|
fun | 函数 dy/dt = f(t, y) |
t_span | 时间区间 (t0, tf) |
y0 | 初始条件 y(t0) |
method | 数值解法(如 RK45、BDF 等) |
6. 示例:一阶微分方程 dy/dt = -2y
import numpy as np
from scipy.integrate import solve_ivp
import matplotlib.pyplot as plt
def dydt(t, y):
return -2 * y
sol = solve_ivp(dydt, [0, 5], [1], method='RK45', t_eval=np.linspace(0, 5, 100))
plt.plot(sol.t, sol.y[0])
plt.xlabel('t')
plt.ylabel('y')
plt.title('解: dy/dt = -2y')
plt.grid()
plt.show()
预期解为指数衰减 y(t) = e^{-2t}。
7. 示例:二阶微分方程(如弹簧振子)
经典二阶系统 m*d²x/dt² + kx = 0
可转化为一阶系统:
def spring(t, y):
# y[0] = x, y[1] = dx/dt
k = 2
m = 1
return [y[1], -k/m * y[0]]
# 初始位置 x=1, 速度=0
sol = solve_ivp(spring, [0, 10], [1, 0], t_eval=np.linspace(0, 10, 200))
plt.plot(sol.t, sol.y[0])
plt.title('简谐振动:x(t)')
plt.xlabel('时间 t')
plt.ylabel('位移 x')
plt.grid()
plt.show()
这个模拟的是不带阻尼的简谐振动。
🔗 出站链接与参考资料
📘 官方文档
scipy.integrate
官方文档:
https://docs.scipy.org/doc/scipy/reference/integrate.htmlsolve_ivp
API 说明:
https://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.solve_ivp.html
发表回复