我想整合
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。
由于
答案 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