对一些有限差分方法的数学推导
简介
本文默认读者对有限差分方法有一定了解,因此不做过多的前置知识介绍。考虑如下初值问题:
将 划分为 个等距区间,,考虑如下几种差分方法:
- 向前 Euler 格式 (FE)
- 向后 Euler 格式 (BE)
- 跃点格式 (LF)
- 梯形格式 (Tz)
接下来,对以上四种有限差分格式,我们将进行其准确性 (Accuracy) 与稳定性 (Stability) 的数学推导。
准确性推导
首先定义局部截断误差 (Local Truncation Error) ,其定义11 此处的局部截断误差与通常定义的局部截断误差相差一个 ,参考时请注意。为:其他点处的精确解在 处按照差分格式计算得到的结果与 处的精确解的差值。
向前 Euler 格式
向前 Euler 格式的截断误差 可表示为如下等式
对 进行 Taylor 展开,我们有
于是有
误差 可表示为如下形式:
令 ,对误差 有如下估计
向后 Euler 格式
向后 Euler 格式的截断误差 可表示为如下等式
对 进行 Taylor 展开,我们有
TODO: 完成全部迁移工作
数值试验
考虑如下初值问题
其中 。上述初值问题的解析解为
代码实现
向前欧拉格式:
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)); endend向后欧拉格式:
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)); endend跃点格式:
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)); endend梯形格式:
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)); endend