我正在介绍数字整合的一部分。虽然谈话本身将进入更好的数值整合形式(主要是重要性抽样和分层抽样),但我在部分蒙特卡洛积分抽样中提到了均匀分布。
我发现:
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)))
给出了这样一个不准确的答案?这是用户错误,还是从统一分布中抽样时是预期的?
答案 0 :(得分:4)
我回来完成我的答案,以防未来的读者需要了解逻辑。请注意,正如您的问题中所述,真实值为2而非1。
所以,你刚刚计算了样本的平均函数值,但忘记了乘以区间长度。
set.seed(0); pi * mean(sin(runif(1000, 0, pi)))
# [1] 2.001918
是你需要的。
该结果的确定性视图是mean value theorem for integral,或积分的黎曼和近似。
所以我们也可以这样做
pi * mean(sin(seq(0, pi, length = 1000)))
# [1] 1.997998
蒙特卡洛集成通过重要性抽样更有用。阅读Monte Carlo integration using importance sampling given a proposal function以获得一个好例子。