2

与えられたフレームで通常(0)または励起(1)の粒子状態をシミュレートしたいとします。粒子はf%の時間励起状態にあります。粒子が励起状態にある場合、それは〜Lフレームの間持続します(ポアソン分布を使用)。その状態をN個の時点でシミュレートしたいと思います。したがって、入力は次のようになります。

N = 1000;
f = 0.3;
L = 5;

結果は次のようになります

state(1:N) = [0 0 1 1 1 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 ... and so on]

sum(state)/Nが0.3に近い

どうやってするか?ありがとう!

4

2 に答える 2

2

励起状態の平均の長さは5です。したがって、通常の状態の平均の長さは約12である必要があります。

戦略はこのようなものにすることができます。

  • 状態0で開始
  • a平均値を使用してポアソン分布から乱数を描画しますL*(1-f)/f
  • 状態配列をaゼロで埋めます
  • b平均値を使用してPoission分布から乱数を描画しますL
  • 状態配列を1つで埋めbます。
  • 繰り返す

もう1つのオプションは、0->1と1->0の確率が等しくないスイッチング確率の観点から考えることです。

于 2012-03-25T10:07:48.200 に答える
2
%% parameters
f = 0.3; % probability of state 1
L1 = 5;  % average time in state 1
N = 1e4;
s0 = 1; % init. state
%% run simulation
L0 = L1 * (1 / f - 1); % average time state 0 lasts
p01 = 1 / L0; % probability to switch from 0 to 1
p10 = 1 / L1; % probability to switch from 1 to 0
p00 = 1 - p01;
p11 = 1 - p10;
sm = [p00, p01; p10, p11];  % build stochastic matrix (state machine)
bins = [0, 1]; % possible states
states = zeros(N, 1);
assert(all(sum(sm, 2) == 1), 'not a stochastic matrix');
smc = cumsum(sm, 2); % cummulative matrix
xi = find(bins == s0);
for k = 1 : N
    yi = find(smc(xi, :) > rand, 1, 'first');
    states(k) = bins(yi);
    xi = yi;
end
%% check result
ds = [states(1); diff(states)];
idx_begin = find(ds == 1 & states == 1);
idx_end = find(ds == -1 & states == 0);
if idx_end(end) < idx_begin(end)
    idx_end = [idx_end; N + 1];
end
df = idx_end - idx_begin;
fprintf('prob(state = 1) = %g; avg. time(state = 1) = %g\n', sum(states) / N, mean(df));
于 2012-03-25T10:30:29.950 に答える