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)))))); 
rch

sigma_ndrmax、及びrminは全て定数です。

ネットから説明を見つけましたが、その積分を見つけてMatlabを逆にするのは難しいようです。

+0

あなたは説明できますか?すなわち、基礎となる分布とは何か。 – Nzbuu

+0

@ Nzbuu:あなたの答えのコメントと更新された発言を質問してください。 – Pupil

答えて

1

私はチェックしましたが、私の最初の本能は、log(r/rch)がとlog(rmax/rch)の制限を持つtruncated normal distributionであると思われることです。したがって適切なトランケートされた正規確率変数、例えばy、次にr = rch * exp(y)を生成することができます。

トランケートされた正規乱数変数を生成するには、トランジションされていない値を生成し、その範囲外の値を置き換えます。また、@PengOneの説明にあるように、CDFを使用して行うこともできます。これはwikipedia pageにあります。

私はまだあなたのp.d.f.完全に正しいですが、ここで最も重要なのは配布です。

+0

PDFは、カットオフの対数正規分布です。 – Pupil

+0

私はそう思った。切り捨てられた通常のr.v.を生成します。記述された指数関数をとる。 – Nzbuu

1

PDFが連続している場合は、積分してCDFを取得し、CDFの逆行列を求め、ランダム値で評価します。

PDFが連続していない場合は、cumsumを使用して離散したCDFを取得し、interp()の最初のY値として使用して、最初のX値をPDFのサンプリング値と同じにして、あなたの配列のrand()番号を補間するように要求します。

+0

ネット上で説明を見つけましたが、その積分と逆数を得ることはできません。ソリューションを投稿できますか? – Pupil

+0

@S_H ['cumtrapz'](http://www.mathworks.co.uk/help/techdoc/ref/cumtrapz.html)を使って数値的にPDFを統合することができます。 – Chris

0

おそらくあなたの流通には過剰なものがありますが、いつでもMetropolis samplerと書くことができます。

一方、実装は簡単ですので、サンプラーをすばやく操作できます。

1

あなたの変数は何であるかはっきりしませんが、私はそれがrと仮定しています。その後、

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

産卵を:

これを実行する最も簡単な方法は、クリスが述べたように、最初のCDFを取得する(rは、0で始まる場合pdf(1)がナンであることに注意してください... 0に変更し)、あります

y = rand (size_dist,1); 

一様分布(要素の数を示すsize_dist)に続いて、cdfに沿って分布を配置する方法。どんな手法でも動作しますが、ここでは最も簡単です(ただし、エレガントではありません)。

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

最後に元のpdfに戻ります。コースを逆にするには、MATLAB数値索引を使用します。注意:rを使用していないpdf:PDFはどこから来る

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

こんにちはラスマン。ご回答有難うございます。次のように実行するとエラーが発生します: '??? 'x(i)= find(y(i)<= cdf、1) 'の行にある、長方形の空行列を使った不適切な割り当て' – Pupil

+0

cdfが定義されていることを確認します(vs null)。 pdfのいずれかの要素がNanの場合はnullになります(例:@ 0、matlabはそれをNanとして計算しますので、私の注記:これを0に変更します)。 – Rasman

+0

NaNを0に変更しました。 – Pupil

関連する問題