1

半径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_ndrmax、およびrminはすべて定数です。

ネットで説明を見つけたのですが、その積分を見つけてMatlabで逆数を取るのは難しそうです。

4

4 に答える 4

1

チェックしましたが、私の最初の本能は、との制限log(r/rch)がある切断正規分布のように見えることです。したがって、適切な切断正規確率変数、たとえば、を生成できます。log(rmin/rch)log(rmax/rch)yr = rch * exp(y)

切り捨てられていない値を生成し、制限外の値を置き換えることにより、切り捨てられた正規確率変数を生成できます。または、ウィキペディアのページにある@PengOneで説明されているように、CDFを使用してこれを行うこともできます。

あなたのPDFが完全に正しいかどうかは(まだ)わかりませんが、ここで最も重要なのは配布です。

于 2011-12-15T11:41:19.087 に答える
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)
于 2011-12-15T15:00:58.643 に答える
1

PDF が連続している場合は、統合して CDF を取得し、CDF の逆関数を見つけてランダム値で評価できます。

PDF が連続的でない場合は、cumsum を使用して離散 CDF を取得し、それを interp() の初期 Y 値として使用し、初期 X 値を PDF がサンプリングされた値と同じにし、補間を求めることができます。 rand() 数値の配列で。

于 2011-12-15T06:34:25.197 に答える
0

おそらくあなたのディストリビューションにとってはやり過ぎでしょう-しかし、あなたはいつでもメトロポリスサンプラーを書くことができます。

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

于 2011-12-15T12:21:50.543 に答える