我正在寻找一个提供“有错误的值”(例如 x ± y)的库。但是搜索“Haskell xyz Error”只会提供错误处理库。
我希望这样的库将在适当的情况下提供常见的数学运算(Num
, Floating
)。用例是从基于噪声传感器读数的计算中获得错误估计。
更新
我做了一些研究,然后出现了“不确定性的传播”这个词。我发现uncertainly-haskell
了我很快就会尝试的。还有其他类似的包吗?
看看间隔包。
Data.Eq.Approximate模块似乎适合获得近似相等。
Data.Eq.Approximate
内容 类型包装器 公差类型注释类 绝对公差 相对公差 零公差 使用数字的公差注释 此模块的目的是提供新类型包装器,它允许有效地覆盖值的相等运算符,使其 > 是近似的而不是精确的。例如,类型
type ApproximateDouble = AbsolutelyApproximateValue (Digits Five) Double 为包含 Doubles 的包装器定义了一个别名,这样如果两个 doubles 的精度在小数点后五位以内,则它们是相等的;例如,我们有
1 == (1+10^^(-6) :: ApproximateDouble) 计算结果为真。请注意,我们不需要包装值 1+10^^(-6),因为 AbsolutelyApproximateValue 是 Num 的一个实例。为方便起见,Num 以及许多其他数值类(如 Real 和 Floating)都为在此包中定义的包装器派生,以便人们可以像使用值一样方便地使用包装的值他们自己。
这个包提供了两种包装器。
该uncertain
软件包似乎提供了您正在寻找的内容:
自述文件中的一些亮点:
提供工具来处理具有固有实验/测量不确定性的数字,并通过基于统计学原理的函数传播它们。
使用错误传播进行操作
ghci> let x = 1.52 +/- 0.07 ghci> let y = 781.4 +/- 0.3 ghci> let z = 1.53e-1 `withPrecision` 3 ghci> cosh x 2.4 +/- 0.2 ghci> exp x / z * sin (y ** z) 10.9 +/- 0.9 ghci> pi + 3 * logBase x y 52 +/- 5
创建号码
ghci> 1.52 +/- 0.07 1.52 +/- 7.0e-2 ghci> fromSamples [12.5, 12.7, 12.6, 12.6, 12.5] 12.58 +/- 7.0e-2
比较
请注意,这与其他具有相似数据类型的库(如区间和舍入)非常不同;这些并不试图保持间隔或简单的数字精度;相反,它们旨在对具有不确定性的实际实验和测量数据进行建模,并将函数应用于具有不确定性的数据,并以合理的统计原理适当地传播误差。
举一个明显的例子,采取
> (52 +/- 6) + (39 +/- 4) 91.0 +/- 7.0
在像区间这样的库中,这将导致
91 +/- 10
(即,下限为 46 + 35,上限为 58 + 43)。但是,对于实验数据,两个独立样本中的误差往往会“抵消”,并导致总体不确定性总和约为 7。