如何在Matlab中从截止对数正态分布中生成随机数?

时间:2011-12-15 06:29:08

标签: matlab statistics distribution random-sample probability-density

半径r来自截止对数正态分布,具有以下概率密度函数:

pdf=((sqrt(2).*exp(-0.5*((log(r/rch)).^2)))./((sqrt(pi.*(sigma_nd.^2))...
    .*r).*(erf((log(rmax/rch))./sqrt(2.*(sigma_nd.^2)))-erf((log(rmin/rch))./sqrt(2.*(sigma_nd.^2))))));

rchsigma_ndrmaxrmin都是常量。

我从网上找到了解释,但似乎很难找到它的积分然后在Matlab中进行反演。

4 个答案:

答案 0 :(得分:1)

如果您的PDF是连续的,那么您可以集成以获得CDF,然后找到CDF的反转并以随机值对其进行评估。

如果您的PDF不连续,那么您可以使用cumsum获取离散CDF,并将其用作interp()中的初始Y值,初始X值与PDF采样的值相同,并且要求插入你的rand()数组。

答案 1 :(得分:1)

我查了一下,但我的第一直觉是,log(r/rch)似乎是truncated normal distribution,其限制为log(rmin/rch)log(rmax/rch)。因此,您可以生成相应的截断正态随机变量,例如y,然后r = rch * exp(y)

您可以通过生成未截断的值并替换超出限制的值来生成截断的正常随机变量。或者,您可以使用CDF进行操作,如@PengOne所述,您可以在wikipedia page找到它。

我(仍然)不确定你的p.d.f.这是完全正确的,但这里最重要的是分配。

答案 2 :(得分:1)

不清楚你的变量是什么,但我假设它是r

最简单的方法是,正如Chris所说,首先得到cdf(请注意,如果r从0开始,pdf(1)是Nan ...将其更改为0):

cdf = cumtrapz(pdf);
cdf = cdf / cdf(end);

然后产生一个统一的分布(size_dist,表示元素的数量):

y = rand (size_dist,1);

后跟一个沿cdf放置分布的方法。任何技术都可行,但这里最简单(尽管不优雅)

x = zeros(size_dist,1);
for i = 1:size_dist
    x(i) = find( y(i)<= cdf,1);
end

最后,回到原来的pdf。使用matlab数值索引来逆转过程。注意:使用r而非pdf

pdfHist = r(x);
hist (pdfHist,50)

答案 3 :(得分:0)

您的发行版可能有些过分 - 但您总是可以写一个Metropolis sampler

另一方面 - 实施非常简单,因此您可以非常快速地使用采样器。