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
17% Exponential moment set (scv==1 with matching third moment) is a degeneracy
18% for the general APH(2) case formulas; the exponential is a valid phase-type
19scv = (e2-e1^2)/e1^2;
20if abs(scv-1) < GlobalConstants.FineTol && abs(e3 - 6*e1^3) < GlobalConstants.FineTol
21 APH = map_exponential(e1);
22 return
23end
24n2 = e2/e1^2;
25n3 = e3/e1/e2;
26
27% find order
28n2_feas = false;
29n3_ubfeas = false;
30n3_lbfeas = false;
31n = 1;
32un = 0;
33while (n2_feas == false || n3_lbfeas == false || n3_ubfeas == false ) && n < nmax
34 n = n + 1;
35 pn = ((n+1)*(n2-2)/(3*n2*(n-1)))*(-2*sqrt(n+1)/sqrt(4*(n+1)-3*n*n2) - 1);
36 an = (n2 - 2) / (pn*(1-n2) + sqrt(pn^2+pn*n*(n2-2)/(n-1)));
37 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));
38 un_1 = un;
39 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));
40 if n2 >= (n+1)/n && n2 <= (n+4)/(n+1)
41 n2_feas = true;
42 if n3 >= ln
43 n3_lbfeas = true;
44 end
45 elseif n2 >= (n+4)/(n+1)
46 n2_feas = true;
47 if n3 >= n2*(n+1)/n
48 n3_lbfeas = true;
49 end
50 end
51 if n2 >= (n+1)/n && n2 <= n/(n-1)
52 n2_feas = true;
53 if n3 <= un
54 n3_ubfeas = true;
55 end
56 elseif n2 >= n/(n-1)
57 n2_feas = true;
58 if n3 < Inf
59 n3_ubfeas = true;
60 end
61 end
62end
63%keyboard
64if (n2_feas == false || n3_lbfeas == false || n3_ubfeas == false ) || (n == nmax)
65 warning('cannot match moment set exactly');
66 n2 = (n+1)/n;
67 n3 = 2*n2-1;
68 isexact = false;
69end
70
71% fitting
72if n2 <= n/(n-1) || n3 <= 2*n2-1 % case 1 of 2
73 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))));
74 a = (b*n2-2)*(n-1)*b/((b-1)*n);
75 p = (b-1)/a;
76 lambda = 1;
77 mu = lambda*(n-1)/a;
78 alpha = zeros(1,n); alpha(1)=p; alpha(end)=1-p;
79 T = diag(-mu*ones(1,n))+diag(mu*ones(1,n-1),1); T(end,end)=-lambda;
80 APH = map_scale(map_normalize({T,-T*ones(n,1)*alpha}),e1);
81elseif n2 > n/(n-1) && n3 > un_1 % case 2 of 2
82 K1 = n-1;
83 K2 = n-2;
84 K3 = 3*n2-2*n3;
85 K4 = n3-3;
86 K5 = n-n2;
87 K6 = 1+n2-n3;
88 K7 = n+n2-n*n2;
89 K8 = 3+3*n2^2+n3-3*n2*n3;
90 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));
91 K10 = K4^2/(4*K3^2) - K5/(K1*K3*n2);
92 K11 = 2^(1/3)*(3*K5^2+K2*(K3+2*K4)*n*n2)/(K3*K9^(1/3)*n2);
93 K12 = K9^(1/3) / (3*2^(7/3)*K1^2*K3*n2);
94 K13 = sqrt(K10 + K11 + K12);
95 K14 = (6*K1*K3*K4*K5+4*K2*K3^2*n-K1^2*K4^3*n2) / (4*K1^2*K3^3*K13*n2);
96 K15 = -K4/(2*K3);
97 K16 = sqrt(2*K10 - K11 -K12 -K14);
98 K17 = sqrt(2*K10 - K11 -K12 +K14);
99 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);
100 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);
101 K20 = 6*K1*K3*K4*K5 + 4*K2*K3^2*n - K1^2*K4^3*n2;
102 K21 = K11 + K12 + K5/(2*n*K1*K3);
103 K22 = sqrt(3*K4^2/(4*K3^2) - 3*K5/(K1*K3*n2) + sqrt(4*K21^2 - n*K2/(n2*K1^2*K3)));
104 if n3 > un_1 && n3 < 3*n2/2
105 f = K13+K15-K17;
106 elseif n3 == 2*n2/2
107 f = K19;
108 elseif n3 > 3*n2/2 && K20 > 0
109 f = -K13+K15+K16;
110 elseif K20 == 0
111 f = K15+K22;
112 elseif K20<0
113 f = K13+K15+K17;
114 end
115%% this input does not seem to find an f
116%e1 = 1
117%e2 = 1.5000
118%e3 = 3.3750
119
120 a = 2*(f-1)*(n-1)/((n-1)*(n2*f^2-2*f+2)-n);
121 p = (f-1)*a;
122 lambda = 1;
123 mu = lambda*(n-1)/a;
124 alpha = zeros(1,n); alpha(1)=p; alpha(2)=1-p;
125 T = diag(-mu*ones(1,n))+diag(mu*ones(1,n-1),1); T(1,1)=-lambda; T(1,2)=lambda;
126 APH = map_scale(map_normalize({T,-T*ones(n,1)*alpha}),e1);
127else
128 warning('moment set cannot be matched with an APH distribution');
129 isexact = false;
130end
131
132end
Definition Station.m:245