是否有一个 python 库可以跟踪测量数据中的不确定性?即,如果我输入 a±b 的数字,是否有一种简单的方法可以通过计算跟踪误差的传播。
测量误差库
计算科学
Python
图书馆
误差估计
2021-12-19 01:03:36
4个回答
我能想到的两种基本方法是:
- 区间算术
- 类似于多项式混沌扩展
我敢肯定还有其他方法。
简而言之,区间算术重新定义了区间上的常见算术运算(加法、减法、乘法等),因此给定一个区间, 一个函数, 和区间扩展的,. 换句话说,函数的图像总是包含在区间扩展中,区间扩展可能会大大高估函数的边界。
Paul 是对的,区间算术的幼稚实现可能会产生过于保守的界限。即使区间算术的实现是最先进的,“依赖问题”也会产生过于保守的界限。
多项式混沌扩展将不确定量视为随机变量,并将这些随机变量(以及它们的概率密度函数)分解为标准随机变量集合的总和(例如,具有均匀概率密度函数、高斯概率密度函数等)按系数缩放。选择随机变量,使其概率密度函数相对于加权内积彼此正交,因此这些展开看起来很像傅里叶级数、切比雪夫级数等。通过计算传播这种扩展将为您的输出提供概率密度函数,并且是传播不确定性的另一种方式。
听起来您可能需要一个支持区间算术的库。粗略的谷歌搜索显示以下库:
正如其他人所建议的那样,pythonhosted.org 包“不确定性”似乎也完成了这项任务。
请记住,区间计算可能会对结果计算产生过于保守的界限,因为没有考虑区间之间的依赖关系。
如果误差很小,并且您不需要精确的保守估计,则可以使用算法微分库来估计此类不确定性,例如ad
(我从未使用过,但通过搜索找到)。这是一个例子:
例子
from ad import adnumber
import ad.admath as adm
import math as m
x = adnumber(1.0)
x_err = 0.01
# Error in starting value for Newton's method
z = adnumber(1)
# Solve the equation y + sin(y) - x = 0 for y
y = x - adm.sin(x) + z
while abs(y + m.sin(y) - x) > 1e-8:
y = y - (y + adm.sin(y) - x) / (1 + adm.cos(y))
print((y, y.d(x)))
print("Value: %s\nEstimated error: %s\nSensitivity to starting value: %s" % \
(y.x, abs(y.d(x)) * x_err, abs(y.d(z)/y.x)))
输出
(ad(0.3912318441940903), 0.48321150365251125)
(ad(0.5094172293334197), 0.5309477254386529)
(ad(0.5109731138269538), 0.5341096893266438)
(ad(0.510973429388556), 0.5341113161301007)
Value: 0.510973429388556
Estimated error: 0.005341113161301007
Sensitivity to starting value: 7.680410775256825e-13
其它你可能感兴趣的问题