3. 有限差分法基础与网格设计

有限差分法的核心思想非常朴素:用离散网格点上的函数值之差,去近似连续导数。要真正用好它,关键不在于记住某个公式,而在于搞清楚三件事——差分格式是怎么构造出来的、它近似得有多准(截断误差与相容性)、以及网格步长取多大才既算得动又算得对。本节围绕一维与二维差分格式的构造展开,并把截断误差、相容性和稳定性的初步概念串起来。

一、从泰勒展开构造差分格式

设未知函数 u(x) 在网格点 xi = i·h 上取值 ui,h 为网格步长。把 u(xi±h) 在 xi 处做泰勒展开:

u(x+h) = u + h·u' + h²/2·u'' + h³/6·u''' + O(h⁴)
u(x−h) = u − h·u' + h²/2·u'' − h³/6·u''' + O(h⁴)

两式相减,偶次项抵消,得到一阶导数的中心差分:

u'(x_i) ≈ (u_{i+1} − u_{i−1}) / (2h) + O(h²)

两式相加,奇次项抵消,得到二阶导数的中心差分:

u''(x_i) ≈ (u_{i+1} − 2u_i + u_{i−1}) / h² + O(h²)

若只用 ui+1 和 ui,则得到一阶向前差分 (ui+1−ui)/h,误差为 O(h)。可见同样近似一阶导数,中心差分比单侧差分高一阶精度,代价是要用到两侧邻居,边界处需要特殊处理。这就是差分格式构造的基本逻辑:选择哪些网格点、如何线性组合,决定了格式的精度阶和适用位置。

二、二维情形与五点格式

二维泊松方程 −∇²u = f 在矩形网格 (xi, yj) 上,对 x、y 方向分别用二阶中心差分,相加得到经典的五点差分格式:

(4u_{i,j} − u_{i+1,j} − u_{i−1,j} − u_{i,j+1} − u_{i,j−1}) / h² = f_{i,j}

这里假设 x、y 方向步长相同为 h。若两方向步长分别为 hx、hy,则系数变为 2/hx²+2/hy² 与各自的 1/h² 权重。五点格式的每个未知量只与上下左右四个邻居耦合,形成稀疏带状线性系统,这正是它被广泛采用的原因。下图展示了一维三点模板与二维五点模板的网格依赖关系,以及边界点需要单侧格式的情形。

差分模板与网格依赖关系 一维二阶中心差分(三点模板) u_{i−1} u_i u_{i+1} (u_{i+1}−2u_i+u_{i−1})/h² 截断误差 O(h²) 二维五点格式(泊松方程) i,j 中心点与上下左右四邻居耦合 形成稀疏带状线性系统 边界处理: 左边界 i=0 无 u_{−1},改用向前差分 (u_1−u_0)/h,精度降为 O(h);或引入虚拟点 u_{−1}=u_1(对称边界)保持 O(h²)。

三、截断误差与相容性

把精确解代入差分方程,得到的残差就是局部截断误差。例如对 u'' 的中心差分,截断误差主项为 −h²/12·u''''(xi),故记为 O(h²)。若当 h→0 时截断误差趋于零,则称格式与微分方程相容。相容性只说明格式在极限意义下逼近原方程,是格式可用的必要条件,但不保证数值解收敛——还需要稳定性配合(Lax 等价定理:相容+稳定 ⟺ 收敛)。

工程上判断相容性很直接:写出截断误差表达式,看 h 的最高次幂是否为正。若格式设计有误(如系数配错),截断误差可能为 O(1),即无论网格多细都不收敛,这类错误必须在编码前通过推导排除。

四、网格步长选择与稳定性初步

步长 h 的选择是精度与计算量的折中。对二阶格式,误差 ∝ h²,h 减半误差降为 1/4,但二维未知量增为 4 倍、三维增为 8 倍。实际做法是先做网格收敛性检查:取 h、h/2、h/4 三套网格计算同一问题,观察误差比是否接近 4(二阶收敛),若偏离则说明格式或边界处理有问题。

对含时间的问题(如热传导 ut=αuxx),显式格式的稳定性给出硬约束。以 FTCS 格式为例:

u_i^{n+1} = u_i^n + α·Δt/h² · (u_{i+1}^n − 2u_i^n + u_{i−1}^n)

令 r = α·Δt/h²,稳定性要求 r ≤ 1/2,即 Δt ≤ h²/(2α)。这说明空间网格越细,时间步长必须按平方缩小,计算代价急剧上升——这正是隐式格式被引入的动机。二维显式格式则要求 r ≤ 1/4。下表给出一个教学示例中的参数选择参考(示例参数,非实测):

参数取值示例约束/说明
空间步长 h0.05由精度需求与网格收敛检查确定
时间步长 Δt0.001显式格式需满足 Δt ≤ h²/(2α)
扩散系数 α1.0示例假设值
网格比 r0.4r ≤ 0.5 满足一维稳定性
构造差分格式的通用流程:确定微分方程 → 选网格与模板 → 泰勒展开推导系数 → 写出截断误差判断相容性 → 对时间相关问题分析稳定性条件 → 做网格收敛检查验证实现正确性。

需要强调的是,稳定性分析给出的是必要条件或充分条件,具体取决于格式。对初学者,最实用的做法是:先用解析解或制造解(method of manufactured solutions)验证代码的空间收敛阶,再检查时间步长是否落在稳定域内,两者都通过后,数值结果才具备可信度。