1% H. Emre Kankaya and Nail Akar:
2% Solving Multi-Regime Feedback Fluid Queues
3% ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4% R and Q are cells with kth element (k=1...K) Q,R parameters describing
the
5% behaviour in regime k, Qt, Rt are cells with kth elements (k=0...K)
6% describing
the behaviour at
the kth boundary, T
is the vector of
7% thresholds of regimes (k=1...K).
11%
if R{k}(m)==0 then Rt{k}(m)=0 and Rt{k+1}(m)=0 must hold
12% repulsive states: boundary rate must be 0 or right or left continuous
13% absorbing states: boundary rate must be 0
14% all other states: boundary rate must be right or left continuous
15% in all regimes
the mean drift must be non-zero
17% momnum: number of buffer length moments to compute
18% arrivals: cell of input rates in all regimes. If given, buffer length
19% moments will be embedded to arrival instants
21function [pdf, pdfd, cdf, cdfm] = multiregime (Q, R, Qt, Rt, T, pdfpoints, cdfpoints)
27% Convenience operations
28% ~~~~~~~~~~~~~~~~~~~~~~
53% Obtain transfer matrices
for the regimes
54% ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
59 % find negative, positive and zero states in each regime
63 Qnk = Q{k}(nzix,nzix) + Q{k}(nzix,zix)*inv(-Q{k}(zix,zix))*Q{k}(zix,nzix);
64 A = Qnk*diag(1./R{k}(nzix));
66 [Z,D] = ordschur (Z1, D1, 5*(abs(diag(D1))<1e-10) + 2*(diag(D1)<0) + 1*(diag(D1)>0));
67 zeroeig = sum(abs(diag(D1))<1e-10);
68 poseig = sum(diag(D(zeroeig+1:end,zeroeig+1:end))>0);
69 negeig = sum(diag(D(zeroeig+1:end,zeroeig+1:end))<0);
71% X1 = -D(1,2:end) / D(2:end,2:end);
72% X1b = quasitriangular (D(2:end,2:end), D(1,2:end));
73 X1 = sylvester (zeros(zeroeig), -D(zeroeig+1:end, zeroeig+1:end), D(1:zeroeig, zeroeig+1:end));
76 %
the two lines below should give
the same result but matlab
's version
77 % is much more unstable numerically
78% X2 = lyap (-D(2:1+negeig,2:1+negeig), D(1+negeig+1:end, 1+negeig+1:end), D(2:1+negeig, 1+negeig+1:end));
79 X2 = sylvester (D(zeroeig+1:zeroeig+negeig,zeroeig+1:zeroeig+negeig), -D(zeroeig+negeig+1:end, zeroeig+negeig+1:end), D(zeroeig+1:zeroeig+negeig, zeroeig+negeig+1:end));
80 Y = Z * [eye(zeroeig), -X1; zeros(Nn-zeroeig,zeroeig), eye(Nn-zeroeig)] * [eye(zeroeig) zeros(zeroeig,Nn-zeroeig); zeros(negeig,zeroeig) eye(negeig) -X2; zeros(poseig,zeroeig+negeig), eye(poseig)];
83 iY0 = iY(1:zeroeig,:);
84 iYn = iY(zeroeig+1:zeroeig+negeig,:);
85 iYp = iY(zeroeig+negeig+1:end,:);
88 An{k} = At(zeroeig+1:zeroeig+negeig, zeroeig+1:zeroeig+negeig);
89 Ap{k} = At(zeroeig+negeig+1:end, zeroeig+negeig+1:end);
92 L0{k}(:,zix) = iY0*Q{k}(nzix,zix)*inv(-Q{k}(zix,zix));
94 Ln{k}(:,zix) = iYn*Q{k}(nzix,zix)*inv(-Q{k}(zix,zix));
96 Lp{k}(:,zix) = iYp*Q{k}(nzix,zix)*inv(-Q{k}(zix,zix));
99 M0{k} = [L0{k}; Ln{k}; expm(-Ap{k}*Tk)*Lp{k}];
100 MT{k} = [L0{k}; expm(An{k}*Tk)*Ln{k}; Lp{k}];
101 if rcond(-An{k})<1e-10 || rcond(-Ap{k})<1e-10
104 Mi{k} = [Tk*L0{k}; inv(-An{k})*(eye(negeig)-expm(An{k}*Tk))*Ln{k}; inv(Ap{k})*(eye(poseig)-expm(-Ap{k}*Tk))*Lp{k}];
106 Npos = [Npos; Npos(end)+Nn];
109% Construct and solve linear set of equations for the unknows (probability
110% masses and density parameters a0 a- a+ for all regimes)
111% ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
112Neqns = (K+1)*N+sum(Nnz);
118% number of equations for the masses: (K+1)*N, corresponding variables located between indices 1...d
119% number of initial densities: K*sum(Nnz), starting at d+1
122M(1:N,p:p+N-1) = -Qt{1};
123M(d+Npos(1):d+Npos(1)+Nnz(1)-1,p:p+N-1) = M0{1}*diag(R{1});
127 M(k*N+1:(k+1)*N,p:p+N-1) = -Qt{k+1};
128 M(d+Npos(k+1):d+Npos(k+1)+Nnz(k+1)-1,p:p+N-1) = M0{k+1}*diag(R{k+1});
129 M(d+Npos(k):d+Npos(k)+Nnz(k)-1,p:p+N-1) = -MT{k}*diag(R{k});
133M(K*N+1:(K+1)*N,p:p+N-1) = -Qt{K+1};
134M(d+Npos(K):d+Npos(K)+Nnz(K)-1,p:p+N-1) = -MT{K}*diag(R{K});
139 M(:,p) = zeros(Neqns,1);
147 M(:,p) = zeros(Neqns,1);
155 if (R{k}(m)>0 && R{k+1}(m)>0) || (R{k}(m)<0 && R{k+1}(m)<0)
156 M(:,p) = zeros(Neqns,1);
165 if (R{k}(m)<0 && R{k+1}(m)>0) && Rt{k+1}(m)~=0
166 M(:,p) = zeros(Neqns,1);
175 if R{k}(m)<0 && Rt{k+1}(m)>=0
176 M(:,p) = zeros(Neqns,1);
177 M(d+Npos(k):d+Npos(k)+Nnz(k)-1,p) = MT{k}(:,m);
185 if R{k+1}(m)>0 && Rt{k+1}(m)<=0
186 M(:,p) = zeros(Neqns,1);
187 M(d+Npos(k+1):d+Npos(k+1)+Nnz(k+1)-1,p) = M0{k+1}(:,m);
194% sum up probability mass
196M(1:d,npos) = ones(d,1);
197% sum up integrals of transfer matrices
199 M(d+Npos(k):d+Npos(k)+Nnz(k)-1,npos) = sum(Mi{k},2);
205% solve linear set of equations
208% extract results of the regimes
215 masses{k+1} = sol(k*N+1:(k+1)*N);
216 avec = sol(d+Npos(k):d+Npos(k)+Nnz(k)-1);
217 a0{k} = avec(1:Nnz(k)-size(An{k},1)-size(Ap{k},1));
218 an{k} = avec(length(a0{k})+1:length(a0{k})+size(An{k},1));
219 ap{k} = avec(length(a0{k})+length(an{k})+1:length(a0{k})+length(an{k})+size(Ap{k},1));
222% calculate pdf at the requested points
226 while k<K && p>=T(k+1)
229 presp = a0{k}*L0{k} + an{k}*expm(An{k}*(p-T(k)))*Ln{k} + ap{k}*expm(-Ap{k}*(T(k+1)-p))*Lp{k};
236 while k<K && p>=T(k+1)
239 presp = an{k}*An{k}*expm(An{k}*(p-T(k)))*Ln{k} + ap{k}*Ap{k}*expm(-Ap{k}*(T(k+1)-p))*Lp{k};
240 pdfd = [pdfd; presp];
243% calculate cdf at the requested points
246for ix=1:length(cdfpoints)
251 while k<K && c>=T(k+1)
253 cres = cres + [a0{k} an{k} ap{k}] * Mi{k};
254 cresm = cresm + [a0{k} an{k} ap{k}] * Mi{k};
256 cresm = cresm + masses{k+1};
258 cres = cres + masses{k+1};
263 cresm = cresm + masses{k+1};
267 val = a0{k}*L0{k}*crem + an{k}*inv(-An{k})*(eye(size(An{k}))-expm(An{k}*crem))*Ln{k} + ap{k}*inv(-Ap{k})*(expm(-Ap{k}*Tk) - expm(-Ap{k}*(Tk-crem)))*Lp{k};
271 cdfm = [cdfm; cresm];