LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
pfqn_mmint2_gausslegendre.m
1%{
2%{
3 % @file pfqn_mmint2_gausslegendre.m
4 % @brief McKenna-Mitra integral with Gauss-Legendre quadrature.
5%}
6%}
7
8%{
9%{
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.
18%}
19%}
20function [G,lG]= pfqn_mmint2_gausslegendre(L,N,Z,m)
21% [G,LOGG] = PFQN_MMINT2_GAUSSLEGENDRE(L,N,Z,m)
22%
23% Integrate McKenna-Mitra integral form with Gauss-Legendre in [0,1e6]
24if nargin<4
25 m=1; % multiplicity
26end
27
28persistent gausslegendreNodes;
29persistent gausslegendreWeights;
30
31% see _kb/03-api-layer.md (pfqn/ family: scaling, log-domain switches, dispatch gates)
32
33if isempty(gausslegendreNodes)
34 [gausslegendreNodes, gausslegendreWeights] = load_gausslegendre_data();
35end
36
37% use at least 300 points
38n = max(300,min(length(gausslegendreNodes),2*(sum(N)+m-1)-1));
39y = zeros(1,n);
40for i=1:n
41 y(i)=N*log(Z+L*gausslegendreNodes(i))';
42end
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;
48end
49G = exp(lG);
50end
51
52function [nodes, weights] = load_gausslegendre_data()
53if coder.target('MATLAB')
54 try
55 data = load('gausslegendre-data.mat', 'gausslegendreNodes', 'gausslegendreWeights');
56 nodes = data.gausslegendreNodes;
57 weights = data.gausslegendreWeights;
58 catch
59 nodes = load(which('gausslegendre-nodes.txt'));
60 weights = load(which('gausslegendre-weights.txt'));
61 end
62else
63 data = coder.load('gausslegendre-data.mat', 'gausslegendreNodes', 'gausslegendreWeights');
64 nodes = data.gausslegendreNodes;
65 weights = data.gausslegendreWeights;
66end
67end
Definition fjtag.m:161