1

半径r从切断数正态分布,其具有以下概率密度函数得出:如何从Matlab中截断对数正态分布生成随机数?

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_ndrmax,和rmin都是常数。

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

+0

你能描述在PDF从何而来?即什么是基础分配应该是。 – Nzbuu 2011-12-15 11:42:57

+0

@Nzbuu:请在您的回答中注释并更新有问题的评论。 – Pupil 2011-12-15 22:16:50

回答

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.是完全正确的,但这里最重要的是分配。

1

如果你的PDF是连续的,那么你可以整合得到一个CDF,然后找到CDF的逆并在随机值下评估它。

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

+0

我在网上找到了解释,但我不能得到它的积分,然后反过来。你可以发布解决方案吗? – Pupil 2011-12-15 06:38:50

+0

@S_H您可以使用[`cumtrapz`](http://www.mathworks.co.uk/help/techdoc/ref/cumtrapz.html)对PDF进行数字集成。 – Chris 2011-12-15 10:20:04

0

可能是你的发行版的矫枉过正 - 但你总是可以写一个Metropolis sampler

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

1

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

做到这一点最简单的方法是,克里斯指出,首先得到CDF(注意,如果r从0开始,pdf(1)是南...将其更改为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) 
相关问题