在R中进行简单的蒙特卡罗积分时出现错误的结果

时间:2016-12-05 09:34:04

标签: r montecarlo integral numerical-integration

我正在介绍数字整合的一部分。虽然谈话本身将进入更好的数值整合形式(主要是重要性抽样和分层抽样),但我在部分蒙特卡洛积分抽样中提到了均匀分布。

我发现:

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)))

给出了这样一个不准确的答案?这是用户错误,还是从统一分布中抽样时是预期的?

1 个答案:

答案 0 :(得分: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

蒙特卡洛集成通过重要性抽样更有用。阅读Monte Carlo integration using importance sampling given a proposal function以获得一个好例子。