我正在做有关数值积分的演示的一部分。虽然演讲本身将讨论更好的数值积分形式(主要是重要性抽样和分层抽样),但我在部分内容中提到了均匀分布的蒙特卡罗积分抽样。
我发现:
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)))
这样的回答算不准确吗?这是用户错误,还是从均匀分布中采样时预期的错误?
最佳答案
我回来是为了让我的答案完整,以防 future 的读者需要了解逻辑。请注意,正如您的问题中所述,真实值是 2 而不是 1。
因此,您只是计算了样本的平均函数值,但忘记了乘以间隔长度。
set.seed(0); pi * mean(sin(runif(1000, 0, pi)))
# [1] 2.001918
就是你所需要的。
此结果的确定性 View 是 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举一个很好的例子。
关于r - 在 R 中进行简单蒙特卡洛积分时出现错误结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40971079/