观测收敛精度阶——故障排查指南
更充实的内容请在 mms-convergence-rate.html 查看。
观测精度阶的计算——基本式与应有的样子
用MMS(制造解法)或精确解基准做代码验证时,最终的合格判定要落在观测收敛阶上。在加密比为 \( r \) 的网格序列上测得误差范数 \( E_h \),观测精度阶为
$$ p_{obs} = \frac{\ln(E_{rh}/E_h)}{\ln r} $$
它渐近到离散格式的名义精度阶(形式阶)即为合格。验证健全时,\( \log h \)-\( \log E \) 图上的点会落在理论斜率的直线上,网格越细斜率越靠近理论值。本页以"误差测量方式本身出错"为主线,按症状逐一排除这个数字"出不来、乱跳、不敢信"的成因。方程一侧的成因(边界、源项、限制器)请一并参考NS篇与源项篇。
症状0:误差的测量方式本身就错了(最高频)
我在粗网格和细网格上测了误差,可算出来的阶数一会儿1.3一会儿2.8,每次跑都不一样……
怀疑方程和代码之前,先审查误差范数的计算流程本身。测精度阶是要分辨误差两到四个数量级变化的精密测量,测法上的粗糙会原样变成阶数的混乱。三个检查点:①精确解的取值位置是否与数值解完全一致(格心?节点?积分点?);②范数里是否加了权重——非均匀网格上取简单平均,会扭曲粗区与细区的贡献;③有没有把单元平均量与点值混用——有限体积的解是单元平均,精确解也必须按单元平均(或含 \( h^2 \) 阶修正)来比,否则单这一条就会叠上二阶的噪声。
离散 \( L^2 \) 范数的标准形式是带体积权重的。
$$ E_h = \left( \frac{\sum_i V_i \, (u_i - u_i^{exact})^2}{\sum_i V_i} \right)^{1/2} $$
正如这个式子所示,只要守住①同位置取值、②体积权重、③解的种类(点值/单元平均)一致这三条,"阶数乱跳"的问题相当一部分就消失了。
症状1:精度阶一贯低于理论值
| 检查项 | 内容 |
|---|---|
| 全周期测试 | 用各方向全周期的制造解只验证内部格式。这里能出阶数,说明元凶是边界处理(低阶的边界外推、边界条件不一致) |
| 范数种类 | 只有 \( L^\infty \) 偏低,说明是局部掉阶(角点、边界层)。\( L^2 \) 正常则整体是健全的 |
| 迭代收敛的深度 | 每一级是否把迭代残差压到比离散化误差低两个数量级以上。网格越细误差越小,判据越容易被"蒙混",要留意停滞 |
| 源项与初始条件的精度 | 源项的数值积分阶数、初始条件的投影精度,是否低于格式本身的精度阶 |
| 解的光滑性 | 若制造解或精确解自身带奇性(角点处解的低正则性),掉阶就是理论所预言的=代码无罪 |
症状2:精度阶在各级之间振荡、不单调收拢
两点式 \( p_{obs} = \ln(E_{2h}/E_h)/\ln 2 \) 只用相邻两级,因而对噪声敏感。对策分两步。
- 增加网格级数做最小二乘拟合——对4~5级的 \( (\ln h_i, \ln E_i) \) 拟合直线,斜率作为精度阶的估计值,残差作为噪声的指标。同时并列给出两点式的"相邻对精度阶",就能看出渐近推进的过程
- 缩小噪声源——振荡消不掉时,按(a)网格序列缺乏系统性(自动网格生成器改变了单元排布)、(b)舍入误差地板(见下)、(c)迭代提前截断的顺序排查
其中(a)在非结构网格上尤其高发。仅就验证算例而言,采用结构网格的均匀加密(或同拓扑的相似加密)是稳定精度阶测量最可靠的手段。
症状3:网格越细精度阶先封顶后劣化
误差除离散化误差外,还有舍入误差与迭代截断误差构成的"地板",加密到接近这个地板时表观精度阶就会下降。诊断很简单,看误差的绝对值。若 \( E_h \) 已落到 \( 10^{-10} \) 量级(接近双精度有效位的极限),再细的网格就不能用于测精度阶了。对策是:①加大制造解的幅值,相对压低地板;②在较粗的几级上评估精度阶;③把迭代求解器的判据进一步收紧。"越细越好"在精度阶测量中并不成立——诀窍是在渐近区与地板之间那个"可用窗口"里测。
症状4:精度阶高于理论值
二阶格式测出三~四阶时,先别高兴,该怀疑的是:①还没进入渐近区(在误差高阶项占优的前渐近区,表观精度阶向上向下都可能偏摆);②误差项的偶然相消——对称性很高的制造解、或特定波数下主误差项消失所致的"超收敛"。确认方法是换一个波数与相位都错开的制造解重测。若仍出高阶,那就该反过来审视自己对该格式名义精度阶的理解(截断误差分析)。在报告中附上"换制造解也是同样趋势"的确认,是避免误报超收敛的规矩。
症状5:时间精度阶测不好
非定常问题的时间精度阶测量,难点在于空间误差与时间误差混在一起。
- 固定空间,只变 \( \Delta t \)——此时空间误差会作为地板残留,所以序列要设计在时间误差大于该地板的范围内
- 固定误差的测量时刻——在同一物理时刻 \( t^* \) 比较,并选取能让最后一步正好落在 \( t^* \) 上的 \( \Delta t \)(混入零头步会污染精度阶)
- 时空同时加密——按 \( \Delta t \propto h \)(或 \( h^2 \))同时加密测复合精度阶也是一种做法,但解释起来困难,首选还是分离测量
- 关掉可变时间步长——自动步长控制一旦生效,序列的 \( \Delta t \) 就不会按设计走
精度阶测量的质量清单
- 误差范数:是否确认了同位置取值、体积权重、解的种类(点值/单元平均)一致
- 网格序列:是否为系统性加密(可能的话用均匀加密)。是否计算了实效加密比
- 级数:是否用3级以上(推荐4~5级)并列给出最小二乘拟合与相邻对精度阶
- 迭代残差:每一级是否收敛到离散化误差的1/100以下
- 地板确认:最细一级的误差绝对值是否已接近舍入/截断地板
- 换制造解复现:改变波数与相位后是否仍得到相同的精度阶
- 时间与空间的分离:非定常时是否固定一方再测另一方
清单好长……说到底,测精度阶最要紧的心法是什么?
就是"测精度阶是一场实验"这个心法。实验离不开仪器校准与误差评估,测精度阶同样需要对误差范数做校核(校准仪器)与管控噪声源(控制环境)。图上有点不落线时,先怀疑测量流程,再怀疑代码里的bug——只要守住这个顺序,查因的时间就能缩短一个数量级。等测量流程定型了,就把它脚本化,和源项的自动推导一起做成回归测试。精度阶测量不该是一次性的仪式,做成持续守护代码的自动化安全网,价值才显现出来。
相关文章:MMS概要(整合版)、MMS源项的自动推导、GCI的故障排查(把同一个观测精度阶用于解验证的场合)。
帮助
更多
错误