马尔可夫链的模拟

时间:2013-11-24 09:28:16

标签: matlab simulink markov-chains

我有以下马尔可夫链:

enter image description here

这条链显示了太空飞船的状态,它位于小行星带:S1 - 可维修,S2 - 被打破。 0.12 - 与小行星碰撞破坏宇宙飞船的概率。 0.88 - 碰撞不太重要的概率。需要在第三次碰撞后找到船舶可用状况的概率。

分析解决方案显示响应 - 0.681。但是有必要使用任何建模工具(MATLAB Simulink,AnyLogic,Scilab等)通过仿真方法解决这个问题。

您是否知道在Simulink或任何其他模拟环境中应使用哪些组件来模拟此过程?任何示例或链接。 (抱歉我的英文。)

3 个答案:

答案 0 :(得分:1)

首先,我们知道三步概率转移矩阵包含答案(0.6815)。

% MATLAB R2019a
P = [0.88 0.12;
    0 1];
P3 = P*P*P
P(1,1)                 % 0.6815

方法1:需要计量经济学工具箱
这种方法使用dtmc()simulate()函数。

首先,使用概率转换矩阵P创建Discrete Time Markov Chain (DTMC),并使用dtmc()

mc = dtmc(P);               % Create the DTMC
numSteps = 3;               % Number of collisions

您可以使用simulate()轻松获得一个示例路径。请注意如何指定初始条件。

% One Sample Path
rng(8675309)                                     % for reproducibility
X = simulate(mc,numSteps,'X0',[1 0])

% Multiple Sample Paths
numSamplePaths = 3;
X = simulate(mc,numSteps,'X0',[numSamplePaths 0])  % returns a 4 x 3 matrix

第一行是DTMC的起始状态(初始条件)的X0行。第二行是1转换(X1)之后的状态。因此,第四行是经过3次转换(碰撞)后的状态。

% 50000 Sample Paths
rng(8675309)                                     % for reproducibility
k = 50000;
X = simulate(mc,numSteps,'X0',[k 0]);            % returns a 4 x 50000 matrix

prob_survive_3collisions = sum(X(end,:)==1)/k    % 0.6800

我们可以根据3次碰撞中幸存的平均概率自举95%的置信区间,以获得包含结果的0.6814 ± 0.00069221[0.6807 0.6821]

numTrials = 40;
ProbSurvive_3collisions = zeros(numTrials,1);
for trial = 1:numTrials
    Xtrial = simulate(mc,numSteps,'X0',[k 0]);
    ProbSurvive_3collisions(trial) = sum(Xtrial(end,:)==1)/k;
end

% Mean +/- Halfwidth
alpha = 0.05;
mean_prob_survive_3collisions = mean(ProbSurvive_3collisions)
hw = tinv(1-(0.5*alpha), numTrials-1)*(std(ProbSurvive_3collisions)/sqrt(numTrials))
ci95 = [mean_prob_survive_3collisions-hw mean_prob_survive_3collisions+hw]   

Survival probability graph for various numbers of collisions

maxNumCollisions = 10;
numSamplePaths = 50000;
ProbSurvive = zeros(maxNumCollisions,1);
for numCollisions = 1:maxNumCollisions
    Xc = simulate(mc,numCollisions,'X0',[numSamplePaths 0]);
    ProbSurvive(numCollisions) = sum(Xc(end,:)==1)/numSamplePaths;
end

答案 1 :(得分:0)

对于更复杂的系统,您需要使用Stateflow或SimEvents,但是对于这个简单的示例,您只需要一个单位延迟块(输出= 0 => S1,输出= 1 => S2),使用Switch块,Random块和一些比较块来构造确定状态的下一个值的逻辑。

据推测,您必须(非常)次数执行模拟并对结果取平均值以获得具有统计意义的输出。 每次运行模拟时,您都需要更改随机生成器的“种子”。 这可以通过将种子设置为“现在”(或类似的东西)来完成。

或者,你可以很容易地对模型进行矢量化,这样你只需要执行一次。

答案 2 :(得分:0)

如果你想模拟这个,在matlab中相当容易:

servicable = 1;
t = 0;
while servicable =1
   t = t+1;
  servicable = rand()<=0.88
end

现在t表示船舶破损前的步数。

将其包裹在for循环中,您可以根据需要进行尽可能多的模拟。


请注意,这实际上可以为您提供分发,如果您想在3次后知道它,只需将&& t<3添加到while条件。