NOTE
本文由以前的课程论文使用 pandoc 转换到 markdown 博客,原文为本人厦门大学数学系课程《微分方程数值解》的课程论文,参考时请注意。
简介#
本文默认读者对有限差分方法有一定了解,因此不做过多的前置知识介绍。
考虑如下初值问题:
将
- 向前欧拉格式
- 向后欧拉格式
- 跃点(Leap frog)格式
- 梯形格式
接下来,对以上四种有限差分格式,我们将进行其准确性(Accuracy)与稳定性(Stability)的数学推导。
准确性推导#
首先定义局部截断误差(Local Truncation Error)
WARNING
上述局部截断误差与通常定义的局部截断误差相差一个
向前欧拉格式#
向前欧拉格式的局部截断误差
对
于是有
误差
令
向后欧拉格式#
向后欧拉格式的局部截断误差
对
于是有
误差
令
跃点格式#
跃点格式的局部截断误差
对
于是有
误差
令
令
不妨假定上式中的
梯形格式#
跃点格式的局部截断误差
对
于是有
误差
令
稳定性推导#
考虑模型问题
其中
向前欧拉格式#
将格式代入模型问题可得
考虑到舍入误差,我们有
误差
假设
其中
向后欧拉格式#
将格式代入模型问题可得
考虑到舍入误差,我们有
误差
假设
其中
跃点格式#
将格式代入模型问题可得
考虑到舍入误差,我们有
误差
其中
假设
上式同时出现
其中
注意到仅
梯形格式#
将格式代入模型问题可得
考虑到舍入误差,我们有
误差
假设
其中
数值试验#
向前欧拉格式:
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
向后欧拉格式:
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
跃点格式:
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
梯形格式:
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
考虑如下初值问题:
其解析解为:
使用上述代码进行有限差分求解,得到数值结果如下: