【问题标题】:Monte Carlo integration of exp(-x^2/2) from x=-infinity to x=+infinityexp(-x^2/2) 从 x=-infinity 到 x=+infinity 的 Monte Carlo 积分
【发布时间】: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


【解决方案1】:

试试这个:

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

【讨论】:

    【解决方案2】:

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

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

    S 这里是整数符号。

    通常p(x)是归一化概率密度函数,f(x)要积分,算法很简单:

    • 将累加器s 设置为零
    • 开始循环N 事件
    • 从p(x)随机抽样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) 上,还是将p(x) 集成到f(x) 上。没有不同! (嗯,除了计算时间)

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

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

    您可以使用更传统的方法,例如 @Agriculturist 并编写它

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

    并在 [-a...a] 区间内从 U(0,1) 中采样 x,并为每个 x 计算 exp() 并对其进行平均并得到结果

    据我了解,您想将exp() 用作PDF,因此您的积分看起来像

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

    要归一化的PDF,因此它应包含归一化因子D,它完全等于高斯积分的\sqrt{2 \pi}。

    现在f(x) 只是一个等于D 的常数。它不依赖于x。这意味着您应该为每个采样的x 添加一个 CONSTANT 值D 到累加器。运行N 样本后, 在累加器中,您将完全拥有N*D。要找到平均值,您将除以N,结果您将得到完美的D,即\sqrt{2 \pi},反过来,它是 2.5066.

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

    【讨论】:

    • 使用累加器和循环在编程时间和处理时间方面都非常耗时。这种方法适用于基于过程的编程语言;但是,这将被视为在 MATLAB 等语言中的不良编程实践。
    • @Agriculturist ?!?我没有写一行代码,循环还是不循环
    • 仔细检查后,此解决方案还有另一个问题。如果使用随机 x,则间距是不均匀的。不均匀的间距会破坏您建议的方法和塞缪尔使用的方法。检查trapz 命令的二维变体。我从这个解决方案中删除了不准确描述我编写的解决方案的行,以免造成混淆。
    • 另外,在您的算法中,函数的执行就是事件。如果间距是均匀的,那么这不再是蒙特卡罗分析,而是直接的数值积分。在蒙特卡洛分析中,界限是必要的。
    • @Agriculturist 非均匀间距和/或非均匀分布没有错。使用非均匀分布是很自然的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    • 2017-05-15
    • 2021-05-18
    • 2020-08-14
    • 2017-10-28
    • 1970-01-01
    相关资源
    最近更新 更多