3. 有限差分近似基础
波动方程数值仿真的第一步,是把连续的偏导数替换为离散网格上的差商。理解这一替换的数学依据、误差来源以及由此引出的稳定性概念,是后续编写任何有限差分程序的前提。本节围绕导数差分近似展开,先建立泰勒展开这一分析工具,再比较前向、后向与中心差分,最后讨论差分格式的一致性与收敛性。
一、泰勒展开:差分近似的统一来源
设函数 u(x) 在点 x 附近足够光滑,步长为 Δx。将 u(x+Δx) 与 u(x−Δx) 分别在 x 处作泰勒展开:
u(x+Δx) = u(x) + u'(x)Δx + u''(x)Δx²/2 + u'''(x)Δx³/6 + O(Δx⁴)
u(x−Δx) = u(x) − u'(x)Δx + u''(x)Δx²/2 − u'''(x)Δx³/6 + O(Δx⁴)
把这两个式子做不同的代数组合,就得到不同的差分近似。这是理解一切差分格式的统一出发点:差分公式不是凭空规定的,而是泰勒展开截断后的结果。
二、前向、后向与中心差分
前向差分由第一式移项得到:
u'(x) ≈ [u(x+Δx) − u(x)] / Δx,截断误差 O(Δx)
它只用到当前点和右侧邻点,实现简单,适合在计算域的右边界处使用(因为右侧没有网格点)。但误差是一阶的,步长减半误差才减半。
后向差分由第二式移项得到:
u'(x) ≈ [u(x) − u(x−Δx)] / Δx,截断误差 O(Δx)
同样是一阶精度,适合左边界。前向与后向差分在空间上不对称,会引入数值频散和相位偏差,在波动问题中通常不作为内部区域的首选。
中心差分把两式相减,偶数阶项抵消:
u'(x) ≈ [u(x+Δx) − u(x−Δx)] / (2Δx),截断误差 O(Δx²)
精度提高到二阶,且关于 x 对称,不引入方向性偏差。对二阶导数,把两式相加可得:
u''(x) ≈ [u(x+Δx) − 2u(x) + u(x−Δx)] / Δx²,截断误差 O(Δx²)
这正是后面离散波动方程空间项时最常用的形式。需要注意,中心差分在边界处无法直接使用(缺少一侧邻点),实际程序中常在边界退化为前向或后向差分,或引入虚拟网格点。
三、用数值例子核对误差阶
取 u(x) = sin(x),在 x = 1.0 处精确导数为 cos(1.0) ≈ 0.540302。分别用三种差分在 Δx = 0.1 与 Δx = 0.01 下计算(以下为按公式手算的示例值,用于说明误差量级):
| 差分类型 | Δx = 0.1 近似值 | 误差量级 | Δx = 0.01 近似值 | 误差量级 |
|---|---|---|---|---|
| 前向 | 0.497364 | 约 4.3×10⁻² | 0.536086 | 约 4.2×10⁻³ |
| 后向 | 0.581441 | 约 4.1×10⁻² | 0.544501 | 约 4.2×10⁻³ |
| 中心 | 0.539402 | 约 9.0×10⁻⁴ | 0.540293 | 约 9.0×10⁻⁶ |
可以看到,步长缩小 10 倍时,前向与后向差分的误差约缩小 10 倍(一阶),中心差分的误差约缩小 100 倍(二阶),与理论阶数一致。这个核对过程在实际编程中很有价值:写完差分算子后,用一个已知解析导数的函数做收敛性测试,就能验证实现是否正确。
四、一致性、稳定性与收敛性
把差分格式代回偏微分方程,会得到一个截断误差项。若当 Δx、Δt 趋于零时截断误差也趋于零,则称该格式与原方程相容(一致)。前面三种差分都满足一致性,区别只在趋于零的快慢,即阶数不同。
收敛性指数值解在网格无限加密时是否趋于真解。稳定性指计算过程中误差是否被控制而不被放大。三者由 Lax 等价定理联系:对于适定的线性初值问题,一致性加上稳定性等价于收敛性。这解释了为什么波动方程显式格式必须满足 CFL 条件——它正是稳定性的具体要求,否则格式虽然相容,计算结果却会发散。
五、在波动方程离散中的具体落实
以一维波动方程 utt = c²uxx 为例,时间与空间均采用二阶中心差分,得到显式格式:
u[i][n+1] = 2u[i][n] − u[i][n−1] + r²·(u[i+1][n] − 2u[i][n] + u[i−1][n])
其中 r = c·Δt/Δx,稳定性要求 r ≤ 1(CFL 条件)
实现时需注意三点:其一,初始条件 u(x,0) 与 ut(x,0) 要分别离散,后者常用中心差分构造虚拟的 n = −1 层;其二,边界点缺少邻点,需单独处理;其三,r 的取值直接决定稳定性,取 r = 1 时数值频散最小,但余量不足,工程上常取 0.8~0.9 留出安全裕度。这些细节都建立在本节差分近似与误差分析的基础之上。