Matlab exp(-x^2/2)从x=-无穷大到x=&x2B的蒙特卡罗积分;无穷

Matlab exp(-x^2/2)从x=-无穷大到x=&x2B的蒙特卡罗积分;无穷,matlab,integration,normal-distribution,montecarlo,Matlab,Integration,Normal Distribution,Montecarlo,我想整合 f(x)=exp(-x^2/2) 从x=-无穷大到x=+无穷大 采用蒙特卡罗方法。我使用函数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;

我想整合

f(x)=exp(-x^2/2)

从x=-无穷大到x=+无穷大

采用蒙特卡罗方法。我使用函数
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

谢谢

试试这个:

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

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

I = S f(x) * p(x) dx, x in [a...b]
S
这里是整数符号

通常,
p(x)
是标准化的概率密度函数,
f(x)
你想要积分,算法非常简单:

  • 将累加器
    s
    设置为零
  • N
    事件的开始循环
  • p(x)
  • 给定
    x
    ,计算
    f(x)
    并添加到累加器中
  • 如果未完成,则返回到开始循环
  • 如果完成,将累加器除以
    N
    ,然后返回它
最简单的例子就是你有

I = S f(x) dx, x in [a...b]
这意味着PDF等于均匀分布的PDF

p(x) = 1/(b-a)
但你必须求和的实际上是
(b-a)*f(x)
,因为你的积分现在看起来像

I = S (b-a)*f(x) 1/(b-a) dx, x in [a...b]
I = S D * exp(-x^2/2)/D dx, x in [-infinity...infinity]
一般来说,如果
f(x)
p(x)
都可以作为PDF格式,那么您可以选择是将
f(x)
集成到
p(x)
上,还是将
p(x)
集成到
f(x)
上。没有区别!(好吧,除了可能的计算时间)

所以,回到特定的积分(我相信它等于
\sqrt{2\pi}

你可以使用更传统的方法,比如@agriculturest,然后编写它

I = S exp(-x^2/2)*(2a) 1/(2a) dx, x in [-a...a]
在[-a…a]间隔内从U(0,1)中采样
x
,并对每个
x
compute exp()进行平均,得到结果

据我所知,您希望使用PDF格式的
exp()
,因此您的积分如下所示

I = S (b-a)*f(x) 1/(b-a) dx, x in [a...b]
I = S D * exp(-x^2/2)/D dx, x in [-infinity...infinity]
PDF将被标准化,因此它应包括标准化因子
D
,它完全等于高斯积分的
\sqrt{2\pi}

现在
f(x)
只是一个常数,等于
D
。它不依赖于
x
。这意味着您应该为每个采样的
x
向累加器添加一个
D
的常量值。运行
N
示例后, 在累加器中,您将得到准确的
N*D
。为了找到平均值,你将除以
N
,结果得到完美的
D
,也就是
\sqrt{2\pi}
,这反过来就是 2.5066


太生疏了,无法编写任何matlab,祝你新年快乐

你真的想要一个正态分布吗?在这种情况下,我希望是均匀分布。@Daniel:我知道它适用于均匀分布。但是a希望使用正态分布来获得更好的结果。提示:尝试将函数与正态分布的PDF一起绘制(从中使用
randn
绘制
x
)。你会看到普通的PDF文件总是在你的函数下。如果你真的想使用
randn
而不是
rand
,你需要做一个简单的转换,这样采样函数的值总是大于你的函数值(你还需要能够计算出你采样的区域)。@塞缪尔:如果你真的想使用正态分布,我真的不清楚你的方法。你如何期望正态分布的样本在一定的区间内?缺少了一些东西,在您当前的方法中,
F
的期望值不是您试图计算的积分。@塞缪尔:我的问题是,我不明白您要实现什么。我不知道有什么方法,从正态分布样本开始,到积分结束。这更多的是一个数学问题,而不是编程问题。从编程时间和处理时间来看,使用累加器和循环非常耗时。这种方法适用于基于过程的编程语言;然而,在像MATLAB这样的语言中,这将被认为是糟糕的编程实践。@agriculturalist?!?我没有写一行代码,循环或无循环仔细检查后,这个解决方案还有另一个问题。如果使用随机x,则间距不均匀。非均匀间距会使您建议的方法和Samuel正在使用的方法都出错。检查命令的二维变体。我从这个解决方案中删除了一行,它不准确地描述了我编写的解决方案,以免造成混淆。此外,在您的算法中,函数的执行就是事件。如果间距均匀,则不再是蒙特卡罗分析,而是直接数值积分。在蒙特卡罗分析中,边界是必要的。@Agriculturist非均匀间距和/或非均匀分布没有错。使用非均匀分布是很自然的。