1function G=MG1_NI(A,varargin)
2% Newton Iteration
for M/G/1-Type Markov Chains
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
10% Mode: method used to solve the linear system at each iteration and
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)
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,
37OptionValues{1}=[
'DirectSum ';
44OptionValues{3}=[
'one';
50for i=1:size(OptionNames,1)
51 options.(deblank(OptionNames(i,:)))=[];
55options.Mode='RealSchurShift';
57options.ShiftType='one';
59options.EpsilonValue=10^(-14);
61% Parse Optional Parameters
62options=ParseOptPara(options,OptionNames,OptionTypes,OptionValues,varargin);
64% check whether G
is known explicitly
65G=MG1_EG(A,options.Verbose);
70if (strfind(options.Mode,'Shift')>0)
71 if (options.Verbose == 1)
74 [A,drift,tau,v]=MG1_Shifts(A,options.ShiftType);
84while(check > options.EpsilonValue && numit < options.MaxNumIt)
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);
91 B(:,i*m+1:(i+1)*m) = A(:,i*m+1:(i+1)*m) + B(:,(i+1)*m+1:(i+2)*m)*G;
95 B(:,1:m) = B(:,1:m) - eye(m);
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);
102 Y = solveSylvPowersDirectSum(G, B, C);
106 check=norm(G-Gold,inf);
108 if (~mod(numit,options.Verbose))
109 fprintf('Check after %d iterations: %d\n',numit,check);
113if (numit == options.MaxNumIt)
114 warning('Maximum Number of Iterations %d reached',numit);
117if (strfind(options.Mode,'Shift'))
118 switch options.ShiftType
120 G=G+(drift<1)*ones(m,m)/m;
122 G=G+(drift>1)*tau*v*ones(1,m);
124 G=G+(drift<1)*ones(m,m)/m+(drift>1)*tau*v*ones(1,m);
128if (options.Verbose>0)
129 if (strfind(options.Mode,'Shift'))
132 temp=A(:,end-m+1:end);
134 temp=A(:,(i-1)*m+1:i*m)+temp*G;
136 res_norm=norm(G-temp,inf);
137 fprintf('Final Residual Error for G: %d\n',res_norm);