MATLAB 误差分析:不同步长下数值方法的比较
本文将使用 MATLAB 编程,通过改变步长,比较四种常用数值方法的误差变化趋势。我们将分别将步长设置为原步长的 1/2、1/4、1/8,并根据公式 enum = ∥(u(1), v(1)) − (unum(1), vnum(1)∥2 计算不同步长下的整体误差。为了更好地分析误差变化趋势,我们将绘制误差对步长的对数关系图。
方法实现
以下是一个可能的 MATLAB 实现:
% 设置初始条件和参数
u0 = 1;
v0 = 0;
tspan = [0 10];
h = 0.1;
f = @(t, u, v) -u - 2*v + 2*sin(2*t);
g = @(t, u, v) u - v + 2*cos(2*t);
% 计算精确解
exact_sol = @(t) [exp(-t).*sin(t); exp(-t).*cos(t)];
t_exact = linspace(tspan(1), tspan(2), 1000);
u_exact = exact_sol(t_exact);
% 定义四种方法
methods = {@euler_method, @rk2_method, @rk4_method, @ab2_method};
method_names = {'Euler', 'RK2', 'RK4', 'AB2'};
% 计算不同步长的误差
hs = [h, h/2, h/4, h/8];
errors = zeros(length(methods), length(hs));
for i = 1:length(methods)
method = methods{i};
for j = 1:length(hs)
[~, u_num, v_num] = method(f, g, tspan, [u0; v0], hs(j));
error = norm([u_num(1); v_num(1)] - exact_sol(tspan(1)), 2);
errors(i, j) = error;
end
end
% 绘制误差对步长的对数关系图
figure;
for i = 1:length(methods)
loglog(hs, errors(i, :), '-o', 'DisplayName', method_names{i});
hold on;
end
loglog(hs, hs.^1, '--', 'DisplayName', 'h^1');
loglog(hs, hs.^2, '--', 'DisplayName', 'h^2');
grid on;
xlabel('log(h)');
ylabel('log(e)');
title('Comparison of Errors with Different Step Sizes');
legend('show');
结果分析
通过绘制的误差对步长的对数关系图,我们可以观察到以下规律:
- 对于所有方法,随着步长的减小,误差都呈现出指数级下降的趋势。这与误差随步长的理论关系式
e = ChN ⇒ log (e) = N log (h) + log (C)相符,其中N代表方法的阶数。 - 不同方法之间的误差大小和下降速度有所不同。例如,RK4 方法的误差最小,而 Euler 方法的误差最大。这说明了不同方法的精度和稳定性的差异。
总结
通过改变步长,比较不同数值方法的误差变化趋势,我们可以更深入地理解数值方法的精度和稳定性。这些分析结果对于选择合适的数值方法,并确定最佳步长来进行数值计算具有重要的参考价值。
原文地址: https://www.cveoy.top/t/topic/oQ4Q 著作权归作者所有。请勿转载和采集!