本文档基于 DataLab 当前源码实现,目的是说明:各功能模块背后的数学模型、默认假设、以及“计算结果包含哪些内容”。若界面文案与本实现不一致,以代码行为为准。
DataLab 的核心计算统一使用 mpmath 的 mp.mpf(多精度浮点)。多数计算入口会临时设置 mp.dps(十进制有效位数),以兼顾高精度与可重复性。
- 括号记号:
value(digits)[exp]
1.2345(67)表示1.2345 ± 0.00671.2345(67)[-2]表示(1.2345 ± 0.0067) × 10^-2
- 独立 σ 列:在数据表中单独提供一列
sigma(或界面指定的 σ 列)。
公式系统会把表头列名规范化为安全标识符(将非字母数字替换为 _,首字符为数字则加前缀),并在必要时用 _2/_3... 去重。
- 误差传递:支持旧式
x1/x2/...,会在计算前替换为规范化列名(并可产生提示)。 - 外推自定义公式:支持列名、
x1/x2/...,并额外支持A/B/C指代前三列(兼容三点外推习惯)。
三处自定义公式共享同一套解析与白名单:data_extrapolation_latex_latest.py:safe_eval。
- 支持:数字、变量名、括号、
+ - * / ** %、一元+/-、函数调用(仅限白名单)。 - 支持 Mathematica 风格:
Sin[x](中括号会自动转圆括号)、^(自动转**)。 - 禁止:属性访问(如
a.__class__)、关键字参数、任意对象/字符串常量、以及所有不在白名单中的语法节点。 - 错误风格:抛出与外推/误差传递一致的
ValueError,并保持一致的中文/英文双语消息结构。
常数(区分大小写):
Pi,E
函数(需首字母大写):
- 基本:
Sin,Cos,Tan,Asin,Acos,Atan,Sinh,Cosh,Tanh,Asinh,Acosh,Atanh - 指数/对数:
Exp,Log,Ln,Log10,Sqrt,Power - 常用:
Abs,Erf,Gamma - 特殊函数:
Zeta,Hyp0f1,Hyp1f1,Hyp2f1,PolyLog,BesselJ,BesselY,Airy
外推模块对“多列序列数据”逐行计算外推值 V 与不确定度估计 U,并返回每行的元信息(method/details)。
对三列数据 A,B,C:
- 外推值:
V = ((C - B)^2) / (B - A) + C - 不确定度(保守差异上界):
U = max(|V-A|, |V-B|, |V-C|)
当 B≈A 时避免除零:退化取 V=C,并仍用上式差异定义 U。
幂律模型假设:
E(x) = E_inf + a * x^(-p)
输入:三点能量 (E1,E2,E3) 与三点基数 (x1,x2,x3)。
实现步骤(高精度):
- 计算比值
R = (E1-E2)/(E2-E3) - 解方程:
(x1^{-p}-x2^{-p})/(x2^{-p}-x3^{-p}) = R得指数p - 求振幅:
a = (E1-E2)/(x1^{-p}-x2^{-p}) - 外推:
E_inf = E1 - a*x1^{-p}
调用 mpmath 的序列加速实现,并输出 metadata(例如 error_estimate、cancellation_weight 等)供诊断。
除 “默认三点公式” 外,幂律外推/序列加速/自定义公式的 U 统一取:
U = |V - reference|
参考列默认第三列;也可指定,或使用 auto_max_diff 自动选择“与 V 差异最大的列”作为参考列,以获得更保守的 U。
逐行输出(核心字段):
value:外推值Vuncertainty:外推不确定度Umethod:方法标识details:方法相关信息(例如reference_column、幂律的exponent/amplitude、加速器metadata、自定义formula)
误差传递模块对每一行带不确定度的数据,根据公式 f(x) 计算输出值与输出不确定度。
σ_f = sqrt( Σ ( ∂f/∂x_i * σ_i )^2 )
二阶(order=2)会在一阶项基础上加入 Hessian 的二阶贡献,并对输出值做均值修正(更接近 Monte Carlo 的输出均值):
E[f] ≈ f(μ) + 1/2 * Σ_i (∂²f/∂x_i²) * σ_i²Var[f] ≈ Σ_i (∂f/∂x_i)² σ_i² + 1/2 * tr((H Σ)²)
其中 H 为 Hessian,Σ 为输入协方差矩阵;当前实现默认 Σ 为对角阵(独立假设)。
实现优先尝试符号微分(Sympy),若失败则回退到数值差分。
数值偏导使用中心差分:
∂f/∂x ≈ (f(x+h) - f(x-h)) / (2h)
步长 h 会随 mp.dps 自适应(经验上:一阶 h ~ eps^(1/3),二阶 h ~ eps^(1/4),并按 max(1,|x|) 缩放),以平衡截断误差与舍入误差。
程序会对公式做 AST 扫描,识别实际引用的列/常数,只对这些输入计算偏导与贡献;若公式无法解析,则退回“对所有输入传播”的旧行为(保证兼容)。
contrib_i = ( ∂f/∂x_i * σ_i )^2σ_f^2 = Σ contrib_i
逐行输出(核心字段):
value:- Taylor
order=1:f(μ)(工作点处的公式值) - Taylor
order=2:≈ E[f](含均值修正) - Monte Carlo:样本均值
- Taylor
uncertainty:输出的标准不确定度(标准差)contributions(可选):每个输入的方差贡献
残差:r_i = y_model(x_i; p) - y_i
- 非加权:
χ² = Σ r_i^2 - 加权:
χ² = Σ w_i * r_i^2,常用w_i = 1/σ_i^2
线性模型形如 y ≈ Σ b_j φ_j(x),用 QR 分解解最小二乘;加权时对设计矩阵行做 sqrt(w_i) 缩放。
自定义模型表达式与外推/误差传递共享 safe_eval,参数偏导用同一套数值偏导(中心差分),求解用 mp.findroot 解 ∂χ²/∂p_j = 0。
模板:
- 幂律极限:
A*x**(-p) + C - Padé(m|n):有理函数形式
J_{i,j} = ∂y_model/∂p_j(最优参数处;加权时行缩放sqrt(w_i))Cov ≈ (J^T J)^{-1} * (χ²/dof)σ(p_j) = sqrt(Cov_{j,j})
若矩阵奇异/病态,会告警并把不确定度置为 NaN。
- 统计误差:由协方差矩阵对角线得到
- 系统误差:未加权但提供数据 σ 时,通过整体
y±σ重拟合估计 - 总误差:二次和
sqrt(stat^2 + sys^2)
在桌面端:
- 勾选“统计误差加权”时,使用
w=1/σ²做 χ² 加权与协方差估计,并不再单独叠加系统误差(避免双计)。 - 不勾选时,σ 会用于
y±σ重拟合的系统误差估计。
params:参数最优值param_errors_stat/sys/total:误差分量与总误差covariance:协方差矩阵residuals:残差序列fitted_curve:拟合曲线(逐点)chi2/reduced_chi2/aic/bic/r2/rmse:拟合优度指标details:表达式、告警等
- 算术平均(样本/总体):均值、标准差、均值标准误差
- 加权平均(
w=1/σ²):均值、σ_mean = sqrt(1/Σw)、有效点数n_eff
支持 CSV、LaTeX 表格与可选 PDF 编译;数值统一输出为括号不确定度 + 指数括号形式,并可选 dcolumn/siunitx 对齐。