Test based on inequality of two vectors does not succeed.

([1,0],[0.8,0.2;0.6,0.4])
function stationarystates( S0,T )
%This function is a simple model of a Markov chain
% S0 is the initial state
% T is the transition matrix
% I want the cumulation of states to stop after state i if state i =
% state i+1. This does not happen with this code
M=S0
for i=1:1:10
if S0*T^i~=S0*T^(i-1) %Test for inequality of successive states
M((i+1),:)=S0*T^i; %M cumulates the states
else break
end
end
disp(M)
plot(M)
end

 Respuesta aceptada

Image Analyst
Image Analyst el 31 de Oct. de 2016
Editada: Image Analyst el 31 de Oct. de 2016
And of course S0*T^i will never equal S0*T^(i-1) - the exponent is different! What you need to do is use i and (i-1) as indexes into the S0 array. It looks like S0 better be an array or you won't get it to work.

5 comentarios

S0 is an initial state row vector of a Markov chain. In the example it is [1,0]. T is a corresponding transitional matrix. In the example it is [0.8,0.2;0.6,0.4]. When S0 is multiplied by increasing powers of T the states eventually become equal. I accumulate the states into the matrix M. My problem is that M does not stop accumulating the states when they become equal.
Add these lines before the if and see what gets reported to the command line:
S0*T^i
S0*T^(i-1)
Don't use semicolons so you can see what they give. If you think they're equal, then you really need to read the FAQ like I already gave you the link for. You'd need to do something like
m1 = S0*T^i
m2 = S0*T^(i-1)
mDiff = abs(m2-m1);
if max(mDiff(:)) < someSmallNumber
% They're essentially equal.
Oddur Bjarnason
Oddur Bjarnason el 31 de Oct. de 2016
Editada: Oddur Bjarnason el 31 de Oct. de 2016
>> [1,0]*[0.8,0.2;0.6,0.4]^5
ans =
0.7501 0.2499
>> [1,0]*[0.8,0.2;0.6,0.4]^6
ans =
0.7500 0.2500
>> [1,0]*[0.8,0.2;0.6,0.4]^7
ans =
0.7500 0.2500
>> m1 = [1,0]*[0.8,0.2;0.6,0.4]^6
m1 =
0.7500 0.2500
>> m2 = [1,0]*[0.8,0.2;0.6,0.4]^7
m2 =
0.7500 0.2500
>> m1-m2
ans =
1.0e-04 *
0.1280 -0.1280
Just because m1 and m2 look the same using the default display format doesn't mean they contain the same values. You can see this more clearly using a different display format.
>> format longg
>> [m1; m2; m1-m2]
ans =
0.750016 0.249984
0.7500032 0.2499968
1.2800000000035e-05 -1.27999999999795e-05
Thank you Steven, I have come to realize this. See my answer below which follows Image Analyst's answer and comments.

Iniciar sesión para comentar.

Más respuestas (1)

function stationarystates(S0,T) %This function is a simple model of a Markov chain % S0 is the initial state % T is the transition matrix % I want the cumulation of states to stop after state i if the difference % between states is small enough.
M=S0
for i=1:1:10
m1 = S0*T^i;
m2 = S0*T^(i-1);
mDiff = abs(m2-m1);
if max(mDiff(:)) > 0.00001; % The states are essentially equal.
M((i+1),:)=S0*T^i; % M cumulates the states
else break
end
end
disp(M)
plot(M)
end

1 comentario

Thank you Image Analyst. This code is accordance with your answer and comments and yields the results I needed. I realize that the rows of the matrix approach the stationary matrix asymptotically but never becomes equal to the stationary state. So I have to be satisfied with a difference between states that is small enough. Thank you again. Oddur.

Iniciar sesión para comentar.

Categorías

Más información sobre Physics en Centro de ayuda y File Exchange.

Preguntada:

el 30 de Oct. de 2016

Comentada:

el 31 de Oct. de 2016

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by