9

読みやすさを重視して、MATLAB でモンテカルロ シミュレーション モデルを書き直しています。このモデルには、(x,y,z) として表される多くの粒子が含まれており、一定の終了確率を持つ状態の小さなセットをランダム ウォークします。出力に関連する情報は、特定の状態で終了する粒子の数です。

シミュレーションには十分な粒子が必要なため、粒子ごとに個別に実行するには法外なコストがかかります。ベクトル化は MATLAB からパフォーマンスを引き出す方法のようですが、MATLAB でこのシミュレーションのベクトル化されたバージョンを作成する慣用的な方法はありますか?

これを達成するために頭を悩ませています - 各粒子と状態の組み合わせを表す (nStates x nParticles) マトリックスを作成しようとさえしましたが、このアプローチは、粒子が状態から跳ね返るため、読みやすさの点ですぐに制御不能になります。互いに独立して述べる。弾丸を噛んで、これにより適した言語に切り替える必要がありますか?

4

1 に答える 1

3

いつものようにコードを書くだけです。ほとんどすべての matlab 関数は、ベクトル化された入力を受け入れて返すことができます。たとえば、1 次元で N 個の粒子のブラウン運動をシミュレートするには

position = zeros([N 1]); %start at origin
sigma = sqrt(D * dt); %D is diffusion coefficient, dt is time step
for j = 1:numSteps
    position = position + sigma*randn(size(position));
end

位置ごとに異なるシグマが必要な場合は、シグマを位置と同じサイズのベクトルにし、「ドット時間」表記を使用して要素ごとの操作を示します。

position = position + sigma.*randn(size(position));

散乱が位置といくつかのランダムな要素の任意の関数である場合、ベクトル化された関数を記述するだけで済みます。

function newstep = step(position)
%diffusion in a overdamped harmonic potential
newstep = -dt*k*position + D*randn(size(position));

for j = 1:numsteps; position = position + step(position);

等々

于 2010-09-24T13:07:46.267 に答える