题目

编写程序,使用经典显式 Runge-Kutta $(4, 5)$ 阶自适应步长算法 <code>ode45()</code> 求解典型一阶常微分方程初值问题(ODE IVP):$\frac{dy}{dt} = -2y$,初始条件 $y(0) = 5$,求解区间 $t \in [0, 2]$;并将数值解与解析精确解 $y(t) = 5e^{-2t}$ 逐点对比误差。

输入格式:无需外部输入。

输出格式:输出 ode45 自动选取的积分步数、端点数值解及最大绝对误差。

数据范围与约定:常微分方程数值求解。

思路与算法

1. ODE 标准形式
函数句柄必须写成 @(t, y) f(t, y) 形式,必须接受两输入参数(即使导数不显含时间 $t$)。

2. ode45 机制
MATLAB / Octave 的主力求解器,具备自适应变步长控制,在导数平缓区增大步长,在剧烈区缩小步长,精度与速度平衡极高。

3. 精度与稳定性
Runge-Kutta 截断误差为五阶,对于非刚性(Non-stiff)系统具有极高可信度。

完整程序

% Octave / MATLAB 第99题:ode45 常微分方程求解
% 定义微分方程 dy/dt = -2y
dydt = @(t, y) -2 * y;

tspan = [0, 2];
y0 = 5;

% 调用 ode45 积分求解
[t_out, y_out] = ode45(dydt, tspan, y0);

% 计算理论精确解: y_exact = 5 * exp(-2*t)
y_exact = 5 * exp(-2 * t_out);
max_err = max(abs(y_out - y_exact));

fprintf("求解问题: dy/dt = -2y, y(0)=5, t in [0, 2]\n");
fprintf("ode45 自适应迭代步数: %d 步\n", length(t_out));
fprintf("终点 t=2.0 处数值解: %.6f\n", y_out(end));
fprintf("终点 t=2.0 理论真值: %.6f\n", y_exact(end));
fprintf("全区间最大绝对误差:   %.2e (达自适应容差精度)\n", max_err);

运行示例

输出:

求解问题: dy/dt = -2y, y(0)=5, t in [0, 2]
ode45 自适应迭代步数: 49 步
终点 t=2.0 处数值解: 0.091580
终点 t=2.0 理论真值: 0.091578
全区间最大绝对误差:   1.11e-05 (达自适应容差精度)