LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
aph_fit.m
1function [APH, isexact] = aph_fit(e1,e2,e3,nmax)
2% APH = aph_fit(e1,e2,e3,nmax) - moment matching of APH(n) distribution
3% nmax = max order (default: 10)
4%
5% Implementation of: A.Bobbio, A.Horvath, M.Telek, Matching three moments
6% with minimal acyclic phase type distributions, Stochastic Models
7% 21:303-326, 2005.
8
9isexact = true;
10if nargin < 4
11 nmax = 10;
12end
13if isinf(e2) || isinf(e3)
14 APH = map_exponential(e1);
15 return
16end
17n2 = e2/e1^2;
18n3 = e3/e1/e2;
19
20% find order
21n2_feas = false;
22n3_ubfeas = false;
23n3_lbfeas = false;
24n = 1;
25un = 0;
26while (n2_feas == false || n3_lbfeas == false || n3_ubfeas == false ) && n < nmax
27 n = n + 1;
28 pn = ((n+1)*(n2-2)/(3*n2*(n-1)))*(-2*sqrt(n+1)/sqrt(4*(n+1)-3*n*n2) - 1);
29 an = (n2 - 2) / (pn*(1-n2) + sqrt(pn^2+pn*n*(n2-2)/(n-1)));
30 ln = ((3+an)*(n-1)+2*an)/((n-1)*(1+an*pn)) - (2*an*(n+1))/(2*(n-1)+an*pn*(n*an+2*n-2));
31 un_1 = un;
32 un = (1/(n^2*n2))*(2*(n-2)*(n*n2-n-1)*sqrt(1+n*(n2-2)/(n-1))+(n+2)*(3*n*n2-2*n-2));
33 if n2 >= (n+1)/n && n2 <= (n+4)/(n+1)
34 n2_feas = true;
35 if n3 >= ln
36 n3_lbfeas = true;
37 end
38 elseif n2 >= (n+4)/(n+1)
39 n2_feas = true;
40 if n3 >= n2*(n+1)/n
41 n3_lbfeas = true;
42 end
43 end
44 if n2 >= (n+1)/n && n2 <= n/(n-1)
45 n2_feas = true;
46 if n3 <= un
47 n3_ubfeas = true;
48 end
49 elseif n2 >= n/(n-1)
50 n2_feas = true;
51 if n3 < Inf
52 n3_ubfeas = true;
53 end
54 end
55end
56%keyboard
57if (n2_feas == false || n3_lbfeas == false || n3_ubfeas == false ) || (n == nmax)
58 warning('cannot match moment set exactly');
59 n2 = (n+1)/n;
60 n3 = 2*n2-1;
61 isexact = false;
62end
63
64% fitting
65if n2 <= n/(n-1) || n3 <= 2*n2-1 % case 1 of 2
66 b = 2*(4-n*(3*n2-4))/(n2*(4+n-n*n3)+sqrt(n*n2)*sqrt(12*n2^2*(n+1)+16*n3*(n+1)+n2*(n*(n3-15)*(n3+1)-8*(n3+3))));
67 a = (b*n2-2)*(n-1)*b/((b-1)*n);
68 p = (b-1)/a;
69 lambda = 1;
70 mu = lambda*(n-1)/a;
71 alpha = zeros(1,n); alpha(1)=p; alpha(end)=1-p;
72 T = diag(-mu*ones(1,n))+diag(mu*ones(1,n-1),1); T(end,end)=-lambda;
73 APH = map_scale(map_normalize({T,-T*ones(n,1)*alpha}),e1);
74elseif n2 > n/(n-1) && n3 > un_1 % case 2 of 2
75 K1 = n-1;
76 K2 = n-2;
77 K3 = 3*n2-2*n3;
78 K4 = n3-3;
79 K5 = n-n2;
80 K6 = 1+n2-n3;
81 K7 = n+n2-n*n2;
82 K8 = 3+3*n2^2+n3-3*n2*n3;
83 K9 = 108*K1^2*(4*K2^2*K3*n^2*n2+K1^2*K2*K4^2*n*n2^2+4*K1*K5*(K5^2-3*K2*K6*n*n2)+sqrt(-16*K1^2*K7^6+(4*K1*K5^3+K1^2*K2*K4^2*n*n2^2+4*K2*n*n2*(K4*n^2-3*K6*n2+K8*n))^2));
84 K10 = K4^2/(4*K3^2) - K5/(K1*K3*n2);
85 K11 = 2^(1/3)*(3*K5^2+K2*(K3+2*K4)*n*n2)/(K3*K9^(1/3)*n2);
86 K12 = K9^(1/3) / (3*2^(7/3)*K1^2*K3*n2);
87 K13 = sqrt(K10 + K11 + K12);
88 K14 = (6*K1*K3*K4*K5+4*K2*K3^2*n-K1^2*K4^3*n2) / (4*K1^2*K3^3*K13*n2);
89 K15 = -K4/(2*K3);
90 K16 = sqrt(2*K10 - K11 -K12 -K14);
91 K17 = sqrt(2*K10 - K11 -K12 +K14);
92 K18 = 36*K5^3 + 36*K2*K4*K5*n*n2 + 9*K1*K2*K4^2*n*n2^2 - sqrt(81*(4*K5^3+4*K2*K4*K5*n*n2+K1*K2*K4^2*n*n2^2)^2-48*(3*K5^2+2*K2*K4*n*n2)^3);
93 K19 = -K5/(K1*K4*n2) -2^(2/3)*(3*K5^2+2*K2*K4*n*n2)/(3^(1/3)*K1*K4*n2*K18^(1/3)) - K18^(1/3)/(6^(2/3)*K1*K4*n2);
94 K20 = 6*K1*K3*K4*K5 + 4*K2*K3^2*n - K1^2*K4^3*n2;
95 K21 = K11 + K12 + K5/(2*n*K1*K3);
96 K22 = sqrt(3*K4^2/(4*K3^2) - 3*K5/(K1*K3*n2) + sqrt(4*K21^2 - n*K2/(n2*K1^2*K3)));
97 if n3 > un_1 && n3 < 3*n2/2
98 f = K13+K15-K17;
99 elseif n3 == 2*n2/2
100 f = K19;
101 elseif n3 > 3*n2/2 && K20 > 0
102 f = -K13+K15+K16;
103 elseif K20 == 0
104 f = K15+K22;
105 elseif K20<0
106 f = K13+K15+K17;
107 end
108%% this input does not seem to find an f
109%e1 = 1
110%e2 = 1.5000
111%e3 = 3.3750
112
113 a = 2*(f-1)*(n-1)/((n-1)*(n2*f^2-2*f+2)-n);
114 p = (f-1)*a;
115 lambda = 1;
116 mu = lambda*(n-1)/a;
117 alpha = zeros(1,n); alpha(1)=p; alpha(2)=1-p;
118 T = diag(-mu*ones(1,n))+diag(mu*ones(1,n-1),1); T(1,1)=-lambda; T(1,2)=lambda;
119 APH = map_scale(map_normalize({T,-T*ones(n,1)*alpha}),e1);
120else
121 warning('moment set cannot be matched with an APH distribution');
122 isexact = false;
123end
124
125end