2016-12-05 33 views
2

我將介紹數值積分的一部分。雖然談話本身會進入更好的數字整合形式(主要是重要抽樣和分層抽樣),但我在我的部分部分提到從均勻分佈的蒙特卡洛整合抽樣。在R中進行簡單蒙特卡洛積分時出現錯誤結果

我發現:

mean(sin(runif(1e8, 0, pi))) 

是給的0.636597一個答案,而不是1,預計。這個答案看起來與樣本量的增加非常一致,我不確定爲什麼會有這麼多的錯誤。其他計算如:

mean(sin(runif(1e6, 0, 2 * pi))) 

0.0005398996,更接近的0預期的應答。

有人可以幫我看看,爲什麼

mean(sin(runif(1e8, 0, pi))) 

是給這種不準確的答案?該用戶是否錯誤,或者是否從統一分配中抽樣時會出現這種情況?

+2

@ZheyuanLi在給你寫一個答案時,我意識到我已經忘記了將結果乘以間隔的長度,當積分預期爲0時不會被檢測到。謝謝! – Mark

回答

4

我回來讓我的答案完整,以防將來的讀者需要知道邏輯。請注意,正如你的問題所述,真值是2而不是1。

True value


Monte Carlo

所以,你剛纔計算的平均函數值的樣本,卻忘了繁殖間隔長度。

set.seed(0); pi * mean(sin(runif(1000, 0, pi))) 
# [1] 2.001918 

是你需要的。


該結果的確定性視圖是mean value theorem for integral或黎曼和積分的近似值。

Riemann

所以,我們也可以做

pi * mean(sin(seq(0, pi, length = 1000))) 
# [1] 1.997998 

蒙特卡洛積分是通過抽樣的重要性更加有用。閱讀就是一個很好的例子。

+0

我之前提到了各種高斯積分方法,所以這是非確定性對於在更復雜的蒙特卡洛方法之間轉換非常重要。這個代碼的速度/準確性根本不重要(並且對於小n來說不準確可能更好,因爲它將證明爲什麼需要改進均勻採樣)。 – Mark