如何在使用不确定性软件包时修正零误差?

2024-05-13 14:52:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个unumpy数组:

A= [390.9999999999952+/-19.77371993328507
 129.99999999999932+/-11.40175425099135
 34.99999999999997+/-5.9160797830996135
 4.999999999999999+/-2.2360679774997894 0.0+/-0 0.0+/-0
 4.999999999999999+/-2.2360679774997894]
B= [33.999999999999964+/-5.830951894845297
 17.33333333333334+/-4.163331998932266
 9.666666666666666+/-3.1091263510296048
 4.999999999999999+/-2.2360679774997894 0.0+/-nan 0.0+/-nan
 4.999999999999999+/-2.2360679774997894]

在计算平均比率的误差时,我希望通过以下方式传播其误差:

fraction = np.where(unumpy.nominal_values(A) > 0, unumpy.std_devs(B/A), np.nan)

但我不知道如何修复我收到的以下错误:

Traceback (most recent call last):
  File "my_code4.py", line 2076, in <module>
    fraction =            np.where(unumpy.nominal_values(A) > 0, unumpy.std_devs(B/A), np.nan)
  File "/home/username/anaconda3/lib/python3.6/site-packages/uncertainties/core.py", line 661, in f_with_affine_output
    f_nominal_value = f(*args_values, **kwargs)
ZeroDivisionError: float division by zero

Tags: inpynpline数组nanwherefile
3条回答

用某个值epsilon:1e-9或1e-7)替换任何零

fraction = np.where(unumpy.nominal_values(A) > 0, unumpy.std_devs(B/A.clip(1e-9)), np.nan)

0肯定具有物理意义。但是对于计算,计算机科学不能处理NaNInf,因为它们是不确定的。所以通常我们如何通过加一个小值来处理这个数学错误。这不会有太大的影响

通常在许多数学库中,它们的处理方式如下

假设我们有矩阵/向量A,它可以包含0。我要除以另一个矩阵。在这之前,我们可以做下面的预处理

import sys
eps = sys.float_info.epsilon

A+=eps

这将向所有元素添加一个非常小的值,如2.220446049250313e-16。因此,通过这样做,矩阵的分布也将被保留

希望这会有所帮助。:)

我通过对上一行的以下更改解决了该问题: 我所做的基本上是通过两个值的除传播误差,其中两个参数中的误差以第一原理的正交形式相加

fraction = np.where(unumpy.nominal_values(B) * unumpy.nominal_values(A) > 0, (unumpy.nominal_values(B)/unumpy.nominal_values(A)) * np.sqrt(np.sum(np.square([unumpy.std_devs(B)/unumpy.nominal_values(B), unumpy.std_devs(A)/unumpy.nominal_values(A)]), axis=0)), 0.)

相关问题 更多 >