马氏链模型Matlab的实例和实现代码
实例
这是我无意从网上看到的,但是没有代码,很可惜,于是我自己写了个同例子相似,但是可以运用到其他数值上的代码
输入数据到P_0
和 P_n
就可以跑起来了
代码
一般马氏链模型
% 马氏链模型,渡边笔记
% 系统在每个时期所处的状态是随机的
% 从一时期到下时期的状态按一定概率转移
% 下时期状态只取决于本时期状态和转移概率。即已知现在,将来与过去无关(无后效性)
% 过去不影响未来的判断,是马氏链的本质
% P_0 是初始分布,P_n 是转移矩阵,则在 n 未来的概率为
% P_0 * ( P_n ^ n )
clc,clear;close all;
% 第一次买盐,概率为 P_0
% 已知 买盐倾向 P_n
% P_0 = [0.2 0.4 0.4];
% P_n = [0.8 0.1 0.1
% 0.5 0.1 0.4
% 0.5 0.3 0.2];
% P = P_0 * P_n ^ 3;
% disp(P)
% 一般马氏链模型
a=[160 120 120
180 90 30
180 30 90]; % 输入统计矩阵
P_0 = [0.4 0.3 0.4]; % 初始概率
% 求状态转移矩阵
[m,~] = size(a);
ni=sum(a,2); %计算矩阵f的行和
for i = 1:m
for j = 1:m
ZT(i,j) = a(i,j)./ni(i); %求状态转移的频率
end
end
disp('转移矩阵为 : ');
disp(ZT)
fprintf('%c', 8); % 删掉换行符
% 求 n 期概率
n = 2;
P = P_0 * ( ZT ^n );
disp(['第 ',num2str(n),' 期概率为 ',num2str(P)]);
% 概率平衡时,有 P = P * P_n 恒成立
X = ZT';
X(1,:) = [];
for i = 2:m
X(i-1,i) = X(i-1,i) - 1;
end
X(m,:) = ones(1,m);
Y = zeros(m-1,1);
Y(m,:) = ones(1);
x = X\Y; x = x';
disp(['n 趋向于无穷的 X 的解为 : ',num2str(x)]);
代码输出
转移矩阵为 :
2/5 3/10 3/10
3/5 3/10 1/10
3/5 1/10 3/10
第 2 期概率为 0.544 0.276 0.28
n 趋向于无穷的 X 的解为 : 0.5 0.25 0.25
带利润的马氏链模型
% 带利润的马氏链模型,渡边笔记
clc,clear;close all;
a=[5 5
4 6 ]; % 输入统计矩阵
R = [9 3
3 -7]; % 输入利润矩阵
% 对统计矩阵,求状态转移矩阵
[m,~] = size(a);
ni=sum(a,2); %计算矩阵f的行和
for i = 1:m
for j = 1:m
ZT(i,j) = a(i,j)./ni(i); %求状态转移的频率
end
end
disp('转移矩阵为 : ');
disp(ZT)
fprintf('%c', 8); % 删掉换行符
% 求 n 期利润
n = 3;
% n = 1 时
for i = 1:m
for j = 1:m
v(i,j) = R(i,j) * ZT(i,j);
end
Sum = sum(v,2);
end
% n = n 时
for i = 1:m
for j = 1:m
V(i,j) = Sum(j).^(n-1) * ZT(i,j);
end
V_Sum = sum(V,2);
V_Sum = V_Sum + Sum;
if n > 1 % 边界条件
disp(['处于状态 ',num2str(i),' 的 ',num2str(n),' 期利润为 ',num2str(V_Sum(i,:))])
else
disp(['处于状态 ',num2str(i),' 的 ',num2str(n),' 期利润为 ',num2str(Sum(i,:))])
end
end
% 带利润的马氏链一般不存在平衡
% 因为钱是赚不完的
输出
转移矩阵为 :
1/2 1/2
2/5 3/5
处于状态 1 的 3 期利润为 28.5
处于状态 2 的 3 期利润为 16.8
以上
欢迎指点和交流