2014-10-02 62 views
2

當我整合普通的pdf時,我從scipy integrate.quad函數中得到了一些奇怪的輸出。下面是我想要使用的代碼:這顯然是錯誤在scipy中正常數值積分

inpdf = lambda c: norm.pdf(50, loc=c, scale = 1) 
result = integrate.quad(inpdf, -np.inf, np.inf) 
print result 

它返回(3.281718223506531e-99,0.0)。 當我改變X值設置爲0,在下面的代碼片段,我得到適當的輸出:

inpdf = lambda c: norm.pdf(0, loc=c, scale = 1) 
result = integrate.quad(inpdf, -np.inf, np.inf) 
print result 

回報(0.9999999999999998,1.0178191320905743e-08) 所以非常接近1這是它應該是什麼。使用R的積分函數會發生完全相同的事情,所以也許這只是正交算法的一個已知屬性?有誰知道這是爲什麼?

+2

這兩個代碼片段是相同的 - 請編輯。 – mdurant 2014-10-02 20:28:14

+0

'sum(stats.norm.pdf(50,loc = arange(0,100,0.01),scale = 1))* 0.01' - > 1 – mdurant 2014-10-02 20:33:39

回答

5

至少在R,也許在scipy這個問題是相當簡單的。

你要求程序要做的是在整個實線上整合一個函數。正交算法試圖找到函數非零的位置,在普通pdf的情況下無處不在,但重要的部分很難找到。

在R的情況下,積分函數在多個點上評估,默認爲100,並且它們不會發生在函數相當大的小區間內。如果您嘗試使用類似

> integrate(dnorm,lower=45,upper=55,mean=50) 
0.9999994 with absolute error < 8.7e-10 

您會得到正確的結果或足夠接近。如果你移動得更遠,正交算法開始失敗

> integrate(dnorm,lower=-1000,upper=1000,mean=50) 
0 with absolute error < 0