LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
pfqn_kt.m
1%{
2%{
3 % @file pfqn_kt.m
4 % @brief Knessl-Tier asymptotic expansion for normalizing constant.
5%}
6%}
7
8%{
9%{
10 % @brief Knessl-Tier asymptotic expansion for normalizing constant.
11 % @fn pfqn_kt(L, N, Z)
12 % @param L Service demand matrix.
13 % @param N Population vector.
14 % @param Z Think time vector (default: zeros).
15 % @return G Normalizing constant.
16 % @return lG Logarithm of normalizing constant.
17 % @return X System throughput.
18 % @return Q Mean queue lengths.
19%}
20%}
21function [G,lG,X,Q]=pfqn_kt(L,N,Z)
22% Knessl-Tier asymptotic expansion
23if isempty(L) || isempty(N) || sum(N)==0
24 G = 1;
25 return;
26end
27if nargin<3
28 Z = N*0;
29end
30[Morig,Rorig] = size(L);
31% fix self-looping customers as they would yield Uk=1
32%slcs = 0;
33slcdemandfactor = 0;
34if Rorig>1
35 isslc = false(1,Rorig);
36 for r=1:Rorig
37 if nnz(L(:,r))==1
38 if Z(r)==0
39 ist = find(L(:,r)>0);
40 L = [L; repmat(L(ist,:),N(r),1)];
41 isslc(r) = true;
42 slcdemandfactor = N(r)*log(L(ist,r));
43 end
44 %slcs = slcs + N(r);
45 end
46 end
47 L(:,isslc)=[];
48 Z(:,isslc)=[];
49 N(:,isslc)=[];
50end
51[M,R] = size(L);
52Ntot = sum(N);
53beta = zeros(1,R);
54for r=1:R
55 beta(r) = N(r)/Ntot;
56end
57if Ntot <= 4
58 [X,Q] = pfqn_bs(L,N,Z);
59else
60 [X,Q] = pfqn_aql(L,N,Z);
61end
62delta = eye(R,R);
63C = zeros(R);
64for s=1:R
65 for r=1:R
66 SK = 0;
67 for k=1:M
68 SK = SK + X(s)*X(r)*L(k,s)*L(k,r)/max(GlobalConstants.FineTol,1-sum(X(:)'*L(k,:)'))^2;
69 end
70 C(s,r) = delta(s,r)*beta(s) + (1/Ntot) * SK;
71 end
72end
73Den = 1;
74for k=1:M
75 Den = Den * max(GlobalConstants.FineTol, 1-sum(X(:)'*L(k,:)'));
76end
77%G=(2*pi).^(-R/2)/sqrt(Ntot^R*det(C))*exp(-Ntot*beta*log(X)')/Den;
78lG = log((2*pi).^(-R/2)/sqrt(Ntot^R*det(C))) + (-Ntot*beta*log(X)') - log(Den) + slcdemandfactor;
79G = exp(lG);
80end