r - 在 R 中进行简单蒙特卡洛积分时出现错误结果

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

这样的回答算不准确吗?这是用户错误,还是从均匀分布中采样时预期的错误?

最佳答案

我回来是为了让我的答案完整,以防 future 的读者需要了解逻辑。请注意,正如您的问题中所述,真实值是 2 而不是 1。

True value


Monte Carlo

因此,您只是计算了样本的平均函数值,但忘记了乘以间隔长度。

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

就是你所需要的。


此结果的确定性 View 是 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举一个很好的例子。

关于r - 在 R 中进行简单蒙特卡洛积分时出现错误结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40971079/

相关文章:

R fiddle 图和箱线图在一起,使填充仅对箱线图表现不同

julia - 模拟一道概率题: 3 independent dice

python - 将自定义函数与 sympy 集成

r - R 中的数值三重积分

r - 向饼图添加值和百分比

r - 数据框上的 icc,每个评分者都有行

c - 使用 C 寻找 pi 的蒙特卡洛方法

image - 计算像素的积分图像(求和面积表)

r - R 是否有与 Python 中的 reduce() 等效的东西?

c - 如何生成 [0,1] 之间具有 3 个分数的随机数