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) 
相關問題