向前欧拉、向后欧拉、跃点(蛙跳)、梯形四种有限差分方法的准确性(收敛性)、稳定性数学推导
本文由以前的课程论文使用 pandoc 转换到博客,原文为本人厦门大学数学系课程《微分方程数值解》的课程论文,参考时请注意。
简介
本文默认读者对有限差分方法有一定了解,因此不做过多的前置知识介绍。
考虑如下初值问题:
- 向前欧拉格式
- 向后欧拉格式
- 跃点(Leap frog)格式
- 梯形格式
接下来,对以上四种有限差分格式,我们将进行其准确性(Accuracy)与稳定性(Stability)的数学推导。
准确性推导
首先定义局部截断误差(Local Truncation Error)
上述局部截断误差与通常定义的局部截断误差相差一个
向前欧拉格式
向前欧拉格式的局部截断误差
向后欧拉格式
向后欧拉格式的局部截断误差
跃点格式
跃点格式的局部截断误差
梯形格式
跃点格式的局部截断误差
稳定性推导
考虑模型问题
向前欧拉格式
将格式代入模型问题可得
数值试验
四种有限差分格式的MATLAB代码
向前欧拉格式:
1 | function [x, result] = forward_euler(T, step, u0, f) x = linspace(0, T, step + 1); h = T / step; result = zeros(1, step + 1); result(1) = u0; for k = 2:step + 1 result(k) = result(k - 1) + h * f(x(k - 1), result(k - 1)); end end |
1 | function [x, result] = backward_euler(T, step, u0, f) x = linspace(0, T, step + 1); h = T / step; result = zeros(1, step + 1); result(1) = u0; for k = 2:step + 1 temp_func = @(uk) result(k - 1) + h * f(x(k), uk) - uk; result(k) = fzero(temp_func, result(k - 1)); end end |
1 | function [x, result] = leap_frog(T, step, u0, u1, f) x = linspace(0, T, step + 1); h = T / step; result = zeros(1, step + 1); result(1) = u0; result(2) = u1; for k = 3:step + 1 result(k) = result(k - 2) + 2 * h * f(x(k - 1), result(k - 1)); end end |
1 | function [x, result] = trapezoidal(T, step, u0, f) x = linspace(0, T, step + 1); h = T / step; result = zeros(1, step + 1); result(1) = u0; for k = 2:step + 1 temp_func = @(uk) result(k - 1) - uk + ... h * (f(x(k), uk) + f(x(k - 1), result(k - 1))) / 2; result(k) = fzero(temp_func, result(k - 1)); end end |
考虑如下初值问题:
其解析解为:
使用上述代码进行有限差分求解,得到数值结果如下: