基于多重网格外推法的自适应数值微分:Richardson 外推与多分辨率误差校正
题目描述
考虑数值微分问题:给定一个函数 \(f(x) \in C^\infty[a,b]\),要求在点 \(x_0\) 处近似其导数 \(f'(x_0)\)。
通常,我们使用中心差分公式:
\[f'(x_0) \approx \frac{f(x_0+h) - f(x_0-h)}{2h} \]
其中 \(h\) 为步长,该公式的截断误差为 \(O(h^2)\)。然而,当 \(h\) 过小时,舍入误差会显著增大,因此需要在截断误差和舍入误差之间权衡。
本题的目标是设计一种自适应多重网格外推法,利用多个不同步长的网格计算差分结果,通过 Richardson 外推 提高精度,并结合多分辨率误差校正策略自适应选择最优步长,从而在有限精度下获得高精度导数估计。
解题步骤
1. 基本中心差分公式及其误差分析
对于中心差分公式:
\[D_h(f,x_0) = \frac{f(x_0+h) - f(x_0-h)}{2h} \]
利用泰勒展开:
\[f(x_0 \pm h) = f(x_0) \pm h f'(x_0) + \frac{h^2}{2} f''(x_0) \pm \frac{h^3}{6} f'''(x_0) + \frac{h^4}{24} f^{(4)}(x_0) \pm \cdots \]
代入得:
\[D_h(f,x_0) = f'(x_0) + \frac{h^2}{6} f'''(x_0) + \frac{h^4}{120} f^{(5)}(x_0) + O(h^6) \]
因此,误差可写为:
\[E(h) = f'(x_0) - D_h(f,x_0) = -\frac{h^2}{6} f'''(x_0) - \frac{h^4}{120} f^{(5)}(x_0) - \cdots \]
误差仅含偶次幂项,适合 Richardson 外推。
2. Richardson 外推加速
设步长序列为 \(h_0 > h_1 > h_2 > \cdots\)(例如 \(h_k = h_0 / 2^k\))。
记 \(D^{(0)}_k = D_{h_k}(f,x_0)\)。
利用误差展开式:
\[D_h = f'(x_0) + c_2 h^2 + c_4 h^4 + c_6 h^6 + \cdots \]
构造外推表:
对于 \(m \ge 1\),
\[D^{(m)}_k = \frac{4^m D^{(m-1)}_{k+1} - D^{(m-1)}_k}{4^m - 1} \]
其中 \(D^{(m)}_k\) 的误差项为 \(O(h_k^{2m+2})\)。
例如:
- \(m=1\) 时,消去 \(h^2\) 项,精度 \(O(h^4)\)。
- \(m=2\) 时,消去 \(h^4\) 项,精度 \(O(h^6)\)。
通过递归外推,可逐步提高精度。
3. 多重网格误差校正与自适应步长选择
多重网格思路:在不同分辨率的网格上计算差分,比较相邻外推结果的差异,估计误差并自适应调整步长。
具体步骤:
- 初始化:选择初始步长 \(h_0\)(例如 \(h_0 = 10^{-2}\)),步长缩减因子 \(r = 1/2\),设定目标精度 \(\epsilon\)。
- 计算网格序列:对 \(k = 0,1,\dots,K\) 计算 \(D^{(0)}_k = D_{h_k}(f,x_0)\),其中 \(h_k = h_0 r^k\)。
- 构建外推表:按上述公式计算 \(D^{(m)}_k\) 直到最大可行阶数。
- 误差估计:利用外推表相邻项的差估计误差。
例如,对于阶数为 \(2m\) 的外推值,可估计误差:
\[ \text{Err}^{(m)}_k \approx |D^{(m)}_k - D^{(m-1)}_{k+1}| \]
因为外推过程中,低阶项误差占主导。
5. 自适应终止:
- 若 \(\text{Err}^{(m)}_k < \epsilon\),接受 \(D^{(m)}_k\) 作为导数近似。
- 否则,增加网格层数(减小步长)或提高外推阶数,重新计算。
- 防止舍入误差放大:当步长过小时,舍入误差可能放大。可监测差分值的数值噪声(例如相邻步长计算结果出现非单调变化),提前终止并选择当前最优估计。
4. 多分辨率误差校正策略
多分辨率校正的核心在于利用不同网格上的误差展开信息,联合估计高阶误差项。
具体方法:
- 假设我们有 \(K+1\) 个网格层,每层步长 \(h_k\),对应外推表各列。
- 拟合误差模型:
设 \(D^{(0)}_k = f'(x_0) + \sum_{j=1}^{J} c_{2j} h_k^{2j} + \delta_k\),其中 \(\delta_k\) 为舍入误差。 - 利用最小二乘法(或利用外推表递推关系)估计系数 \(c_{2j}\),然后校正:
\[ f'(x_0) \approx D^{(0)}_k - \sum_{j=1}^{J} c_{2j} h_k^{2j} \]
该方法可有效利用多个分辨率信息,减少对单一步长的依赖。
5. 算法流程
- 输入:函数 \(f\),求导点 \(x_0\),初始步长 \(h_0\),缩减因子 \(r\),目标误差限 \(\epsilon\),最大网格层数 \(K_{\max}\)。
- 初始化:\(k = 0\),计算 \(D^{(0)}_0\)。
- 循环(\(k = 0,1,\dots,K_{\max}-1\)):
- 计算 \(h_{k+1} = r h_k\),计算 \(D^{(0)}_{k+1}\)。
- 更新外推表 \(D^{(m)}_k\)(\(m = 1,\dots,k+1\))。
- 估计误差 \(\text{Err}^{(k)}\)(例如用 \(|D^{(k)}_0 - D^{(k-1)}_1|\))。
- 如果 \(\text{Err}^{(k)} < \epsilon\),返回 \(D^{(k)}_0\)。
- 若未达到精度,但误差已不再下降(舍入误差主导),返回当前最优外推值。
- 可选项:利用多分辨率拟合校正进一步提高精度。
6. 数值示例
考虑 \(f(x) = e^x \cos(x)\),\(x_0 = 1.0\),理论导数 \(f'(1) \approx -0.110793765307\)。
使用初始 \(h_0 = 0.1\),\(r = 1/2\),外推三次:
- 原始差分(\(h=0.1\)):误差约 \(10^{-3}\)。
- 一次外推(消去 \(h^2\)):误差约 \(10^{-5}\)。
- 二次外推(消去 \(h^4\)):误差约 \(10^{-7}\)。
- 三次外推(消去 \(h^6\)):误差接近 \(10^{-9}\)(受限于函数值精度)。
自适应过程会在误差小于设定阈值时停止,避免无谓计算。
7. 优缺点与适用场景
- 优点:
- 利用外推显著提高精度,避免手动步长调优。
- 多重网格误差估计可靠,可自动平衡截断误差与舍入误差。
- 适用于光滑函数的高精度数值微分。
- 缺点:
- 需要多次函数求值,计算量较大。
- 对非光滑函数或高阶导数噪声敏感。
- 适用:科学计算中需要高精度导数估计的场景,如优化算法中的梯度检查、微分方程初值问题中的导数初始化等。
总结
本题设计的自适应多重网格外推法,通过中心差分离散、Richardson 外推加速、多分辨率误差估计与自适应步长控制四个步骤,实现了数值微分的高精度稳定计算。该方法是经典外推技术与现代自适应策略的结合,可在实际应用中自动逼近机器精度极限。