测量误差库

计算科学 Python 图书馆 误差估计
2021-12-19 01:03:36

是否有一个 python 库可以跟踪测量数据中的不确定性?即,如果我输入 a±b 的数字,是否有一种简单的方法可以通过计算跟踪误差的传播。

4个回答

我能想到的两种基本方法是:

  • 区间算术
  • 类似于多项式混沌扩展

我敢肯定还有其他方法。

简而言之,区间算术重新定义了区间上的常见算术运算(加法、减法、乘法等),因此给定一个区间I, 一个函数f, 和区间扩展Ff,f(I)F(I). 换句话说,函数的图像总是包含在区间扩展中,区间扩展可能会大大高估函数的边界。

Paul 是对的,区间算术的幼稚实现可能会产生过于保守的界限。即使区间算术的实现是最先进的,“依赖问题”也会产生过于保守的界限。

多项式混沌扩展将不确定量视为随机变量,并将这些随机变量(以及它们的概率密度函数)分解为标准随机变量集合的总和(例如,具有均匀概率密度函数、高斯概率密度函数等)按系数缩放。选择随机变量,使其概率密度函数相对于加权内积彼此正交,因此这些展开看起来很像傅里叶级数、切比雪夫级数等。通过计算传播这种扩展将为您的输出提供概率密度函数,并且是传播不确定性的另一种方式。

科学家用来跟踪不确定性的常用方法是跟踪数量的标准偏差,所以我假设这就是你所需要的。

一些程序可以自动执行此操作,因此您不必实现不方便处理的公式

我刚刚又看了一眼当前的报价,我也会推荐不确定性套餐您可以使用具有不确定性的数字执行任意计算,就好像它们是简单的浮点数一样,结果会自动包含正确传播的不确定性。

免责声明:我是这个包的作者。

听起来您可能需要一个支持区间算术的库。粗略的谷歌搜索显示以下库:

Pyinterval

正如其他人所建议的那样,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