2016-12-05 88 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

相关问题