Runge-Kutta方法下的微分方程数值解问题

友友们求解初值问题

img

的经典四阶 Runge-Kutta 方法,取 h=0.4 进行mathlab数值实验,把计算结果、精确解及误差用表格给出。

% 定义常微分方程
function dy = f(t, y)
    dy = t^(-1) * (y^2 + y);
end

% 初始化变量
t0 = 1;
u0 = -2;
h = 0.4;
t_end = 3;

% 初始化结果数组
results = [t0, u0];

% 迭代计算
while t0 < t_end
    % 计算 k1k2k3k4 和 u1
    k1 = h * f(t0, u0);
    k2 = h * f(t0 + h/2, u0 + k1/2);
    k3 = h * f(t0 + h/2, u0 + k2/2);
    k4 = h * f(t0 + h, u0 + k3);
    u1 = u0 + (k1 + 2*k2 + 2*k3 + k4) / 6;

    % 更新 t0 和 u0
    t0 = t0 + h;
    u0 = u1;

    % 记录结果
    results = [results; t0, u0];
end

% 输出结果
results
% 计算计算结果、精确解和误差
for i = 1:size(results, 1)
    t = results(i, 1);
    u_calc = results(i, 2);
    u_exact = u(t); % 这里假设 u(t) 是精确解函数
    error = abs(u_calc - u_exact);
end
% 输出表格标题
fprintf('| t  | u(t) (计算结果) | u(t) (精确解) | 误差 |\n');
fprintf('|----|-----------------|----------------|------|\n');

% 输出表格数据
for i = 1:size(results, 1)
    t = results(i, 1);
    u_calc = results(i, 2);
    u_exact = u(t); % 这里假设 u(t) 是精确解函数
    error = abs(u_calc - u_exact);
    fprintf('| %.1f| %.4f         | %.4f         | %.4f |\n', t, u_calc, u_exact, error);
end

望采纳。

可以按照以下步骤在 matlab 中求解初值问题:

  • 定义初值问题的函数。
  • 调用求解初值问题的函数:matlab 中有很多函数可以求解初值问题,例如 ode45、ode23 等。
  • 画图:您可以使用 matlab 的 plot 函数绘制 t 和 u 的图像。
  • 计算误差:您可以自己定义一个函数来计算误差。
% 定义初值问题的函数
f = @(t, u) (u^2 + u)/t;

% 定义精确解函数
exact = @(t) -2./t;

% 定义误差函数
error = @(t, u) abs(u - exact(t));

% 使用 ode45 函数求解初值问题
[t, u] = ode45(f, [1, 3], -2);

% 计算误差
e = error(t, u);

% 使用 uitable 函数展示计算结果、精确解和误差
data = [t, u, e];
columnnames = {'t', 'u', 'error'};
uitable('Data', data, 'ColumnName', columnnames);