有限差分法:原理、设置与验证
从泰勒展开推导有限差分模板系数,说明截断误差中的色散与耗散来源、紧致格式的分辨率优势、显式扩散的稳定界,并界定它在复杂几何与间断问题上的边界。
有限差分法:原理、设置与验证
有限差分用泰勒展开把导数替换为节点值的线性组合,格式的阶数、稳定域与守恒性都由此确定。一套可复现的有限差分配置要同时锁死四样东西:差分模板与阶数、网格分布(含壁面首层高度)、时间推进格式与步长、以及边界闭合方式。有限差分的误差有两副面孔:色散(相位错位)和耗散(振幅衰减)。诊断的关键是把这两项分别量出来,而不是笼统地看"误差多大"。
边界闭合与守恒性
有限差分只有在写成通量(望远镜)形式时才守恒:
此时对全部 求和,内部通量两两抵消,只剩两端边界通量。若直接把对流项写成非守恒形式 ,跨激波的总量会漂移。边界闭合推荐用 SBP(分部求和)算子配 SAT 惩罚项,它能保证离散能量不等式成立,而不是靠试出来的边界模板。
泰勒展开给出模板系数
把相邻节点值在 处展开:
将 与 相减,偶数阶项抵消,得到二阶中心差分及其截断误差:
系数 是关键:误差项含三阶导数,所以中心差分对线性解精确,对弯曲解产生色散误差;若把 与 相加并配 ,可得二阶精度的 模板 。奇数阶导数用反对称模板、偶数阶导数用对称模板,是泰勒展开的直接推论。任意模板的系数都可以由一个小型线性系统解出:
import numpy as np
from math import factorial
def fd_coeffs(offsets, deriv):
"""由泰勒展开求任意模板的有限差分系数;deriv=1 表示一阶导。"""
A = np.array([[o**p / factorial(p) for o in offsets]
for p in range(len(offsets))], dtype=float)
b = np.zeros(len(offsets))
b[deriv] = 1.0
return np.linalg.solve(A, b)
print(np.round(fd_coeffs([-1, 0, 1], 1), 4)) # [-0.5 0. 0.5 ]
print(np.round(fd_coeffs([-2, -1, 0, 1, 2], 1), 4)) # [ 0.0833 -0.6667 0. 0.6667 -0.0833]
print(np.round(fd_coeffs([-1, 0, 1], 2), 4)) # [ 1. -2. 1.]
第二行正是四阶中心差分 的系数乘以 12。
紧致格式用隐式换取分辨率
显式四阶格式要 5 点带宽,紧致(Padé)格式只用 3 点:
左端含未知导数,需要对全部节点联立求解一个三对角系统,但带宽小、边界处理更干净。分辨率上,紧致四阶在每波长约 4 点即可把相位误差控制在 1% 以内,而显式四阶需要约 8 点;代价是每次求导要多解一次三对角方程,并需额外的边界闭合关系。
稳定性由模态放大因子界定
把 代入格式,稳定性要求对一切波数都有 。显式欧拉配二阶中心扩散给出
其中 是热扩散率。取空气 m²/s、 m,则 s。这条限制与 成正比,是显式格式在细网格上变慢的根源;对流项的库朗数限制只与 成正比,两者尺度不同,因此细网格上通常由扩散项主导时间步。
守恒性与适用边界
有限差分只有在写成通量形式时才守恒;把对流项写成非守恒形式,跨激波的总量会漂移。适用边界如下:
适合:结构化或可光滑拉伸的网格、高精度波传播与气动声学、边界层与直接数值模拟(几何简单)、以及需要极高阶(六阶以上)的谱式差分。
不适合:复杂几何(需重叠网格或浸入边界,代价高)、非结构网格上的严格局部守恒(应选有限体积或有限元)、以及无限制器情况下的强激波(会产生非物理振荡)。
| 现象 | 根因 | 判定试验 |
|---|---|---|
| 升到四阶后误差只降一阶 | 边界模板仍是二阶,污染内点 | 只在边界 5 点内统计误差,与内点分别定阶 |
| 细网格上时间步被迫极小 | 显式扩散限制按 收缩 | 改用隐式或 IMEX 时间推进,比较步长 |
| 紧致格式求解很慢 | 每次求导都需解三对角系统 | 统计求导耗时占比,评估是否值得换分辨率 |
| 跨激波的总量缓慢漂移 | 对流项写成非守恒形式 | 改用通量形式,检查两端边界通量之差 |
| 高阶格式在间断处剧烈振荡 | 未使用限制器或 WENO 重构 | 换 WENO 重构,比较总变差与振荡幅度 |
几何拉伸与层数
按几何级数 拉伸,从 累积到半槽高 :
解得 ,。即半槽 36 层、全槽 72 层。拉伸比 常用上限为 1.2,超过后截断误差中的网格变化率项会显著增大,名义二阶格式可能只表现出一阶。
网格与步长生成脚本
import numpy as np
def stretched_grid(dy1, r, H):
"""从首层高度 dy1 按比例 r 拉伸到半槽高 H,返回节点坐标。"""
ys = [0.0]
dy = dy1
while ys[-1] < H:
ys.append(ys[-1] + dy)
dy *= r
return np.array(ys)
def dt_max(dx_min, umax, c, cfl=0.8):
return cfl * dx_min / (umax + c)
y = stretched_grid(5e-5, 1.15, 0.05)
print(f"层数={len(y)-1}, 首层={y[1]-y[0]:.2e} m, dt={dt_max(5e-5, 40.0, 10.0):.2e} s")
# 层数=36, 首层=5.00e-05 m, dt=8.00e-07 s
三套网格定阶
两次比较容易被误差抵消误导,至少用三套网格做 Richardson 估计:
实测:、、 m 时相邻解之差依次为 、、,两级比值均为 4,于是 ,与二阶中心差分的名义阶数吻合。若算得 ,说明边界闭合或滤波把内点的高阶精度污染了。
模板与阶数对照
分辨率经验值:二阶格式每波长至少 20 点,四阶显式 8~10 点,六阶 5~6 点。选择依据是目标波长而非几何尺度——若最关心的涡尺度是 0.05 m,则二阶格式要求 m。
| 目标导数 | 模板 | 名义阶数 | 带宽 |
|---|---|---|---|
| 2 | 3 | ||
| 4 | 5 | ||
| Padé 紧致(隐式三对角) | 4 | 3 | |
| 2 | 3 | ||
| 4 | 5 |
壁面首层高度由 反算
壁面解析的关键参数是首层高度,它由目标 、运动粘度与摩擦速度共同决定:
取空气 m²/s、壁面摩擦速度 m/s、目标 ,则 m,即 50 μm。若改用壁面函数、目标 ,则 m,两者相差 30 倍。 目标一旦定错,后续所有层厚都会系统性偏离。
时间步上限
取库朗数 0.8、 m、 m/s(约 Ma 0.15 的空气流),得 s。注意这里用的是全场最小网格尺度;若只在局部加密而全局用同一时间步,总步数由最细网格决定。
故障模式与判定试验
| 现象 | 根因 | 判定试验 |
|---|---|---|
| 壁面附近速度剖面偏离对数律 | 首层高度未按 反算,或 取自错误位置 | 输出壁面 分布,检查是否与目标一致 |
| 拉伸区出现明显数值振荡 | 拉伸比 ,截断误差随网格变化率增大 | 把 降到 1.1 重算,看振荡是否消失 |
| 显式步进在局部加密区失稳 | 时间步按平均网格而非最小网格选取 | 用 重算 ,看是否稳定 |
| 边界附近误差比内点高一个量级 | 边界模板阶数低于内点,或未用 SBP/SAT | 分别统计边界与内点的误差,比较收敛阶 |
| 均匀流场产生非零残差 | 变步长网格未满足几何守恒律 | 用常数初值运行一步,检查残差是否为零 |
| 长时间积分后总通量漂移 | 对流项写成非守恒形式 | 改用通量形式重算,比较两端边界通量之差 |
| 波以恒定速度错位但振幅不变 | 中心格式色散,相速比为 | 改变每波长点数,看错位是否按 缩小 |
| 波幅随时间指数衰减 | 迎风或滤波的数值耗散过强 | 打印 $ |
| 网格加密后误差不再下降 | 边界闭合低阶,污染了内点高阶精度 | 只在边界附近统计误差,与内点分别比较收敛阶 |
| 长时间积分后总能量缓慢漂移 | 未用通量形式或边界通量未闭合 | 累加所有界面通量,检查是否望远镜式抵消 |
| 变步长网格上出现虚假源项 | 未满足离散几何守恒律(GCL) | 用均匀流初值,看残差是否为零 |
| 加密后误差反而增大 | 解未进入渐近区,或存在多解分支 | 补一套更细网格,检查误差是否恢复单调下降 |
与解析解的对照验收
取线性对流 、 m/s、 m 域、周期边界、初值 。精确解在 s 时是原高斯脉冲右移 1 m。用 m(200 个网格点)、库朗数 0.5( s,200 步)计算:二阶中心格式的 误差约 ,误差以相位错位为主,峰值保持 1.00;一阶迎风的 误差约 ,但峰值被压到约 0.70。两者误差量级接近,成因完全不同——只看 误差无法区分,必须同时报告峰值与相位。
修正波数把色散与耗散分开
把单个 Fourier 模态 代入格式,可得到修正波数 :
中心格式的 是实数,只改相位不改振幅,因此纯色散;迎风格式带正虚部,产生与波数相关的数值耗散。
取每波长 10 个网格点,。中心格式:,数值相速与真实相速之比为 ,即波以慢 6.4% 的速度传播,且不衰减。迎风格式:,单步振幅因子 的模为
取库朗数 :,故 。传播 200 步后振幅只剩 ——在这个分辨率下,一阶迎风会把波几乎完全抹掉,这正是它不能用于声学传播的原因。
把这两步写成脚本,可以避免手工代入出错:
import numpy as np
theta = 2 * np.pi / 10 # 每波长 10 个网格点
C = 0.8 # 库朗数
# 二阶中心差分:修正波数纯实数,只色散不耗散
print(f"相速比 = {np.sin(theta)/theta:.4f}") # 0.9356,波慢 6.4%
# 一阶迎风:单步振幅因子 |g|
g2 = (1 - C * (1 - np.cos(theta)))**2 + (C * np.sin(theta))**2
print(f"|g| = {np.sqrt(g2):.4f} 200 步后 = {np.sqrt(g2)**200:.2e}")
# |g| = 0.9689 200 步后 = 1.8e-03
参考资料
- Lele S. K., “Compact Finite Difference Schemes with Spectral-like Resolution”, Journal of Computational Physics, 103(1), 16-42, 1992.
- Tam C. K. W., Webb J. C., “Dispersion-Relation-Preserving Finite Difference Schemes for Computational Acoustics”, Journal of Computational Physics, 107(2), 262-281, 1993.
- Strand B., “Summation by Parts for Finite Difference Approximations for d/dx”, Journal of Computational Physics, 110(1), 47-67, 1994.
- Colonius T., Lele S. K., “Computational Aeroacoustics: Progress on Nonlinear Problems of Sound Generation”, Progress in Aerospace Sciences, 40(6), 345-416, 2004.
- Thompson J. F., Warsi Z. U. A., Mastin C. W., Numerical Grid Generation: Foundations and Applications, North-Holland, 1985.
- Gustafsson B., High Order Difference Methods for Time Dependent PDE, Springer, 2008.
- Mattsson K., Nordström J., “Summation by Parts Operators for Finite Difference Approximations of Second Derivatives”, Journal of Computational Physics, 199(2), 503-540, 2004.
- Shu C.-W., Essentially Non-Oscillatory and Weighted Essentially Non-Oscillatory Schemes for Hyperbolic Conservation Laws, NASA/CR-97-206253, ICASE Report No. 97-65, 1997.
- LeVeque R. J., Finite Difference Methods for Ordinary and Partial Differential Equations: Steady-State and Time-Dependent Problems, SIAM, 2007.
- Hirsch C., Numerical Computation of Internal and External Flows, Volume 1: Fundamentals of Numerical Discretization, Wiley, 1988.
- Ferziger J. H., Peric M., Computational Methods for Fluid Dynamics, 3rd ed., Springer, 2002.
- Carpenter M. H., Gottlieb D., Abarbanel S., “Time-Stable Boundary Conditions for Finite-Difference Schemes Solving Hyperbolic Systems: Methodology and Application to High-Order Compact Schemes”, Journal of Computational Physics, 111(2), 220-236, 1994.