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.59352.8
中38 万1.26354.1
细96 万1.00354.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 + 网格收敛阶),再做计算验证(GCI + 时间步 + 迭代)。代码验证不过关,后续所有计算验证都失去意义。
验证(Verification)方法体系与收敛性判据 代码验证 Code Verification 目标:证明程序实现正确 制造解方法 MMS 构造 u_m → 反推源项 S → 比对 观测收敛阶 p_obs p_obs ≈ 理论阶 → 代码通过 计算验证 Calculation Verification 目标:量化本次计算数值误差 网格收敛性 GCI 三套网格 → Richardson 外推 时间步 / 迭代收敛 Δt 减半 + 残差与监测量稳定 代码可信后 再评估计算误差 收敛性判据与误差预算 网格收敛 r = h_coarse / h_fine ∈ [1.3, 2.0] p_obs 接近理论阶 GCI < 工程允许误差 示例:GCI ≈ 0.17% 时间步收敛 Δt 逐次减半 相邻结果差异 < 0.5% 一阶/二阶格式对应误差斜率 关注量趋于稳定 迭代收敛 残差单调下降至容差 监测量同步稳定 残差达标 ≠ 解已收敛 两者都稳才算通过 三者共同构成数值误差预算,缺一不可

MMS 实操要点与常见陷阱

实施 MMS 时,制造解必须足够光滑(至少具有方程所需阶数的连续导数),且不能恰好被离散格式“精确”满足,否则观测阶会虚高。源项推导建议用符号计算工具完成,避免手工求导出错。边界条件也要由制造解导出,不能随意设为零,否则边界路径未被检验。

另一个常见陷阱是只做一套网格就宣称“收敛”。单套网格无法给出收敛阶,也无法估计离散误差。工程上至少三套网格,且网格比不宜过大或过小。若 p_obs 出现振荡或为负,通常意味着进入了渐近收敛区之外,需要继续加密或检查网格质量。

不要把“残差降到 1e-6”直接等同于“结果可信”。残差是方程不平衡量的度量,而关注量误差还受网格、时间步和条件数影响。验证报告应同时给出网格 GCI、时间步敏感性和迭代残差曲线。

综合来看,代码验证与计算验证构成验证的两条腿:MMS 与收敛阶检验保证“程序对”,GCI、时间步与迭代收敛保证“这次算得准”。只有两者都通过,后续的确认(Validation)才有可靠基础。