用途
本技能用于任何涉及物理单位或需要报告不确定度的计算。具体覆盖:单位换算(包括需要物理背景的换算,如波长到光子能量、质量到物质的量、能量到温度);通过测量模型传播不确定度(含或不含相关输入);依据校准证书、规格书和重复性数据构建 GUM 不确定度预算;选择包含因子并判断 k = 2 是否合理;对结果进行舍入与书写,使读者理解 ± 的含义;从曲线拟合中提取参数不确定度而不丢弃相关性;审查既有分析代码中隐藏的单位与不确定度缺陷;检查量纲一致的结果是否同时物理上可能(数量级、无量纲群及其隐含的工况)。本技能不涵盖统计推断、模型选择或研究设计。
主要能力
技能围绕两个库展开:pint 用于单位跟踪与换算,uncertainties 用于不确定度传播。核心工作流要求:在输入处附加单位、仅在输出处剥离单位;在函数边界用 ureg.wraps 或 m_as("unit") 换算,绝不在计算中途换算;在计算前显式写出测量模型,包括估计值为零的修正项;为每个输入给出估计值、标准不确定度、分布类型和自由度;用正确的除数换算 B 类陈述(证书的扩展不确定度除以其声明的 k,矩形限值除以 sqrt(3));在合成前识别相关性;计算灵敏度系数并从 c_i * u(x_i) 读取预算;检查线性化,同时运行蒙特卡洛并应用 JCGM 101 第 8 条比较;根据有效自由度选择 k;先舍入不确定度再按相同小数位舍入数值;说明 ± 是标准还是扩展、k 值、包含概率和方法;报告前对量级做合理性检查。
技能特别针对若干“能运行且给出看似合理数字”的失败模式:在未知尺度上剥离单位(.magnitude 返回的是量恰好携带的单位);偏移温度算术(摄氏与华氏是区间标度,温度的不确定度始终是差值,应使用 delta_ 单位);对数单位相加即相乘(dBm 相加得到的是功率乘积);往返转换破坏相关性(从标称值和标准差重建变量会创建独立变量);协方差矩阵被静默重缩放(curve_fit 默认会按约化卡方重缩放 pcov,当 sigma 是真实标准不确定度时应传 absolute_sigma=True);从未检查的线性化(如 y = x² 在 x = 1.0 ± 0.5 时,GUM 框架给出大部分为负的 95% 区间,而蒙特卡洛给出不同结果)。
使用方式
技能附带离线本地 CLI,所有辅助工具离线运行、拒绝 URL 和符号链接、限制输入、以私有权限原子写入输出,且未经 --force 拒绝覆盖。
安装(已验证 2026-07-26):pint 0.25.3(2026-03-19 发布,需 Python 3.11+)、uncertainties 3.2.3(2025-04-21 发布,需 Python 3.8+)、NumPy 2.5.1 与 SciPy 1.18.0(均需 Python 3.12+)。SciPy 1.18.0 的 scipy.constants 提供 CODATA 2022,SciPy 1.11 及更早提供 CODATA 2018。安装命令:
uv venv --python 3.13 source .venv/bin/activate uv pip install "pint==0.25.3" "uncertainties==3.2.3" "numpy==2.5.1" "scipy==1.18.0"
pint-pandas 和 pint-xarray 提供单位感知的列与数组,需单独安装。
各 CLI 用法:
propagate_uncertainty.py 在同一模型上运行两种传播方法并应用 JCGM 101 第 8 条验证测试。每个 --variable 为 name=value,standard_uncertainty[,distribution[,dof]],分布可为 normal、rectangular、triangular、arcsine 或 exact,仅控制蒙特卡洛采样。相关性以 --correlation "a,b=0.9" 传入。表达式被解析为抽象语法树,通过显式遍历 + - * / ** 和固定函数列表归约,绝不编译或执行。报告给出估计值、u_c、灵敏度系数、百分比预算、有效自由度、k、U、两个蒙特卡洛覆盖区间,以及线性化结果是否可报告的判定。
uncertainty_budget.py 合成按证书和数据表方式陈述的分量。每个分量命名一个分布以确定其除数(扩展除以 coverage_factor,矩形除以 sqrt(3),三角除以 sqrt(6),反正弦除以 sqrt(2),正态除以 1),可选 sensitivity、dof 和 relative: true。工具计算 u_c、Welch-Satterthwaite 有效自由度、来自 t 分布的 k 和 U,并在若干情形下警告。
format_result.py 返回舍入后的数值、括号记法、科学计数与 LaTeX 形式,以及必须伴随数字的句子。
convert_units.py 通过换算的局部导数传递不确定度,在换算需要背景时在错误信息中命名该背景,并标记偏移与对数单位。--list-contexts 显示注册表定义的内容。
audit_units.py 对既有分析代码做静态审查,只解析、绝不导入或运行。规则包括 UNIT001(一个模块中第二个 UnitRegistry)、UNIT002(偏移温度单位且无 delta_ 单位)、UNIT003(.magnitude 前无 .to(...) 或 .m_as(...))、UNIT004(对数单位)、UNC001(curve_fit 无 absolute_sigma)、UNC002(np.std / np.var 无 ddof)、UNC003(使用 uncertainties 的模块中出现 math 或 numpy 函数)、UNC004(从 .nominal_value 和 .std_dev 重建的 ufloat)、CONST001(与 CODATA 常数相差 0.1% 以内的字面量)。当发现项达到 --fail-on(默认 high)时退出状态为 1,可用作 pre-commit 或 CI 检查。规则为启发式,可用指令注释抑制误报,抑制次数会在报告中计数。
check_plausibility.py 测试一组量对无量纲群、特征尺度和精选量级带,并在报告数字前验证每个公式的量纲。--group 评估 14 个无量纲群之一并命名其工况;--scale 计算特征尺度如扩散时间、德拜长度或斯托克斯沉降速度;--band 将提供的量与观测范围比较。物理常数从 scipy.constants 在运行时读取而非写为字面量。量纲检查是关键:在公式需要动力粘度处传入运动粘度会在计算任何数字前被拒绝。当判定达到 --fail-on(默认 implausible;在量级带一个数量级内为 questionable)时退出状态为 1。
适用场景
适用于实验数据分析、计量与校准、工程计算、科学代码审查等需要单位跟踪与不确定度传播的场合。选择传播方法的建议:线性或近线性模型、近似正态输入、大自由度可用 GUM 框架;输入在 ±2u 范围内存在任何非线性时两者都运行并应用第 8 条测试;任一输入相对不确定度超过约 20% 时用蒙特卡洛;主导分量为矩形或其他非正态时用蒙特卡洛;输出有下界(方差、浓度、平方量)时用蒙特卡洛;输出分布不对称时用蒙特卡洛最短覆盖区间;相关输入时两者皆可,但须提供协方差矩阵而非仅标准不确定度。由矩形贡献主导的模型即使完全线性也会未通过第 8 条测试,此时估计值和 u_c 仍正确,只是区间过宽。
限制
本技能不涵盖统计推断、模型选择或研究设计。合理性检查的阈值为带软边的约定,并假设其相关性所拟合的几何,需参考 references/plausibility-scales.md 选择各情形下的特征长度。审计规则为启发式,可能产生误报。常数绝不应凭记忆输入:2019 年 SI 重新定义固定了 c、h、e、k 和 N_A,其相对标准不确定度为零,其余为测量值,会随 CODATA 版本变化。
参考文件
references/gum-methodology.md(A 类与 B 类评定、分布除数、传播律、Welch-Satterthwaite、框架失效情形、蒙特卡洛程序、第 8 条验证测试);references/pint-recipes.md(注册表、偏移与对数单位、上下文、wraps 与 check 的边界强制、NumPy 互操作、自定义单位、格式化);references/uncertainties-recipes.md(变量身份与相关性、correlated_values、umath 与 unumpy、格式规格、拟合协方差矩阵、包的限制);references/domain-conversions.md(能量阶梯、光谱学、浓度、压力、辐射与磁性、质谱、对数量、共享量纲但不共享含义的配对);references/reporting-rules.md(舍入、记法、必须伴随结果的句子、图中 SD 与 SEM 与 CI、未检出、符合性判定规则);references/plausibility-scales.md(选择特征长度、无量纲群及其门控的建模假设、特征尺度、观测量级带及其来源、每个阈值的注意事项)。
来源
已核对 2026-07-26:JCGM 100:2008、JCGM 101:2008 补充 1、NIST Technical Note 1297、CODATA 国际推荐值、PyPI 上的 Pint 0.25.3(2026-03-19 发布)、Pint 文档。