Matlab exp(-x^2/2)从x=-无穷大到x=&x2B的蒙特卡罗积分;无穷
我想整合 f(x)=exp(-x^2/2) 从x=-无穷大到x=+无穷大 采用蒙特卡罗方法。我使用函数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;
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非均匀间距和/或非均匀分布没有错。使用非均匀分布是很自然的。