3. 有限差分逼近
有限差分方法的核心思想,是用网格节点上的函数值组合来近似导数。要真正用好它,必须同时回答三个问题:用哪几个点、按什么公式组合、误差有多大。本节围绕一阶导数与二阶导数的向前、向后、中心差分格式展开,并通过泰勒展开给出截断误差的定量表达,最后说明如何用数值实验验证精度阶数。
一、统一约定与泰勒展开基础
设函数 u(x) 在区间上足够光滑,取均匀网格 xi = x0 + iΔx,记 ui = u(xi),步长 h = Δx > 0。全文约定:向前差分沿 +x 方向取点,向后差分沿 −x 方向取点,中心差分关于 xi 对称取点。所有误差分析均以节点 xi 处的精确导数为参照。
泰勒展开是推导一切差分格式的统一工具:
u(x_i + h) = u_i + h·u'_i + h²/2·u''_i + h³/6·u'''_i + h⁴/24·u''''_i + O(h⁵)
u(x_i − h) = u_i − h·u'_i + h²/2·u''_i − h³/6·u'''_i + h⁴/24·u''''_i + O(h⁵)
把这两个式子做加、减、移项,就能系统性地得到下面所有格式,而不必死记硬背。
二、一阶导数的三种差分格式
向前差分(一阶精度)。由 u(xi+h) 的展开式移项得
u'_i ≈ (u_{i+1} − u_i) / h, 截断误差 = −h/2·u''_i + O(h²)
误差主项与 h 成正比,故为一阶精度,记作 O(h)。它只需当前点和右邻点,适合在右边界处使用(因为边界外没有节点)。
向后差分(一阶精度)。由 u(xi−h) 的展开式移项得
u'_i ≈ (u_i − u_{i−1}) / h, 截断误差 = +h/2·u''_i + O(h²)
同样是一阶精度,但误差主项符号与向前差分相反。它只需当前点和左邻点,适合在左边界处使用。
中心差分(二阶精度)。将两式相减,ui 与 u''i 项抵消:
u'_i ≈ (u_{i+1} − u_{i−1}) / (2h), 截断误差 = −h²/6·u'''_i + O(h⁴)
误差主项为 O(h²),是二阶精度。注意它跳过了 ui 本身,只用到左右两个邻点,因此在内部节点上通常优先选用。代价是不能直接用于边界,且对高频振荡(奇偶失联)较敏感。
三、二阶导数的三种差分格式
中心差分(二阶精度,最常用)。将两式相加,u'i 项抵消:
u''_i ≈ (u_{i+1} − 2u_i + u_{i−1}) / h², 截断误差 = −h²/12·u''''_i + O(h⁴)
这是泊松方程、热传导方程离散的基石,模板为 [1, −2, 1]/h²。
向前与向后二阶差分(一阶精度)。用三个相邻点构造:
向前: u''_i ≈ (u_{i+2} − 2u_{i+1} + u_i) / h², 误差 = −h·u'''_i + O(h²)
向后: u''_i ≈ (u_i − 2u_{i−1} + u_{i−2}) / h², 误差 = +h·u'''_i + O(h²)
它们只用于边界附近(例如需要保持三点模板一致性时),精度比中心格式低一阶。
四、格式对比与选用原则
| 导数 | 格式 | 差分表达式 | 截断误差主项 | 精度阶 | 典型用途 |
|---|---|---|---|---|---|
| 一阶 | 向前 | (ui+1−ui)/h | −h/2·u'' | 1 | 右边界、迎风格式 |
| 一阶 | 向后 | (ui−ui−1)/h | +h/2·u'' | 1 | 左边界、迎风格式 |
| 一阶 | 中心 | (ui+1−ui−1)/(2h) | −h²/6·u''' | 2 | 内部节点 |
| 二阶 | 中心 | (ui+1−2ui+ui−1)/h² | −h²/12·u'''' | 2 | 内部节点、椭圆型方程 |
| 二阶 | 向前/向后 | 三点单侧模板 | ∓h·u''' | 1 | 边界附近 |
选用原则可归纳为:内部节点优先中心格式(同阶精度下模板更紧凑、误差更小);边界节点只能用单侧格式,此时要么接受一阶精度,要么用高阶单侧模板补偿;对流主导问题中,中心差分可能产生非物理振荡,需改用迎风(向前/向后)格式以换取稳定性。
五、精度阶数的数值验证方法
理论阶数必须能被数值实验证实,否则说明实现有误(如步长写错、索引越界、边界处理不一致)。验证流程如下:
- 选一个解析导数已知的测试函数,例如 u(x) = sin(x),在 x0 = 1.0 处 u′ = cos(1) ≈ 0.540302,u″ = −sin(1) ≈ −0.841471。
- 取一系列逐步减半的步长,如 h = 0.1, 0.05, 0.025, 0.0125。
- 计算每个步长下的绝对误差 e(h) = |差分值 − 解析值|。
- 用相邻两次误差之比估计阶数:p ≈ log₂(e(h)/e(h/2))。若 p 稳定趋近 1 或 2,则与理论一致。
以中心差分近似 u′(1) 为例,一组示例性计算结果如下(数值由公式直接计算,用于说明趋势):
| h | 中心差分值 | 绝对误差 e(h) | 误差比 e(h)/e(h/2) | 估计阶 p |
|---|---|---|---|---|
| 0.1 | 0.539881 | 4.21×10⁻⁴ | — | — |
| 0.05 | 0.540197 | 1.05×10⁻⁴ | 4.00 | 2.00 |
| 0.025 | 0.540276 | 2.63×10⁻⁵ | 4.00 | 2.00 |
| 0.0125 | 0.540296 | 6.58×10⁻⁶ | 4.00 | 2.00 |
误差每减半步长缩小约 4 倍,估计阶 p ≈ 2,与 O(h²) 的理论结论吻合。若改用向前差分做同样实验,误差比应趋近 2、估计阶趋近 1。这种“减半步长看误差比”的做法,是检验差分程序正确性最直接的手段。
六、实践中的两个关键细节
其一,边界处理要与内部格式匹配。若内部用二阶中心格式而边界用一阶单侧格式,整体精度会被边界拉低到一阶。常见补救是引入虚拟节点(ghost node),利用边界条件反推出 u−1,从而在边界也使用中心模板,保持全局二阶精度。
其二,误差主项系数决定实际误差大小。同为二阶格式,一阶导数中心差分的误差系数是 1/6,二阶导数中心差分是 1/12,二者相差一倍;而向前、向后一阶导数的系数是 1/2。在相同步长下,系数越小误差越小,这也是中心格式在内部节点更受青睐的定量依据。