1function [G,R,U]=QBD_LR(A0,A1,A2,varargin)
2%QBD_LR Logaritmic reduction
for Quasi-Birth-Death Markov Chains [Latouche,Ramaswami]
6% G=QBD_LR(A0,A1,A2) computes the minimal nonnegative solution to the
7% matrix equation G = A0 + A1 G + A2 G^2, where A,B and C are square
8% nonnegative matrices, with (A0+A1+A2) irreducible and stochastic
10% [G,R]=QBD_LR(A0,A1,A2) also provides the minimal nonnegative solution
11% to the matrix equation R = A2 + R A1 + R^2 A0
13% [G,R,U]=QBD_LR(A0,A1,A2) also provides the minimal nonnegative solution
14% to the matrix equation U = A1 + A2 (I-U)^(-1) A0
16% CONTINUOUS TIME CASE:
18% G=QBD_LR(A0,A1,A2) computes the minimal nonnegative solution to the
19% matrix equation 0 = A0 + A1 G + A2 G^2, where A,B and C are square
20% nonnegative matrices, with (A0+A1+A2) having row sums equal to zero
22% [G,R]=QBD_LR(A0,A1,A2) also provides the minimal nonnegative solution
23% to the matrix equation 0 = A2 + R A1 + R^2 A0
25% [G,R,U]=QBD_LR(A0,A1,A2) also provides the minimal nonnegative solution
26% to the matrix equation U = A1 + A2 (-U)^(-1) A0
30% MaxNumIt: Maximum number of iterations (default: 50)
31% Verbose: The residual error
is printed at each step when set to 1,
33% Mode:
'Basic' uses the Basic Cyclic Reduction
34%
'Shift' uses the shift technique to accelarate convergence
36% RAPComp: set to 1 if the QBD has RAP components
46OptionValues{1}=[
'Basic';
50for i=1:size(OptionNames,1)
51 options.(deblank(OptionNames(i,:)))=[];
60% Parse Optional Parameters
61options=ParseOptPara(options,OptionNames,OptionTypes,OptionValues,varargin);
64 % Convert to discrete time problem, if needed
67 if (sum(diag(A1)<0)) % continues time
76 QBD_ParsePara(A0,A1,A2);
79 QBD_RAP_ParsePara(A0,A1,A2);
81 % Convert to discrete time problem - uniformization
90% check whether G
is known explicitly
91[G,R,U]=QBD_EG(A0,A1,A2,options.Verbose,nargout);
101if (options.Mode=='Shift')
102 theta=stat(A0+A1+A2);
103 drift=theta*sum(A0,2)-theta*sum(A2,2);
104 if (drift < 0) % MC
is transient -> use the dual MC
105 if (nargout > 1 | options.Verbose==1)
108 A2=A2-ones(m,1)*(theta*A2);
109 A1=A1+ones(m,1)*(theta*A0);
112 if (nargout > 2 | options.Verbose==1) % store A0old to compute U
120% Start of Logaritmic Reduction (Basic)
121B2=(eye(m) - A1)^(-1);
124if (nargout <= 1 & options.Verbose ~= 1) % A1 and A2 only needed to compute R, U
131while(check > 10^(-14) & numit < options.MaxNumIt)
135 B0=(eye(m)-A1star)^(-1);
140 check=min(norm(B0,inf),norm(B2,inf));
142 if (options.Verbose==1)
143 fprintf('Check after %d iterations: %d\n',numit,check);
147if (numit == options.MaxNumIt)
148 warning('Maximum Number of Iterations %d reached',numit);
150clear PI A0star A1star A2star B0 B2;
153if (options.Mode=='Shift')
154 if (drift < 0) % transient
155 if (nargout > 1 | options.Verbose==1)
156 A1=A1-ones(m,1)*theta*A0; % restore original A1
157 A2=A2old; % restore original A2
161 if (nargout > 1 | options.Verbose==1)
162 A1=A1-sum(A2,2)*uT; % restore original A1
164 if (nargout > 2 | options.Verbose==1)
165 A0=A0old; % restore original A0
170if (options.Verbose==1)
171 res_norm=norm(G-A0-(A1+A2*G)*G,inf);
172 fprintf('Final Residual Error for G: %d\n',res_norm);
177 R=A2*(eye(m)-(A1+A2*G))^(-1);
178 if (options.Verbose==1)
179 res_norm=norm(R-A2-R*(A1+R*A0),inf);
180 fprintf('Final Residual Error for R: %d\n',res_norm);
187 if (options.Verbose==1)
188 res_norm=norm(U-A1-A2*(eye(m)-U)^(-1)*A0,inf);
189 fprintf('Final Residual Error for U: %d\n',res_norm);