Цепи Маркова.
Текст программы:
%матрица переходов
P = [15 1 1 1; 1 15 1 1; 1 1 15 1; 1 1 1 15]; States = ["Healthy" "Unwell" "Sick" "Very Sick"]; MC = dtmc(P,'StateNames',States);
MCP = MC.P
s = sum(MCP,2);
%граф матрицы
figure('Name','Граф матрицы переходов','NumberTitle','off') graphplot(mc,'ColorNodes',true,'ColorEdges',true);
%кумулятивная матрица переходов
P_cum = cumsum(mcp,2);
%моделирование поведения марковской цепи (200, 1000 и 10000 итераций)
N=[200 1000 10000]; for j=1:3 z=zeros(N(j),1); z(1,1)=1; r=rand(N(j),1);
for i=2:1:N(j) k=1;
while r(i-1,1)>P_cum(z(i-1,1),k) k=k+1;
end
z(i,1)=k;
end
figure(2)
subplot(3,1,j)
plot(z)
if j == 1
title('Поведение цепи Маркова в течение 200 итераций') elseif j == 2
title('Поведение цепи Маркова в течение 1000 итераций') else
title('Поведение цепи Маркова в течение 10000 итераций') end
end
%расчет оценки цепи Маркова P_obs=zeros(4,4,3);
for k=1:3
for n=2:N(k)
for i=1:4
if z(n-1,1)==i for j=1:4
if z(n,1)==j
P_obs(i,j,k)=P_obs(i,j,k)+1; end
end
end
end
end
end
P_Obs_1=normalize(P_obs(:,:,1),'norm',1)
P_Obs_2=normalize(P_obs(:,:,2),'norm',1)
P_Obs_3=normalize(P_obs(:,:,3),'norm',1)
%построение графов для полученных оценок
MC_Obs1=dtmc(P_Obs_1,'StateNames',States);
MC_Obs2=dtmc(P_Obs_2,'StateNames',States);
MC_Obs3=dtmc(P_Obs_3,'StateNames',States);
figure('Name','Моделирование поведения цепи Маркова 200… итераций','NumberTitle','off')
graphplot(MC_Obs1,'ColorNodes',true,'ColorEdges',true); figure('Name','Моделирование поведения цепи Маркова 1000… итераций','NumberTitle','off')
graphplot(MC_Obs2,'ColorNodes',true,'ColorEdges',true); figure('Name','Моделирование поведения цепи Маркова 10000… итераций','NumberTitle','off')
graphplot(MC_Obs3,'ColorNodes',true,'ColorEdges',true);
Сгенерируем матрицу переходов P, после чего создадим цепь Маркова функцией dtmc() и выведем в консоль нормированную матрицу переходов полученной цепи:
Сумма по строкам этой матрицы, как и ожидалось, дает 1.
Построим граф матрицы переходов при помощи функции graphplot():
Рис. 1 – Граф матрицы переходов.
Построим кумулятивную матрицу переходов при помощи функции cumsum(). После этого промоделируем поведение цепи Маркова в течение 200 итераций, пользуясь выражением:
где r – случайное число, распределенное равномерно на интервале [0,1]; P_cum – кумулятивная матрица переходов, zt – состояние цепи в момент времени t.
П
овторим
то же самое для 1000 и 10000 итераций и
построим итоговую совокупность графиков
поведения цепи Маркова:
Рис. 2 – Моделирование поведения цепи Маркова.
Рассчитаем оценку цепи Маркова по полученным наблюдениям для 200, 1000 и 10000 итераций, используя выражение:
Нормализуем полученные матрицы переходов и построим для них цепи Маркова и графы матрицы. Для удобства сравнения, представим полученные результаты в виде таблицы:
Цепи Маркова |
Матрица переходов |
Граф цепи |
mc |
|
|
MC_Obs1 |
|
|
MC_Obs2 |
|
|
MC_Obs3 |
|
|
По полученным результатам можно сделать вывод, что для промоделированных цепей вероятности перехода вычисляются довольно близко к исходным (для цепи mc), причем чем больше число итераций, тем точнее.
