【发布时间】:2016-04-05 13:24:00
【问题描述】:
我要整合
f(x) = exp(-x^2/2)
从 x=-infinity 到 x=+infinity
使用蒙特卡洛方法。我使用函数 randn() 为函数 f(x_i) = exp(-x_i^2/2) 生成所有 x_i 我想积分以计算 f([x_1,..x_n]) 的平均值。我的问题是,结果取决于我为边界 x1 和 x2 选择的值(见下文)。通过增加 x1 和 x2 的值,我的结果与实际值相差甚远。其实通过增加x1和x2结果应该会越来越好。
有人看到我的错误吗?
这是我的 Matlab 代码
clear all;
b=10; % border
x1 = -b; % left border
x2 = b; % right border
n = 10^6; % number of random numbers
x = randn(n,1);
f = ones(n,1);
g = exp(-(x.^2)/2);
F = ((x2-x1)/n)*f'*g;
正确的值应该是 ~2.5066。
谢谢
【问题讨论】:
-
你真的想要一个正态分布吗?在这种情况下,我希望分布均匀。
-
@Daniel :我知道它适用于均匀分布。但是为了获得更好的结果,想要使用正态分布。
-
提示:尝试将您的函数与正态分布的 PDF 一起绘制(使用
randn从中绘制您的x)。您会看到普通的 PDF 始终在您的功能之下。如果你真的想使用randn而不是rand你需要做一个简单的转换,所以采样函数总是 >= 比你的函数(你还需要能够计算面积您正在采样)。 -
@Samuel:如果你真的想使用正态分布,你的方法对我来说真的不清楚。您如何期望正态分布的样本在某个区间内?缺少一些东西,在您当前的方法中,
F的预期值不是您要计算的积分。 -
@Samuel:我的问题是,我不明白你要实现什么。我不知道任何从正态分布样本开始到积分结束的方法。这更像是一道数学题,而不是编程题。
标签: matlab integration normal-distribution montecarlo