蒙特卡罗积分exp(-x ^ 2/2)从x = -infinity到x = + infinity

时间:2015-12-31 15:52:35

标签: matlab integration normal-distribution montecarlo

我想整合

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。

由于

2 个答案:

答案 0 :(得分:0)

试试这个:

clear all;
b=10;                 % border
x1 = -b;              % left border
x2 = b;               % right border
n = 10^6;             % number of random numbers

x = sort(abs(x1 - x2) * rand(n,1) + x1);
f = exp(-x.^2/2);
F = trapz(x,f)

F =

    2.5066

答案 1 :(得分:0)

好的,让我们从编写MC集成的一般情况开始:

I = S f(x) * p(x) dx, x in [a...b]

S这是不可或缺的标志。

通常,p(x)是归一化的概率密度函数,f(x)要集成,算法非常简单:

  • 将累加器s设置为零
  • 启动N个事件的循环
  • x
  • 随机抽样p(x)
  • 给定x,计算f(x)并添加到累加器
  • 如果没有完成则回到开始循环
  • 如果完成,请将累加器除以N并将其返回

在最简单的教科书案例中,你有

I = S f(x) dx, x in [a...b]

这意味着PDF等于均匀分布的

p(x) = 1/(b-a)

但你必须总结的是(b-a)*f(x),因为你的积分现在看起来像

I = S (b-a)*f(x) 1/(b-a) dx, x in [a...b]

一般情况下,如果f(x)p(x)都可以作为PDF,那么您是否可以将f(x)p(x)进行整合,或{{1} } p(x)以上。没有不同! (好吧,除了可能的计算时间)

所以,回到特定的积分(相当于f(x),我相信)

\sqrt{2\pi}

你可以使用像@Agriculturist这样的传统方法并写下来

I = S exp(-x^2/2) dx, x in [-infinity...infinity]

并在[-a ... a]区间内从U(0,1)采样I = S exp(-x^2/2)*(2a) 1/(2a) dx, x in [-a...a] ,并为每个x计算exp()并对其求平均值并得到结果

根据我的理解,您希望将x用作PDF,因此您的积分看起来像

exp()

要规范化的PDF,因此它应包括归一化因子I = S D * exp(-x^2/2)/D dx, x in [-infinity...infinity] ,它与高斯积分中的D完全相等。

现在\sqrt{2 \pi}只是一个等于f(x)的常量。它并不依赖D。这意味着每个采样x的每个人都应该向累加器添加一个CONSTANT值x。运行D个样本后, 在累加器中,您将完全具有N。为了找到意味着你将除以N*D,结果你将获得完美的N,即D,而这又是\sqrt{2 \pi}。 2.5066

无论如何写任何matlab和新年快乐都太生疏了