我認爲我有一個Numpy和小數字的問題。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的精度做。
即使對於小因素,該如何評估等式?
非常感謝您的幫助。
我懷疑問題的至少一部分是在數學中(或者更可能是在將數學翻譯成Python + NumPy代碼時)。你爲什麼認爲這應該評估爲-1?這是基於什麼? –
將'yy'部分重寫爲'1-ax(1 + g(x))',然後將和中的部分改寫爲1-yy /(1-ax)= 1 - ((1-ax因爲g(x)是一個高斯函數,它的峯值在'5100'處,因此g(x)= g(x)和1的stddev,我們在'200'(從'5000'到'5200')的範圍內進行整合,'g(x)'將是1,因此結果將是'-1'。認爲數學不是問題,而是Numpy/Python處理小數字的方式 – dotcs
不可以:你的代數有一個錯誤,你的表達式簡化爲'axg(x)/(1-ax)',而不是' - g(x)'。 –