Numpy:如何避免舍入错误

2024-04-19 02:43:43 发布

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

我想我对小数字和小数字有问题。在

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

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)

对于所有不同的factors,此代码的计算结果应为-1。 但结果是:

^{pr2}$

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

哪怕是在小因素的情况下,如何评价方程?在

提前谢谢你的帮助。在


Tags: 方法importnumpydefasstepnp数字
1条回答
网友
1楼 · 发布于 2024-04-19 02:43:43

这不是一个裸体问题。你认为结果应该是-1的想法是不正确的。在

你有效地计算了一个函数f(x)5100周围的大区间上的定积分。您正在集成的函数简化为factor * x * gaussian(x) / (1 - factor * x)。我们可以很容易地给出你所使用的因子的积分值的包络估计值:数量factor * x / (1 - factor * x)在整个关注范围内变化相当缓慢,大约是5095到{};对于这个范围之外的任何东西,高斯函数将使贡献可以忽略不计。所以对于第一近似,我们可以把这个量当作常数。然后我们只剩下这个常数乘以gaussian(x)的积分,这将足够接近1。因此,预期的输出应该在factor * 5100 / (1 - factor * 5100)区域的某个地方。(尽管当factor接近1 / 5100时,这不会很好地工作。)

例如,factor0.0001factor * 5100 / (1 - factor * 5100)的值在1.0408163265306123左右。这已经足够接近你所看到的答案,让人觉得纽比做的事情或多或少是正确的。在

相关问题 更多 >