4. 验证指标与误差范数选择

在PDE数值结果收敛性验证中,“误差”本身并不是一个数,而是一个依赖于范数的量。同一组数值解与精确解(或高分辨率参考解)之间的偏差,用不同范数度量会得到不同的数值,进而拟合出不同的收敛阶。因此,范数选择不是事后统计的细节,而是验证方案设计的一部分:它决定了你能否观察到理论收敛阶、能否识别局部缺陷、以及结论是否具有可比性。

设数值解为 u_h,参考解为 u,在网格节点或单元上定义误差 e = u_h − u。常用范数包括离散 L1、L2、L∞ 以及能量范数。离散 L1 范数 ‖e‖₁ = Σ|e_i|·w_i 反映误差的“总量”,对少数节点的大误差不敏感;L2 范数 ‖e‖₂ = (Σ|e_i|²·w_i)^{1/2} 兼顾整体与局部,是最常用的默认选择;L∞ 范数 ‖e‖∞ = max|e_i| 捕捉最坏点误差,对激波、边界层、奇点附近极为敏感;能量范数则把误差与其梯度(或通量)加权组合,例如 ‖e‖_E = (∫ a|∇e|² + c|e|²)^{1/2},直接对应变分形式的稳定性估计。

三类PDE的误差范数选择与收敛阶观测 椭圆型(如 Poisson) 光滑解、全局误差主导 首选:L2 与能量范数 L2:观测整体收敛阶 p 能量:对应稳定性估计 L∞:检查边界/角点 典型:P1 单元 L2 阶≈2 抛物型(如热方程) 空间+时间双误差源 首选:L2(空间)+ 时间L∞ 空间:L2 拟合 p 时间:末时刻 L∞ 或 L2 能量:衰减/稳定性分析 典型:CN 格式时间阶≈2 双曲型(如对流/波动) 间断、激波、色散误差 首选:L1 与 L∞ 并用 L1:对激波稳健 L∞:捕捉最坏点 L2:光滑区可用 典型:一阶格式 L1 阶≈1 收敛阶拟合:p ≈ log(‖e_h₁‖ / ‖e_h₂‖) / log(h₁ / h₂) • 同一问题换范数,p 可能不同:L∞ 常低于 L2,因最坏点受奇点/边界影响 • 网格加密序列 h, h/2, h/4 至少三级,避免单次比值误判 实操建议 ① 主指标固定为 L2,辅以 L∞ 做最坏点检查;② 双曲问题增加 L1 观察激波区; ③ 能量范数用于理论对照与稳定性验证;④ 报告时注明范数、网格序列与参考解来源。

范数选择对收敛阶估计的影响是实质性的。以二阶椭圆问题、分片线性有限元为例,理论上 L2 误差为 O(h²),能量范数为 O(h)。若你误用能量范数去“验证二阶精度”,会得到约一阶的拟合结果,从而错误地怀疑实现有误。反之,若在双曲守恒律的激波问题上用 L2 拟合,由于间断处误差不随 h 光滑衰减,观测阶往往明显低于格式的名义阶,甚至出现“阶数漂移”。因此,先明确理论预期的范数与阶,再选择匹配的度量,是验证流程的第一步。

具体到三类方程,建议如下。椭圆型问题解通常光滑(除非区域有角点或系数间断),L2 与能量范数最能反映整体精度,L∞ 用于检查边界层与角点附近的局部误差;若角点存在奇性,L2 阶可能被污染,此时应结合局部网格加密或加权范数。抛物型问题同时含空间与时间误差,应分别固定一个维度做收敛性研究:固定时间步长加密空间网格拟合空间阶,固定空间网格缩小时间步拟合时间阶,末时刻的 L∞ 或 L2 均可,但需在报告中说明取样时刻。双曲型问题最需要谨慎:光滑区可用 L2,含激波时优先用 L1(对间断更稳健)并辅以 L∞ 观察最坏点,能量范数在守恒性分析中有意义,但不适合直接用于含间断解的阶估计。

一个实用的做法是“主指标 + 辅助指标”组合:以 L2 作为主收敛指标贯穿全部算例,保证不同问题间可比;再针对问题特性附加 L∞(局部最坏点)、L1(间断稳健性)或能量范数(理论对照)。报告中同时给出范数定义、离散权重、网格序列与参考解来源,避免结论不可复现。

下面给出一个可直接套用的收敛阶计算与判读示例(示例参数为教学假设,非实测数据)。设某椭圆问题在 h = 1/16, 1/32, 1/64 三级网格上得到 L2 误差 3.2e-3, 8.1e-4, 2.0e-4,则相邻比值约为 3.95 与 4.05,对应 p ≈ log₂(3.95) ≈ 1.98、log₂(4.05) ≈ 2.02,与二阶理论一致;若同一数据用 L∞ 得到 1.1e-2, 5.6e-3, 2.9e-3,比值约 1.96,拟合阶约 0.97,说明最坏点误差以一阶衰减,提示角点或边界处理存在待查问题。这种“主指标达标、辅助指标异常”的组合,正是范数搭配使用的价值所在。

# 收敛阶拟合(示例,教学假设数据)
import numpy as np
h  = np.array([1/16, 1/32, 1/64])
e2 = np.array([3.2e-3, 8.1e-4, 2.0e-4])   # L2 误差
p  = np.log(e2[:-1] / e2[1:]) / np.log(h[:-1] / h[1:])
print("L2 拟合阶:", p)   # 期望接近 2.0

最后需要强调两点操作纪律。其一,参考解的来源必须与范数匹配:用解析解时可直接逐点求误差;用高分辨率数值解作参考时,应确保参考解误差远小于待测误差(一般低一到两个量级),否则拟合阶会被参考解“污染”而系统性偏低。其二,网格序列应保持几何相似(如统一二分),避免局部加密与全局加密混用导致阶估计失真。把范数选择、参考解构造与网格序列三者作为一个整体来设计,收敛性验证的结论才站得住脚。