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% nodes and weights generated with tridiagonal eigenvalues method in
32% high-precision using Julia:
33%
34% using LinearAlgebra
35%
36% function gauss(a, b, N)
37% λ, Q = eigen(SymTridiagonal(zeros(N), [n / sqrt(4n^2 - 1) for n = 1:N-1]))
38% @. (λ + 1) * (b - a) / 2 + a, [2Q[1, i]^2 for i = 1:N] * (b - a) / 2
39% end
40
41if isempty(gausslegendreNodes)
42 [gausslegendreNodes, gausslegendreWeights] = load_gausslegendre_data();
43end
44
45% use at least 300 points
46n = max(300,min(length(gausslegendreNodes),2*(sum(N)+m-1)-1));
47y = zeros(1,n);
48for i=1:n
49 y(i)=N*log(Z+L*gausslegendreNodes(i))';
50end
51g = log(gausslegendreWeights(1:n))-gausslegendreNodes(1:n)+y(:);
52coeff = - sum(factln(N))- factln(m-1) + (m-1)*sum(log(gausslegendreNodes(1:n)));
53lG = log(sum(exp(g))) + coeff;
54if ~isfinite(lG) % if numerical difficulties switch to logsumexp trick
55 lG = logsumexp(g) + coeff;
56end
57G = exp(lG);
58end
59
60function [nodes, weights] = load_gausslegendre_data()
61if coder.target('MATLAB')
62 data = load('gausslegendre-data.mat', 'gausslegendreNodes', 'gausslegendreWeights');
63else
64 data = coder.load('gausslegendre-data.mat', 'gausslegendreNodes', 'gausslegendreWeights');
65end
66nodes = data.gausslegendreNodes;
67weights = data.gausslegendreWeights;
68end
Definition mmt.m:124