LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
SecondOrderLevelDependentFluidSolve.m
1% [masses, iniF, KF, cloF, iniB, KB, cloB] = SecondOrderLevelDependentFluidSolve (Q, R, S, T, boundaryL, boundaryU, Qt, prec)
2%
3% * Q: cell of generators in the different layers/regimes
4% * R: cell of diagonal matrices of fluid rates in the different layers/regimes
5% * S: cell of diagonal matrices of fluid variances in the different layers/regimes
6% * T: vector of thresholds
7% * boundaryL/U: vector defining the lower and the upper boundary behavior
8% one item for each state of the background process
9% =0: reflective boundary (default)
10% =1: absorbing boundary
11%
12% The performance measures (pdf, cdf, etc.) can be computed by the
13% LevelDependentFluidStationaryDistr function.
14%
15function [masses, iniF, KF, cloF, iniB, KB, cloB] = SecondOrderLevelDependentFluidSolve (Q, R, S, T, boundaryL, boundaryU, Qt, prec)
16
17 K = length(T);
18 N = size(Q{1},1);
19
20 if ~exist('prec','var')
21 prec = 1e-14;
22 end
23 if ~exist('boundaryL','var')
24 boundaryL = zeros(K,N);
25 end
26 if ~exist('boundaryU','var')
27 boundaryU = boundaryL;
28 end
29 if ~exist('Qt','var') || isempty(Qt)
30 for k=1:K
31 Qt{k} = Q{k};
32 end
33 Qt{K+1} = Q{K};
34 elseif length(Qt)==1
35 for k=2:K+1
36 Qt{k} = Qt{1};
37 end
38 end
39
40 T = [0,T];
41
42 % preparation
43 KF = cell(1,K);
44 KB = cell(1,K);
45 cloF = cell(1,K);
46 cloB = cell(1,K);
47 Np = zeros(1,K);
48 Nn = zeros(1,K);
49 Ns = zeros(1,K);
50 NbF = zeros(1,K);
51 NbB = zeros(1,K);
52 vixp = cell(1,K);
53 vixn = cell(1,K);
54 vix0 = cell(1,K);
55 vixs = cell(1,K);
56 vixsn = cell(1,K);
57 vixsp = cell(1,K);
58 vixs0 = cell(1,K);
59 for k=1:K
60
61 S{k} = S{k}/2;
62 % collect zero states
63 ix = (1:N);
64 ix0 = ix(abs(diag(R{k}))<=prec & diag(S{k})<=prec);
65 ixn0 = setdiff(ix,ix0);
66
67 Q00 = Q{k}(ix0,ix0);
68 Q0n = Q{k}(ix0,ixn0);
69 Qn0 = Q{k}(ixn0,ix0);
70 Qnn = Q{k}(ixn0,ixn0);
71
72 Qv = Qnn + Qn0*inv(-Q00)*Q0n;
73 Rv = R{k}(ixn0,ixn0);
74 Sv = S{k}(ixn0,ixn0);
75
76 Nnz = size(Qv,1);
77
78 % partition the state space according to zero, positive and negative fluid rates
79 ix = (1:Nnz);
80 ixp = ix(diag(Rv)>prec & diag(Sv)<=prec);
81 ixn = ix(diag(Rv)<-prec & diag(Sv)<=prec);
82 ixs = ix(diag(Sv)>prec);
83 Np(k) = length(ixp);
84 Nn(k) = length(ixn);
85 Ns(k) = length(ixs);
86
87 % FORWARD parameters
88
89 % obtain "c" constant to transform matrix equations to QBD like matrix
90 % quadratic equations
91 c1 = max(-diag(Qv(ixp,ixp))./diag(Rv(ixp,ixp)));
92 discr = (diag(Rv(ixs,ixs)).^2 - 2*diag(2*Sv(ixs,ixs)).*diag(Qv(ixs,ixs)));
93 c2 = max((discr>0).*((-diag(Rv(ixs,ixs))+sqrt(discr))./diag(2*Sv(ixs,ixs))));
94 c = max([c1,c2,1]);
95
96 ixbF = [ixs,ixp];
97 NbF(k) = length(ixbF);
98
99 Bm = blkdiag(c*Sv(ixbF,ixbF),-Rv(ixn,ixn));
100 Lm = [-Rv(ixbF,ixbF)-2*c*Sv(ixbF,ixbF),zeros(NbF(k),Nn(k));Qv(ixn,ixbF)/c,Qv(ixn,ixn)/c+Rv(ixn,ixn)];
101 Fm = [Qv(ixbF,ixbF)/c+c*Sv(ixbF,ixbF)+Rv(ixbF,ixbF),Qv(ixbF,ixn)/c;zeros(Nn(k),NbF(k)+Nn(k))];
102
103 % Solve QBD for matrix R
104 [~, QBDR] = QBD_CR(Bm, Lm, Fm);
105
106 % extract K and Psi from the solution
107 KF{k} = (QBDR(1:NbF(k),1:NbF(k)) - eye(NbF(k))) * c;
108 PsiF = QBDR(1:NbF(k),NbF(k)+1:end);
109
110 % closing matrix of the stationary density of the fluid level
111
112 clovF = zeros(NbF(k),NbF(k)+Nn(k));
113 clovF(:,ixbF) = eye(NbF(k));
114 clovF(:,ixn) = PsiF;
115
116 cloF{k} = zeros(NbF(k),N);
117 cloF{k}(:,ixn0) = clovF;
118 cloF{k}(:,ix0) = clovF*Qn0*inv(-Q00);
119
120 % BACKWARD parameters
121
122 % obtain "c" constant to transform matrix equations to QBD like matrix
123 % quadratic equations
124 c1 = max(-diag(Qv(ixn,ixn))./diag(-Rv(ixn,ixn)));
125 discr = (diag(Rv(ixs,ixs)).^2 - 2*diag(2*Sv(ixs,ixs)).*diag(Qv(ixs,ixs)));
126 c2 = max((discr>0).*((diag(Rv(ixs,ixs))+sqrt(discr))./diag(2*Sv(ixs,ixs))));
127 c = max([c1,c2,1]);
128
129 ixbB = [ixs,ixn];
130 NbB(k) = length(ixbB);
131
132 Bm = blkdiag(c*Sv(ixbB,ixbB),Rv(ixp,ixp));
133 Lm = [Rv(ixbB,ixbB)-2*c*Sv(ixbB,ixbB),zeros(NbB(k),Np(k));Qv(ixp,ixbB)/c,Qv(ixp,ixp)/c-Rv(ixp,ixp)];
134 Fm = [Qv(ixbB,ixbB)/c+c*Sv(ixbB,ixbB)-Rv(ixbB,ixbB),Qv(ixbB,ixp)/c;zeros(Np(k),NbB(k)+Np(k))];
135
136 % Solve QBD for matrix R
137 [~, QBDR] = QBD_CR(Bm, Lm, Fm);
138
139 % extract K and Psi from the solution
140 KB{k} = (QBDR(1:NbB(k),1:NbB(k)) - eye(NbB(k))) * c;
141 PsiB = QBDR(1:NbB(k),NbB(k)+1:end);
142
143 % closing matrix of the stationary density of the fluid level
144 clovB = zeros(NbB(k),NbB(k)+Np(k));
145 clovB(:,ixbB) = eye(NbB(k));
146 clovB(:,ixp) = PsiB;
147
148 cloB{k} = zeros(NbB(k),N);
149 cloB{k}(:,ixn0) = clovB;
150 cloB{k}(:,ix0) = clovB*Qn0*inv(-Q00);
151
152 vixp{k} = ixn0(ixp);
153 vixn{k} = ixn0(ixn);
154 vix0{k} = ix0;
155 vixs{k} = ixn0(ixs);
156 vixsn{k} = ixn0(diag(Sv)>prec & diag(Rv)<0);
157 vixsp{k} = ixn0(diag(Sv)>prec & diag(Rv)>=0);
158 vixs0{k} = ixn0(diag(Sv)>prec & diag(Rv)==0);
159 end
160
161 % Boundary vectors
162 % ================
163
164 % Construct and solve linear set of equations for the unknows (probability
165 % masses and density parameters iniF and iniB for all regimes)
166 % ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
167 Neqns = (K+1)*N + sum(Np) + sum(Nn) + 2*sum(Ns);
168
169 if Neqns>300
170 M = sparse(Neqns,Neqns);
171 else
172 M = zeros(Neqns);
173 end
174 pos = 1;
175 for k=1:K
176 pos = [pos, N, NbF(k), NbB(k)];
177 end
178 pp = cumsum(pos);
179 p = 1;
180 i = 1;
181 % equalities for flux conservation
182 for k=0:K
183 M(pp(i):pp(i)+N-1,k*N+1:(k+1)*N) = -Qt{k+1};
184 if k>0
185 M(pp(i-2):pp(i-2)+NbF(k)-1,k*N+1:(k+1)*N) = expm(KF{k}*(T(k+1)-T(k)))*(-cloF{k}*R{k} + KF{k}*cloF{k}*S{k});
186 M(pp(i-1):pp(i-1)+NbB(k)-1,k*N+1:(k+1)*N) = -cloB{k}*R{k} - KB{k}*cloB{k}*S{k};
187 end
188 if k<K
189 M(pp(i+1):pp(i+1)+NbF(k+1)-1,k*N+1:(k+1)*N) = cloF{k+1}*R{k+1}-KF{k+1}*cloF{k+1}*S{k+1};
190 M(pp(i+2):pp(i+2)+NbB(k+1)-1,k*N+1:(k+1)*N) = expm(KB{k+1}*(T(k+2)-T(k+1)))*(cloB{k+1}*R{k+1} + KB{k+1}*cloB{k+1}*S{k+1});
191 end
192 i = i + 3;
193 end
194
195 % further equations
196 col = (K+1)*N+1;
197 ix = (1:N);
198 i = 1;
199 for k=0:K
200 if k==0
201 % mass is zero in positive and in reflective states
202 ixr0 = intersect(ix(boundaryL==0), vixs{1});
203 Nr0 = length(ixr0);
204 ms0 = zeros(N,Np(1)+Nr0);
205 ms0([vixp{1},ixr0],:) = eye(Np(1)+Nr0);
206 M(pp(i):pp(i)+N-1,col:col+Np(1)+Nr0-1) = ms0;
207 col = col + Np(1)+Nr0;
208 % density is zero in absorbing states
209 ixa0 = intersect(ix(boundaryL==1), vixs{1});
210 Na0 = length(ixa0);
211 pdfF = cloF{1};
212 pdfB = expm(KB{1}*T(2))*cloB{1};
213 M(pp(i+1):pp(i+1)+NbF(k+1)-1,col:col+Na0-1) = pdfF(:,ixa0);
214 M(pp(i+2):pp(i+2)+NbB(k+1)-1,col:col+Na0-1) = pdfB(:,ixa0);
215 col = col + Na0;
216 elseif k==K
217 % mass is zero in negative and in reflective states
218 ixrB = intersect(ix(boundaryU==0), vixs{K});
219 NrB = length(ixrB);
220 ms0 = zeros(N,Nn(K)+NrB);
221 ms0([vixn{K},ixrB],:) = eye(Nn(K)+NrB);
222 M(pp(i):pp(i)+N-1,col:col+Nn(K)+NrB-1) = ms0;
223 col = col + Nn(K)+NrB;
224 % density is zero in absorbing states
225 ixaB = intersect(ix(boundaryU==1), vixs{K});
226 NaB = length(ixaB);
227 pdfF = expm(KF{K}*(T(K+1)-T(K)))*cloF{K};
228 pdfB = cloB{K};
229 M(pp(i-2):pp(i-2)+NbF(k)-1,col:col+NaB-1) = pdfF(:,ixaB);
230 M(pp(i-1):pp(i-1)+NbB(k)-1,col:col+NaB-1) = pdfB(:,ixaB);
231 col = col + NaB;
232 else
233 % there is no mass except S+(k) U S-(k+1)
234 st0 = setdiff(ix, union(intersect(vixp{k},vixn{k+1}),union(vix0{k},vix0{k+1})));
235 N0 = length(st0);
236 ms0 = zeros(N,N0);
237 ms0(st0,:) = eye(N0);
238 M(pp(i):pp(i)+N-1,col:col+N0-1) = ms0;
239 col = col + N0;
240 % equations for the second-order states
241 sts = setdiff(union(vixs{k},vixs{k+1}), union(vixn{k+1},vixp{k}));
242 Nss = length(sts);
243 BelowF = expm(KF{k}*(T(k+1)-T(k)))*-cloF{k}*sqrt(S{k});
244 BelowB = -cloB{k}*sqrt(S{k});
245 AboveF = cloF{k+1}*sqrt(S{k+1});
246 AboveB = expm(KB{k+1}*(T(k+2)-T(k+1)))*cloB{k+1}*sqrt(S{k+1});
247 M(pp(i-2):pp(i-2)+NbF(k)-1,col:col+Nss-1) = BelowF(:,sts);
248 M(pp(i-1):pp(i-1)+NbB(k)-1,col:col+Nss-1) = BelowB(:,sts);
249 M(pp(i+1):pp(i+1)+NbF(k+1)-1,col:col+Nss-1) = AboveF(:,sts);
250 M(pp(i+2):pp(i+2)+NbB(k+1)-1,col:col+Nss-1) = AboveB(:,sts);
251 col = col + Nss;
252 end
253 i = i + 3;
254 end
255
256 % this function computes the integral of a matrix exponential from 0 to
257 % L if it has a 0 eigenvalue hence can not be inverted
258 function KAi = integExp(KA,L)
259 l=CRPSolve(KA);
260 r=CRPSolve(KA')';
261 l=l/(l*r);
262 KAi = inv(-(KA-r*l)) *(eye(size(KA,1))-expm((KA-r*l)*L)) + r*l*(L+exp(-L)-1);
263 end
264
265 % this function receives two matrices and calculates the integrals of
266 % the matrix exponentials if exactly one of them has a 0 eigenvalue
267 function [KAi,KBi] = integExp2(KA,KB,L)
268 if min(abs(eig(KA))) > min(abs(eig(KB)))
269 KAi = inv(-KA)*(eye(size(KA,1))-expm(KA*L));
270 KBi = integExp(KB, L);
271 else
272 KAi = integExp(KA, L);
273 KBi = inv(-KB)*(eye(size(KB,1))-expm(KB*L));
274 end
275 end
276
277 % normalizing condition
278 h = ones(N,1);
279 Mi = cell(1,K);
280 for k=1:K
281 [sumKF, sumKB] = integExp2(KF{k}, KB{k}, T(k+1)-T(k));
282 h = [h; sum(sumKF*cloF{k},2); sum(sumKB*cloB{k},2); ones(N,1)];
283 Mi{k} = [sum(sumKF*cloF{k},2); sum(sumKB*cloB{k},2)];
284 end
285
286 % solve linear system
287 M(:,1) = h;
288 b = [1,zeros(1,length(h)-1)]/M;
289
290 % obtain solution
291 masses = cell(1,K);
292 iniF = cell(1,K);
293 iniB = cell(1,K);
294 masses{1} = b(1:N);
295 i = 2;
296 for k=1:K
297 iniF{k} = b(pp(i):pp(i)+NbF(k)-1);
298 iniB{k} = b(pp(i+1):pp(i+1)+NbB(k)-1);
299 masses{k+1} = b(pp(i+2):pp(i+2)+N-1);
300 i = i + 3;
301 end
302end
303
Definition Station.m:245