LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
QBD_EG.m
1function [G,R,U]=QBD_EG(A0,A1,A2,optVerbose,nargout_caller)
2%QBD_EG determines G directly if rank(A0)=1 or rank(A2)=1
3
4G=[];
5R=[];
6U=[];
7
8m=size(A1,1);
9theta=stat(A0+A1+A2);
10drift=theta*sum(A0,2)-theta*sum(A2,2);
11if (drift > 0) % pos recurrent case
12 if (rank(A0)==1) % A0 = alpha * beta ?
13 temp=min(find(sum(A0,2)>0)); % find index of first nonzero row
14 beta=A0(temp,:)/sum(A0(temp,:));
15 G=ones(m,1)*beta;
16 if (nargout_caller > 1)
17 R=A2*(eye(m)-(A1+A2*G))^(-1);
18 end
19 elseif (rank(A2)==1) % A2 = alpha * beta ?
20 eta=QBD_Caudal(A0,A1,A2);
21 R=A2*(eye(m)-A1-eta*A0)^(-1);
22 G=(eye(m)-(A1+R*A0))^(-1)*A0;
23 end
24elseif (drift < 0) % transient case
25 if (rank(A2)==1) % A2 = alpha * beta ?
26 alpha=A2*ones(m,1);
27 R=alpha*theta/(theta*alpha);
28 G=(eye(m)-(A1+R*A0))^(-1)*A0;
29 elseif (rank(A0)==1) % A0 = alpha * beta ?
30 A0hat=diag(theta.^(-1))*A2'*diag(theta);
31 A1hat=diag(theta.^(-1))*A1'*diag(theta);
32 A2hat=diag(theta.^(-1))*A0'*diag(theta);
33 etahat=QBD_Caudal(A0hat,A1hat,A2hat);
34 G=diag(theta.^(-1))*(A2hat*(eye(m)-A1hat-etahat*A0hat)^(-1))'*...
35 diag(theta);
36 if (nargout_caller > 1)
37 R=A2*(eye(m)-(A1+A2*G))^(-1);
38 end
39 end
40end
41
42if (~isempty(R) & nargout_caller > 2)
43 U=A1+R*A0;
44end
45
46if (optVerbose==1)
47 if (~isempty(G))
48 res_norm=norm(G-A0-(A1+A2*G)*G,inf);
49 fprintf('Final Residual Error for G: %d\n',res_norm);
50 end
51 if (~isempty(R) & nargout_caller > 1)
52 res_norm=norm(R-A2-R*(A1+R*A0),inf);
53 fprintf('Final Residual Error for R: %d\n',res_norm);
54 end
55 if (~isempty(U))
56 res_norm=norm(U-A1-A2*(eye(m)-U)^(-1)*A0,inf);
57 fprintf('Final Residual Error for U: %d\n',res_norm);
58 end
59end
60