4. 验证(Verification)的核心方法
验证(Verification)回答的是一个纯数学问题:我们求解的离散方程,是否被计算机正确地解出来了?它与确认(Validation)关注“物理模型对不对”不同,验证关注“数值解是否收敛到离散方程的真解”。工程实践中,验证通常拆成两条并行又互补的路线:代码验证(Code Verification)与计算验证(Calculation Verification)。前者证明“程序实现没有错”,后者量化“这一次计算还剩多少数值误差”。
代码验证:证明求解器本身可信
代码验证的目标是排除编程错误、边界条件实现错误、离散格式实现错误。它不依赖具体工程问题,而是用已知解析解或已知收敛阶的构造问题来检验代码。核心手段是制造解方法(Method of Manufactured Solutions, MMS)与网格/时间步收敛性验证。
MMS 的思路是“反向构造”:先人为指定一个光滑的解析函数作为“制造解”,例如对一维对流扩散方程取
u_m(x,t) = sin(πx) · exp(-t)
把它代入控制方程,得到非零的源项 S(x,t),再把该源项作为已知输入加入求解器。这样,程序算出的数值解应当逐步逼近这个制造解。由于制造解是解析的,我们可以精确计算离散误差,并统计误差随网格尺寸 h 的下降速率,即观测收敛阶 p_obs。
判断标准很明确:若离散格式理论精度为二阶,则 p_obs 应接近 2;若明显偏离(如只有 1.2 或出现负值),说明代码实现存在缺陷。MMS 的优点是能覆盖内部单元、边界单元、源项、时间项等所有代码路径,是代码验证中最有力的工具。
计算验证:量化本次计算的数值误差
计算验证针对具体工程算例,回答“这次算得够不够准”。它不追求证明代码正确,而是估计离散误差、迭代误差与舍入误差的量级。常用方法是网格收敛性分析、时间步收敛性分析与迭代收敛性分析。三者共同构成数值误差预算。
网格收敛性分析
网格收敛性分析通过系统加密网格,观察关注量(如阻力系数、最大温度、应力峰值)的变化。工程上常用网格收敛指数(GCI)方法:至少使用三套网格,网格尺寸比 r = h_coarse / h_fine 建议取 1.3~2.0,且保持拓扑一致。
以某换热器仿真为例,假设关注量为出口平均温度 T_out,三套网格结果如下(示例数据,用于说明方法):
| 网格 | 单元数 | h 相对值 | T_out (K) |
|---|---|---|---|
| 粗 | 12 万 | 1.59 | 352.8 |
| 中 | 38 万 | 1.26 | 354.1 |
| 细 | 96 万 | 1.00 | 354.6 |
用相邻网格差值比估计观测阶:p = ln((T3-T2)/(T2-T1)) / ln(r),代入得 p ≈ 1.8,接近二阶。再用 Richardson 外推得到 T_extrap ≈ 354.9 K,细网格相对外推值的 GCI 约为 0.17%。若该值小于工程允许误差(如 1%),可认为网格已收敛。
时间步收敛性与迭代收敛性
瞬态问题还需做时间步收敛性分析:固定网格,将时间步 Δt 依次减半,观察关注量随 Δt 的变化。若时间格式为一阶,误差应大致随 Δt 线性下降;若为二阶,则按平方下降。当相邻时间步结果差异小于设定阈值(如 0.5%)时,可认为时间步收敛。
迭代收敛性针对线性/非线性求解器。每次迭代的残差应单调下降并达到设定容差。实践中要区分“残差下降”与“解已收敛”:残差降到 1e-6 但关注量仍在漂移,说明容差过松或存在病态。建议同时监控残差与关键监测量,两者都稳定才算迭代收敛。
MMS 实操要点与常见陷阱
实施 MMS 时,制造解必须足够光滑(至少具有方程所需阶数的连续导数),且不能恰好被离散格式“精确”满足,否则观测阶会虚高。源项推导建议用符号计算工具完成,避免手工求导出错。边界条件也要由制造解导出,不能随意设为零,否则边界路径未被检验。
另一个常见陷阱是只做一套网格就宣称“收敛”。单套网格无法给出收敛阶,也无法估计离散误差。工程上至少三套网格,且网格比不宜过大或过小。若 p_obs 出现振荡或为负,通常意味着进入了渐近收敛区之外,需要继续加密或检查网格质量。
综合来看,代码验证与计算验证构成验证的两条腿:MMS 与收敛阶检验保证“程序对”,GCI、时间步与迭代收敛保证“这次算得准”。只有两者都通过,后续的确认(Validation)才有可靠基础。