LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
MG1_NI.m
1function G=MG1_NI(A,varargin)
2% Newton Iteration for M/G/1-Type Markov Chains
3%
4% G=MG1_NI(A) solves G = A0 + A1 G + A2 G^2 + A3 G^3 + ... + A_max G^max,
5% where A = [A0 A1 A2 A3 ... AN] has m rows and m*(N+1) columns and is
6% a nonnegative matrix, with (A0+A1+A2+...+AN irreducible and stochastic
7%
8% Optional Parameters:
9%
10% Mode: method used to solve the linear system at each iteration and
11% optional shifting
12% 'DirectSum': solves the system directly
13% 'DirectSumShift': solves the system directly + Shift
14% 'RealSchur': applies a real Schur decomposition (default)
15% 'RealSchurShift': applies a real Schur decomposition + Shift
16% 'ComplexSchur': applies a complex Schur decomposition
17% 'ComplexSchurShift': applies a complex Schur decomposition + Shift
18% MaxNumIt: Maximum number of iterations (default: 50)
19% ShiftType: 'one' (default if shift mode is selected)
20% 'tau'
21% 'dbl'
22% EpsilonValue: Required accuracy, used as stop criterium (default:10^(-14))
23% Verbose: The residual error is printed at each step when set to 1,
24% (default:0)
25
26
27OptionNames=['Mode ';
28 'MaxNumIt ';
29 'ShiftType ';
30 'EpsilonValue';
31 'Verbose '];
32OptionTypes=['char ';
33 'numeric';
34 'char ';
35 'numeric';
36 'numeric'];
37OptionValues{1}=['DirectSum ';
38 'DirectSumShift ';
39 'RealSchur ';
40 'RealSchurShift ';
41 'ComplexSchur ';
42 'ComplexSchurShift'];
43
44OptionValues{3}=['one';
45 'tau';
46 'dbl'];
47
48
49options=[];
50for i=1:size(OptionNames,1)
51 options.(deblank(OptionNames(i,:)))=[];
52end
53
54% Default settings
55options.Mode='RealSchurShift';
56options.MaxNumIt=50;
57options.ShiftType='one';
58options.Verbose=0;
59options.EpsilonValue=10^(-14);
60
61% Parse Optional Parameters
62options=ParseOptPara(options,OptionNames,OptionTypes,OptionValues,varargin);
63
64% check whether G is known explicitly
65G=MG1_EG(A,options.Verbose);
66if (~isempty(G))
67 return
68end
69
70if (strfind(options.Mode,'Shift')>0)
71 if (options.Verbose == 1)
72 Aold=A;
73 end
74 [A,drift,tau,v]=MG1_Shifts(A,options.ShiftType);
75end
76
77
78m = size(A,1);
79N = size(A,2)/m-1;
80
81G = zeros(m);
82check = 1;
83numit = 0;
84while(check > options.EpsilonValue && numit < options.MaxNumIt)
85 Gold = G;
86
87 %Compute B: matrices premultiplying Y_k, and C: right-hand side
88 B = zeros(m, (N+1)*m);
89 B(:,N*m+1:(N+1)*m) = A(:,N*m+1:(N+1)*m);
90 for i = N-1:-1:0
91 B(:,i*m+1:(i+1)*m) = A(:,i*m+1:(i+1)*m) + B(:,(i+1)*m+1:(i+2)*m)*G;
92 end
93 C = G - B(:,1:m);
94 B = B(:,m+1:end);
95 B(:,1:m) = B(:,1:m) - eye(m);
96
97 if strfind(options.Mode,'RealSchur') > 0
98 Y = solveSylvPowersRealSchur_FW(G, B, C);
99 elseif strfind(options.Mode,'ComplexSchur') > 0
100 Y = solveSylvPowersComplexSchur_FW(G, B, C);
101 else
102 Y = solveSylvPowersDirectSum(G, B, C);
103 end
104
105 G = G + Y;
106 check=norm(G-Gold,inf);
107 numit = numit + 1;
108 if (~mod(numit,options.Verbose))
109 fprintf('Check after %d iterations: %d\n',numit,check);
110 end
111end
112%numit
113if (numit == options.MaxNumIt)
114 warning('Maximum Number of Iterations %d reached',numit);
115end
116
117if (strfind(options.Mode,'Shift'))
118 switch options.ShiftType
119 case 'one'
120 G=G+(drift<1)*ones(m,m)/m;
121 case 'tau'
122 G=G+(drift>1)*tau*v*ones(1,m);
123 case 'dbl'
124 G=G+(drift<1)*ones(m,m)/m+(drift>1)*tau*v*ones(1,m);
125 end
126end
127
128if (options.Verbose>0)
129 if (strfind(options.Mode,'Shift'))
130 A=Aold;
131 end
132 temp=A(:,end-m+1:end);
133 for i=N:-1:1
134 temp=A(:,(i-1)*m+1:i*m)+temp*G;
135 end
136 res_norm=norm(G-temp,inf);
137 fprintf('Final Residual Error for G: %d\n',res_norm);
138end