3 % @file pfqn_mmint2_gausslegendre.m
4 % @brief McKenna-Mitra integral with Gauss-Legendre quadrature.
10 % @brief McKenna-Mitra integral with Gauss-Legendre quadrature.
11 % @fn pfqn_mmint2_gausslegendre(L, N, Z, m)
12 % @param L Service demand vector.
13 % @param N Population vector.
14 % @param Z Think time vector.
15 % @param m Replication
factor (
default: 1).
16 % @return G Normalizing constant.
17 % @return lG Logarithm of normalizing constant.
20function [G,lG]= pfqn_mmint2_gausslegendre(L,N,Z,m)
21% [G,LOGG] = PFQN_MMINT2_GAUSSLEGENDRE(L,N,Z,m)
23% Integrate McKenna-Mitra integral
form with Gauss-Legendre in [0,1e6]
28persistent gausslegendreNodes;
29persistent gausslegendreWeights;
31% see _kb/03-api-layer.md (pfqn/ family: scaling, log-domain switches, dispatch gates)
33if isempty(gausslegendreNodes)
34 [gausslegendreNodes, gausslegendreWeights] = load_gausslegendre_data();
37% use at least 300 points
38n = max(300,min(length(gausslegendreNodes),2*(sum(N)+m-1)-1));
41 y(i)=N*log(Z+L*gausslegendreNodes(i))
';
43g = log(gausslegendreWeights(1:n))-gausslegendreNodes(1:n)+y(:);
44coeff = - sum(factln(N))- factln(m-1) + (m-1)*sum(log(gausslegendreNodes(1:n)));
45lG = log(sum(exp(g))) + coeff;
46if ~isfinite(lG) % if numerical difficulties switch to logsumexp trick
47 lG = logsumexp(g) + coeff;
52function [nodes, weights] = load_gausslegendre_data()
53if coder.target('MATLAB
')
55 data = load('gausslegendre-data.mat
', 'gausslegendreNodes
', 'gausslegendreWeights
');
56 nodes = data.gausslegendreNodes;
57 weights = data.gausslegendreWeights;
59 nodes = load(which('gausslegendre-
nodes.txt
'));
60 weights = load(which('gausslegendre-weights.txt
'));
63 data = coder.load('gausslegendre-data.mat
', 'gausslegendreNodes
', 'gausslegendreWeights
');
64 nodes = data.gausslegendreNodes;
65 weights = data.gausslegendreWeights;