LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
pfqn_lap.m
1%{
2%{
3 % @file pfqn_lap.m
4 % @brief Laplace approximation for normalizing constant.
5%}
6%}
7
8%{
9%{
10 % @brief Laplace approximation for normalizing constant.
11 % @fn pfqn_lap(L, N, Z)
12 % @param L Service demand matrix.
13 % @param N Population vector.
14 % @param Z Think time vector.
15 % @return logI Logarithm of normalizing constant approximation.
16%}
17%}
18function [logI] = pfqn_lap(L,N,Z)
19% [LOGI] = PFQN_LAP(L,N,Z)
20
21Ntot = sum(N);
22% f = @(x) 1-x + sum((N+x*L)./(Z+x*L));
23% expv0 = fzero(f,1);
24% logIv = log(Ntot) - sum(factln(N)); % coeff
25% logIv = logIv - + sum(N.*log(Z+L.*expv0)); % f(u0)
26% logIv = logIv + 0.5*log(2*pi) - 0.5*log(sum((N./Ntot)./(Z./(Ntot.*L)+u0).^2)) ; % f''(u0)
27% logIv = logIv - 0.5*log(Ntot);
28
29Ntot = sum(N);
30f = @(x) 1-sum(N.*L./(Z+Ntot*L.*x));
31u0 = fzero(f,1,optimset('Display','off'));
32if u0<0
33 logI = NaN;
34 return
35end
36% f2 = sum((N./Ntot)./(Z./(Ntot.*L)+u0).^2);
37% logI = log(1-normcdf(0,u0,f2));
38% return
39%end
40if ~isfinite(u0)
41 initSign = f(0.001)/abs(f(0.001));
42 for u0 = 1e-4:1e-4:10
43 fu0 = f(u0);
44 if fu0/abs(fu0) ~= initSign
45 break;
46 end
47 end
48end
49if u0<0
50 logI = NaN;
51 return
52end
53logI = log(Ntot) - sum(factln(N)); % coeff
54logI = logI - Ntot*u0 + sum(N.*log(Z+L.*u0*Ntot)); % f(u0)
55logI = logI + 0.5*log(2*pi) - 0.5*log(sum((N./Ntot)./(Z./(Ntot.*L)+u0).^2)) ; % f''(u0)
56logI = logI - 0.5*log(Ntot);
57
58% absf2 = sum((N./Ntot)./(Z./(Ntot.*L)+u0).^2); % |f''(u0)|
59% f2 = sum((N./Ntot)./(Z./(Ntot.*L)+u0).^2);
60% f3 = -2 * sum((N./Ntot)./(Z./(Ntot.*L)+u0).^3);
61% f4 = 6 * sum((N./Ntot)./(Z./(Ntot.*L)+u0).^4);
62%
63% logI3 = log(Ntot) - sum(factln(N)); % coeff
64% logI3 = logI3 - Ntot*u0 + sum(N.*log(Z+L.*u0*Ntot)); % f(u0)
65% logI3 = logI3 + (1/2)*log(2*pi/absf2) - (3/2)*log(Ntot);
66% logI3 = logI3 + log(f4/(8*f2^2) - 5*f3^2/(24*f2^3));
67end