ASME V&V 20 验证度量
ASME V&V 20 验证度量的理论基础
什么是验证度量
老师,验证度量是用来计算什么的?模拟和实验是否一致,只要输出简单的误差%不就行了吗?
问得好。确实有很多人会说"模拟值和实验值的差异是多少%"就完事了。但这个方法不够严谨。为什么呢?因为实验数据和模拟计算都存在不确定性。
比如,实验测得的应力是100 MPa,模拟结果是105 MPa。误差5%,好像挺接近的。但如果实验的测量精度是$\pm 8$ MPa,模拟的网格依赖性是$\pm 3$ MPa,那么这5 MPa的差异其实在不确定性范围内。换句话说,模拟和实验"是相容的"。
我明白了…只看误差本身不够,还要考虑"这个误差的真实意义"。
正是这样。ASME V&V 20(《计算流体力学和传热的验证与验证标准》)就是为了建立这样的框架。验证度量就是在考虑了双方不确定性的前提下,定量评估模拟结果和实验数据的一致程度的指标。
比较误差 E 的定义
具体怎么计算呢?
首先是比较误差 E(Comparison Error)。非常简单:
其中$S$是模拟结果(Simulation),$D$是实验数据(experimental Data)。
这是带符号的差。如果$E > 0$表示模拟高估,$E < 0$表示模拟低估。当然,有时候也用相对误差$E/D$,但ASME V&V 20的基础框架主要用绝对值的$E$。
我刚才说的,单看$E$不够吧?
正确。下一步就是计算验证不确定性$u_\text{val}$,然后把$E$和$u_\text{val}$进行比较。
验证不确定性 $u_\text{val}$
验证不确定性具体包含哪些不确定性呢?
ASME V&V 20把不确定性分为三大类:
- $u_\text{num}$(数值不确定性):网格依赖性、时间步长依赖性、迭代收敛残差等,来自离散化的不确定性。通常用GCI(网格收敛指标)来评估。
- $u_\text{input}$(输入参数不确定性):材料物性值、边界条件、初始条件的测量精度或变异。比如杨氏模量是$210 \pm 5$ GPa,那$\pm 5$ GPa就是输入不确定性。
- $u_\text{exp}$(实验不确定性):传感器精度、测量位置偏差、环境波动等实验侧的不确定性。
假设它们相互独立,则用RSS(平方和的平方根)合并:
这和误差传递时用的公式一样啊。
完全一样。这就是GUM(《测量不确定性的表示与评估指南》)的思路。不过有两个要点。第一,如果不确定性源之间存在相关性,还要加入相关项。第二,这里的不确定性通常是指标准不确定性($k=1$,约68%置信区间),但有时也用95%置信区间($k=2$),一定要在报告里明确说明。
判定基准:$|E|$ vs $u_\text{val}$
$E$和$u_\text{val}$有了,怎么判断"合格"或"不合格"呢?
很简单。ASME V&V 20的基本思路是这样的:
- $|E| \leq u_\text{val}$ 的情况:比较误差在不确定性范围内。此时无法区分模拟和实验的差异是来自模型误差还是不确定性。判定为验证成功。
- $|E| > u_\text{val}$ 的情况:存在不能由不确定性解释的差异。这表明模型误差(model form error)存在。需要改进模型。
等等,如果不确定性很大,那什么都能"合格"了吧?
反应敏锐!正是关键点。$|E| \leq u_\text{val}$不是说"模型正确",而是"在现有不确定性水平下,无法检出模型误差"。
所以,验证的质量取决于$u_\text{val}$的大小。要得到好的验证,就要用更精密的实验、更细密的网格、更精准的物性值,把不确定性压低。这才是V&V的本质。
面积度量(Area Metric)
$E$和$u_\text{val}$的比较是针对单一点的,对吧。如果响应是分布形式呢?比如温度分布?
好问题。这种情况下用面积度量(Area Validation Metric)。Ferson等人在2008年提出的方法,思路是比较模拟和实验的累积分布函数(CDF)。
这里$F_S(y)$是模拟结果的CDF,$F_D(y)$是实验数据的CDF。
$d_\text{area}$是非负值,当两个CDF完全重合时为0。优点是:
- 反映分布特征(不仅是平均值,还包括散布和偏度)
- 可以把多个响应量合并成一个数字
- 容易设定阈值(比如$d_\text{area} < 0.1$为合格)
例如汽车碰撞测试时,可以把加速度时间历程看作一批样本,作CDF比较,用面积度量来统一评估。
CDF的面积差,比单点比较能更全面地看到问题呀。
u-pooling法
验证点有很多个怎么办——比如有10个测点或5个工况——要怎么统一评估呢?
这就是u-pooling法(Ferson & Oberkampf, 2009)的用处。思路是:
- 对每个验证点$i$,根据实验数据$D_i$的分布构造CDF $F_{D_i}$
- 看模拟值$S_i$在这个CDF上的位置:$u_i = F_{D_i}(S_i)$
- 如果模型完美,这些$u_i$应该服从$[0, 1]$的均匀分布
- 把所有$\{u_1, u_2, \ldots, u_n\}$的CDF与标准均匀分布比较
如果$u_i$明显偏离均匀分布,说明模型有系统性的偏差。比如$u_i$都集中在0附近,就是"模拟系统性地低估";都集中在1附近,就是"系统性地高估"。
实际操作中,一般用Kolmogorov-Smirnov检定(KS检定)或Anderson-Darling检定来检验与均匀分布的偏差。
这样就能把各种条件下的结果统一起来,看"这个模型总体怎么样",很实用。
ASME V&V 20 验证度量的数值计算方法
不确定性的定量化方法
理论明白了。但实际上,$u_\text{num}$和$u_\text{input}$这些值怎么算出来呢?有标准步骤吗?
$u_\text{num}$最常用的方法是Richardson外推法 + GCI。步骤是:
- 用3种或以上网格密度(粗、中、细)解同一问题,代表网格尺寸分别为$h_1 > h_2 > h_3$
- 设定细化比 $r = h_1 / h_2$(通常$r \approx 1.3\sim2.0$)
- 计算表观收敛阶数$p$:
其中$f_1, f_2, f_3$分别是粗、中、细网格的解。然后计算GCI:
安全系数$F_s = 1.25$(三层外推)。这个$\text{GCI}_\text{fine}$就是$u_\text{num}$的估计。
用三种网格的结果推断"真解离得有多远"是吧。
蒙特卡洛法的结合
$u_\text{input}$呢?输入参数有十几个、几十个的情况,逐一求灵敏系数太麻烦了…
这时就用蒙特卡洛法。思路是:
- 给每个输入参数设定概率分布(正态分布、均匀分布等)
- 用Latin Hypercube Sampling(LHS)等方法生成$N$个样本集($N = 100 \sim 10{,}000$)
- 每个样本跑一遍模拟,得到$N$个响应值
- 响应的标准差就是$u_\text{input}$
问题是,如果一次模拟要好几小时,跑1000次就太费时了。实务中通常先建立代理模型(响应面法、Kriging、多项式混沌展开PCE),再用代理跑蒙特卡洛,这样成本可以降下来。
灵敏度分析的贡献分解
$u_\text{val}$太大,用不了,这时怎么办?要不要全部改进?
这就要用不确定性预算(Uncertainty Budget)。分解$u_\text{val}^2 = u_\text{num}^2 + u_\text{input}^2 + u_\text{exp}^2$中各项的贡献比例。
例如,某工程中$u_\text{val} = 12.5$ MPa,分解如下:
| 不确定性成分 | 值 [MPa] | 二乘贡献率 | 改进措施 |
|---|---|---|---|
| $u_\text{num}$ | 3.2 | 6.6% | 网格细分化 |
| $u_\text{input}$ | 11.0 | 77.4% | 提升材料试验精度 |
| $u_\text{exp}$ | 5.0 | 16.0% | 校准测量系统 |
| $u_\text{val}$(合成) | 12.5 | 100% | — |
看这个表,$u_\text{input}$占77.4%主导。那就没必要把网格无限细化,而应该集中精力提高材料物性值的精度。这样做预算管理才是高效的。
ASME V&V 20 验证度量的实务应用
验证计划的制定
实际做验证时,第一步是什么?直接算$E = S - D$吗?
那就错了。要先制定验证计划。ASME V&V 20推荐用PIRT(现象识别排序表)来指导,步骤是:
- 明确SRQ(系统响应量):要比较什么?最大应力?温度分布?流速剖面?不能模糊地说"结果是否吻合"。
- 设定精度要求$\delta_\text{req}$:能接受多大的误差?没有这个指标,就无法判断"合格"。
- 制定实验方案:在哪些参数范围、用什么方法、测多少次。要保证不确定性足够小。
- 先完成代码验证(Verification):在做验证前,代码的数值精度必须过关。有数值bug就验证不了。
所以不是直接拿结果对比,而要事前规划好。
实验数据的质量管理
实验的不确定性$u_\text{exp}$,就直接问实验人员"给个不确定性"吗?
理想情况是这样,但现实常常不行。你得自己确保数据品质。实务中要做的是:
- 重复测量:最少3次,最好5次以上。从标准差评估A类不确定性。
- 确认系统误差:查传感器的校准证书,确认精度等级。位置精度(比如应变片贴装位置偏差)也算B类不确定性。
- 记录测量条件:温度、湿度、电源噪声等,都要写下来。这些会影响模拟的边界条件设定。
- 处理离群值:用Chauvenet准则或Grubbs检定来客观判定离群值。不能凭直觉"这个数据看起来很奇怪,删了"。
实务中只有一次实验数据的情况也多,那怎么办?
那就没办法估A类不确定性,只能靠B类(校准资料、公称精度等)。$u_\text{exp}$就要设得保守一些。这样的话,$u_\text{val}$会偏大,验证的"分辨率"就下降了。这是为什么实验计划时一定要确保能重复测量的原因。
报告中应包含的内容
验证报告里一定要写什么?
按照ASME V&V 20的要求,必须包括:
- SRQ的定义和精度要求$\delta_\text{req}$
- 比较误差$E = S - D$的数值(多个测点就列表)
- 不确定性的分项:$u_\text{num}$、$u_\text{input}$、$u_\text{exp}$各多少,怎么算的
- 验证不确定性$u_\text{val}$及其信赖度($k=1$还是$k=2$)
- 判定结论:$|E| \leq u_\text{val}$吗?还是用了面积度量或u-pooling
- 验证的适用范围:这个结论对哪些参数范围、工况有效。外推到其他条件需要另外评估。
ASME V&V 20 验证度量的ASME V&V 20 验证度量的软件比较
主要工具的V&V功能
验证度量的计算,商用软件里有吗?还是全靠手工?
2020年代,主要求解器开始集成V&V支持功能,但没有"一键完成"的按钮。现状整理如下:
| 工具 | GCI / 网格收敛 | 不确定性传播 | 面积度量 | 说明 |
|---|---|---|---|---|
| Ansys(Workbench) | Design Exploration支持 | Monte Carlo / PCE支持 | 需外部工具 | 可构建V&V 20兼容工作流 |
| Abaqus / Isight | 脚本实现 | Isight DOE/Monte Carlo | 需外部工具 | Python脚本功能强大 |
| COMSOL | 参数扫描支持 | Uncertainty Quantification Module | 需外部工具 | MATLAB LiveLink可扩展 |
| Star-CCM+ | Design Manager支持 | Monte Carlo支持 | 需外部工具 | 后处理可定义自定义度量 |
| Dakota(Sandia) | 支持 | PCE / SC / Monte Carlo | 支持 | 开源UQ工具,通用求解器接口 |
Dakota是什么?
Sandia国家实验室开发的开源优化和不确定性量化(UQ)框架。可以作为任意模拟代码的包装层,统一接口支持LHS、PCE、贝叶斯推断等。如果要完整实施ASME V&V 20框架,Dakota是最直接的选择之一。
开源中的实现
想用Python自己写验证度量的计算,可以吗?
完全可以。其实代码相当简洁。核心部分大概是这样:
import numpy as np
from scipy import stats
def validation_comparison(S, D, u_num, u_input, u_exp):
"""ASME V&V 20 验证比较"""
E = S - D # 比较误差
u_val = np.sqrt(u_num**2 + u_input**2 + u_exp**2) # 验证不确定性
passed = abs(E) <= u_val
return E, u_val, passed
def area_metric(sim_samples, exp_samples, n_bins=200):
"""面积度量(CDF差的面积)"""
all_vals = np.concatenate([sim_samples, exp_samples])
y_grid = np.linspace(all_vals.min(), all_vals.max(), n_bins)
cdf_sim = np.array([np.mean(sim_samples <= y) for y in y_grid])
cdf_exp = np.array([np.mean(exp_samples <= y) for y in y_grid])
dy = np.diff(y_grid)
d_area = np.sum(np.abs(cdf_sim[:-1] - cdf_exp[:-1]) * dy)
return d_area
def u_pooling(S_values, D_distributions):
"""u-pooling法:各点的u值集约"""
u_values = []
for S_i, (D_mean, D_std) in zip(S_values, D_distributions):
u_i = stats.norm.cdf(S_i, loc=D_mean, scale=D_std)
u_values.append(u_i)
# KS检定与均匀分布的比较
ks_stat, p_value = stats.kstest(u_values, 'uniform')
return np.array(u_values), ks_stat, p_value
想象中要复杂得多,其实有scipy就差不多了呢。
ASME V&V 20 验证度量的前沿研究
贝叶斯估计方法
最近听说验证也用贝叶斯?那是什么?
传统的ASME V&V 20是频率学派的方法,但近年用贝叶斯推断来做验证也很流行。思路是把模型参数本身看作随机变量,用贝叶斯定理更新:
其中$\boldsymbol{\theta}$是模型参数,$\mathbf{D}$是实验数据。优点是:
- 纳入先验知识:用文献值或过往实验作$P(\boldsymbol{\theta})$
- 数据增量学习:新的实验可以逐步更新后验分布
- 模型比较:用贝叶斯因子量化"哪个模型对数据的解释力更强"
NASA和Sandia等都在研究"贝叶斯V&V",特别在数据稀少条件下很有用。
机器学习与代理模型
蒙特卡洛法要跑数千遍模拟,这太费时。AI能解决吗?
这正是最热的研究方向。用代理模型(surrogate model)来加速:
- 高斯过程(Kriging):少量样本就能建立响应面,还能同时输出预测的不确定性。很适合参数不多的情况。
- 多项式混沌展开(PCE):把输入的概率分布展开成多项式。解析地计算矩(平均值、方差),比蒙特卡洛高效得多。
- 深度神经网络:对高维参数空间很能伸缩。但是黑盒,不好解释物理意义。
要点是,代理模型自己有近似误差,也要纳入$u_\text{input}$的评估中。不能因为用了AI就忽视这个误差源。
ASME V&V 20 验证度量的故障排除
常见失败模式
验证实施时容易犯什么错?前辈说"只看度量数字别高兴太早",怎么回事?
实务中最常见的陷阱:
1. 忽视不确定性,直接看误差百分比
- 症状:"误差3%,合格"或"误差8%,不合格",完全不考虑$u_\text{val}$
- 对策:必须评估$u_\text{val}$,拿$|E|$和它比。3%的误差若$u_\text{val} = 1\%$就失败;8%的误差若$u_\text{val} = 10\%$就成功。
2. 漏掉网格收敛确认
- 症状:"网格够细了吧"凭感觉,不算GCI
- 对策:必须用3种以上网格跑GCI。主观判断"足够细"是不可靠的。
3. 外推到验证范围之外
- 症状:在流速10 m/s验证,用到流速100 m/s的工况
- 对策:验证只对已验证范围有效。超出范围需要PCMM(预测能力成熟度模型)等额外评估。
4. 实验条件与模型不符
- 症状:忽视实验的几何公差、固定方式细节,模拟用"理想"模型
- 对策:从实验现场照片和图纸确认所有细节,模拟要忠实再现。"理想固定"和"螺栓连接"完全不同。
度量不佳时的对策
$|E| > u_\text{val}$了,该咋办?
别慌。有系统的诊断方法:
- 先看不确定性预算:哪个$u$项支配$u_\text{val}$?$u_\text{num}$支配说网格还是粗;$u_\text{input}$支配说输入参数精度要提高。
- 分析$E$的符号模式:全是$E > 0$(系统性高估)?可能材料物性或边界条件有偏差。随机分布?物理模型有问题。
- 做灵敏度分析:哪个输入参数对$E$影响最大?用Sobol指标或其他全局灵敏度方法。
- 复查物理模型:湍流模型选对了?接触条件对吗?材料构成关系合理吗?
- 再审视实验数据:虽然少见,但实验也会出问题。传感器故障?数据记录时间错位?缩放错误?
逐项排查,"一次只改一个"是吧。
完全同意。还有一个重要的心态:$|E| > u_\text{val}$不一定是"失败"。它说明了模型的边界。"这个模型在这个工况超出不确定性范围"这本身就是V&V的成果。我们的工作是定义这个边界,然后决策"安全系数怎么开"或"这个工况不能用这个模型"。这才是V&V的真目的。
更多
错误