我认为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的精度有关。
即使对于小因素,如何评估等式?
非常感谢您的帮助。
答案 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
时,这种情况不会那么好。)
例如,在factor
为0.0001
的情况下,factor * 5100 / (1 - factor * 5100)
的值大约为1.0408163265306123
。这已经足够接近你所看到的答案,使得NumPy正在或多或少做正确的事情。