2015-08-13 37 views
0

我試圖計算高斯的積分在python像這樣:的Python 3.4 SciPy的integrate.quad送貨

from math import exp 
from scipy import stats, integrate 
import scipy.interpolate as interpolate 
from numpy import cumsum, random, histogram, linspace, zeros, inf, pi,sqrt 
import matplotlib.pyplot as plt 

A = 1 
mu = 0 
sigma = 1 
p = lambda x: A * exp(-(((x-mu)**2))/(2*(sigma**2))) 
F = lambda x: integrate.quad(p, -inf, x)[0] 
Ns = 1000; 
x = linspace(-50,50,Ns); 
y = zeros(Ns) 
yy = zeros(Ns) 
for i in range(Ns): 
    y[i] = F(x[i]) 
    yy[i]= p(x[i]) 

plt.plot(x,y) 
plt.plot(x,yy) 
plt.show() 

但如果一個看起來情節,有範圍之間下降到零21.0至22,以及38+之後。 有人知道它爲什麼這樣做嗎?舍入錯誤也許?

謝謝!!

回答

1

我認爲理解這個問題的關鍵是回想一下數值積分法計算特定結的函數值的加權和。

當你偏離平均值時,高斯迅速變爲零,所以基本上在(-50,50)之間的區間內大部分函數值都是零。如果積分方法無法從函數非零的小區域採樣點,則它將看到整個函數完全平坦,從而給出積分0.因此,您可以做什麼?

不是選擇固定間隔(-50,50),而是根據較小的西格瑪值選擇一個間隔,以避免在過大的零間隔內進行積分。

如果您僅左右移動5,10或20個標準偏差,您將不會看到此問題,並且您仍然具有非常準確的積分結果。

這是從10個標準差向左和向右整合的結果。

plot