Numpy:如何避免舍入错误

时间:2014-02-07 22:06:32

标签: python numpy floating-point precision

我认为Numpy和小数字都有问题。

您能否帮我找到解决以下问题的方法:

import numpy as np

def gaussian(xx, mu=0, sigma=1):
    return 1./(np.sqrt(2*np.pi)*sigma)*np.exp(-(mu-xx)**2/(2*sigma**2))

factors = (1., 0.1, 0.01, 0.001, 0.0001)
for factor in factors:
    xx = np.linspace(5000, 5200, 1000)
    yy = 1.-(factor*xx*(1.+gaussian(xx, 5100)))
    step = xx[1] - xx[0]

    print np.sum((1.-yy/(1.-factor*xx))*step)

对于所有不同的-1,此代码应评估为factors。 但输出是:

1.0 -1.00019611689
0.1 -1.00196463662
0.01 -1.0200000008
0.001 -1.24390245353
0.0001 1.04081641153

所以问题是,因子越小,我就越麻烦,因为我认为与Numpy / Python的精度有关。

即使对于小因素,如何评估等式?

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

这不是NumPy问题。您希望结果应为-1是不正确的。

您在f(x)周围的大间隔内有效地计算函数5100的定积分。您正在集成的功能简化为factor * x * gaussian(x) / (1 - factor * x)。我们可以很容易地给出您正在使用的因子的积分值的背面估计:数量factor * x / (1 - factor * x)在感兴趣的范围内变化相当缓慢,约为{{1到5095;对于超出此范围的任何事物,高斯将使贡献可忽略不计。因此,对于第一近似,我们可以将该数量视为常数。然后我们将5105的整数保持为常数gaussian(x),这将足够1。因此,预期输出应该在factor * 5100 / (1 - factor * 5100)区域的某个位置。 (当factor接近1 / 5100时,这种情况不会那么好。)

例如,在factor0.0001的情况下,factor * 5100 / (1 - factor * 5100)的值大约为1.0408163265306123。这已经足够接近你所看到的答案,使得NumPy正在或多或少做正确的事情。