1function pi=MG1_pi(B,A,G,varargin)
2%NSF_pi Stationary vector of a Non-Skip-Free Markov Chains [Neuts, Ramaswami]
4% pi=NSF_pi(B,A,G) computes the stationary vector of a Non-Skip-Free
5% Markov chain with a transition matrix of the form
7% B10 B11 B12 B13 B14 ...
8% B20 B21 B22 B23 B24 ...
10% BN0 BN1 BN2 BN3 BN4 ...
12%
P = 0 A0 A1 A2 A3 ...
16% the input matrix G
is the minimal nonnegative solution to the matrix
17% equation G = C0 + C1 G + C2 G^2 + ... + Ccmax G^cmax of the
18% reblocked system, A = [A0 A1 ... Aamax] and B=[B00 B01 B02 ... B0bmax;
19% B10 B11 B12 ... B1bmax; ... ; BN0 BN1 BN2 ... BNbmax]
21% pi=NSF_pi([],A,G) computes the stationary vector of an M/G/1-type
22% Markov chain with a transition matrix of the form, i.e., Bij = Aj
30%
P = 0 A0 A1 A2 A3 ...
36% MaxNumComp: Maximum number of components (
default: 500)
37% Verbose: The accumulated probability mass
is printed at every
38% n steps when set to n (default:0)
39% FirstBlockRow: When set to 1, it suffices to give the first
40% blockrow of G as input (default:0)
43OptionNames=[
'FirstBlockRow'
55for i=1:size(OptionNames,1)
56 options.(deblank(OptionNames(i,:)))=[];
60options.MaxNumComp=500;
63options.FirstBlockRow=[];
65% Parse Optional Parameters
66options=ParseOptPara(options,OptionNames,OptionTypes,OptionValues,varargin);
69K=size(A,2)/m-1; % degree of A(z)
72if ( options.FirstBlockRow )
73 % compute remaining blockrows of G
74 G(m+1:N*m,1:N*m)=zeros(m*(N-1),m*N);
76 G((j-1)*m+1:j*m,:)=[zeros(m) G((j-2)*m+1:(j-1)*m,1:(N-1)*m)]+...
77 G((j-2)*m+1:(j-1)*m,(N-1)*m+1:end)*G(1:m,:);
81% construct reblocked Ci matrices
82extraBlocksC=N-1-mod(K-1,N);
83C=zeros(N*m,m*(N-1)+size(A,2)+m*extraBlocksC);
86 C(i*m+1:(i+1)*m,i*m+1:(i+K+1)*m)=A;
90 extraBlocksB=N-1-mod(K,N);
91 B=[B zeros(N*m,m*extraBlocksB)];
92 pi=MG1_pi(B,C,G,'Verbose',options.Verbose,'MaxNumComp',options.MaxNumComp/N);
94 FirstRowSumsG=G(1:m,1:m);
96 FirstRowSumsG(1:m,(i-1)*m+1:i*m)=...
97 FirstRowSumsG(1:m,(i-2)*m+1:(i-1)*m)+G(1:m,(i-1)*m+1:i*m);
99 ghat=stat(FirstRowSumsG(:,(N-1)*m+1:end));
101 % to nomalize pi0 we need to compute the first m components of mu1
102 g=ghat*FirstRowSumsG;
104 % beta = Cmax e + (Cmax + Cmax-1) e + ... (Cmax + ... + C1)e
106 for i=size(C,2)/(m*N):-1:2
107 CSum=CSum+C(:,(i-1)*m*N+1:i*m*N);
108 beta=beta+sum(CSum,2);
110 CSum=CSum+C(:,1:m*N);
111 temp=(eye(m*N)-CSum+(ones(m*N,1)-beta)*g)^(-1)*ones(N*m,1);
112 temp=([eye(m) zeros(m,(N-1)*m)]-G(1:m,:)+ones(m,1)*g)*temp;
114 % compute B matrices of M/G/1
116 extraBlocksB=N-1-mod(K,N);
117 B=[B zeros(N*m,m*extraBlocksB)];
118 pi=MG1_pi(B,C,G,'InputPiZero',pi0,'Verbose',options.Verbose,...
119 'MaxNumComp',options.MaxNumComp/N);