LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
CanonicalFromDPH3.m
1% [beta, B] = CanonicalFromDPH3(alpha, A, prec)
2%
3% Returns the canonical form of an order-3 discrete phase-type
4% distribution.
5%
6% Parameters
7% ----------
8% alpha : matrix, shape (1,3)
9% Initial vector of the discrete phase-type distribution
10% A : matrix, shape (3,3)
11% Transition probability matrix of the discrete phase-type
12% distribution
13% prec : double, optional
14% Numerical precision for checking the input, default value
15% is 1e-14
16%
17% Returns
18% -------
19% beta : matrix, shape (1,3)
20% The initial probability vector of the canonical form
21% B : matrix, shape (3,3)
22% Transition probability matrix of the canonical form
23
24function [beta,B] = CanonicalFromDPH3 (alpha,A,prec)
25
26 if ~exist('prec','var')
27 prec = 1e-14;
28 end
29
30 global BuToolsCheckInput;
31
32 if isempty(BuToolsCheckInput)
33 BuToolsCheckInput = true;
34 end
35
36 if BuToolsCheckInput && ~CheckMGRepresentation(alpha,A)
37 error('CanonicalFromDPH3: Input isn''t a valid MG distribution!');
38 end
39
40 if BuToolsCheckInput && (size(A,1)~=3 || size(A,2)~=3)
41 error('CanonicalFromDPH3: Dimension must be 3!');
42 end
43
44 lambda = EigSort(eig(A));
45 a0 = -lambda(1)*lambda(2)*lambda(3);
46 a1 = lambda(1)*lambda(2)+lambda(1)*lambda(3)+lambda(2)*lambda(3);
47 a2 = -lambda(1)-lambda(2)-lambda(3);
48 e=[1;1;1];
49
50 if real(lambda(1))>0 && real(lambda(2))>=0 && real(lambda(3))>=0
51 %PPP case
52 [alphaout,A2] = CanonicalFromPH3(alpha,A-eye(3),prec);
53 Aout = A2+eye(3);
54 elseif real(lambda(1))>0 && real(lambda(2))>=0 && real(lambda(3))<0
55 %PPN case
56 x1 = lambda(1);
57 x2 = lambda(2)+lambda(3);
58 x3=lambda(2)*lambda(3)/(lambda(2)+lambda(3)-1);
59 Aout=[x1,1-x1,0;0,x2,1-x2;0,x3,0];
60 b3=1/(1-x3)*(e-A*e);
61 b2=1/(1-x2)*A*b3;
62 b1=e-b2-b3;
63 B=[b1,b2,b3];
64 alphaout=alpha*B;
65 elseif real(lambda(1))>0 && real(lambda(2))<0 && real(lambda(3))>=0
66 %PNP case
67 x1=-a2;
68 x2=(a0-a1*a2)/(a2*(1+a2));
69 x3=a0*(1+a2)/(a0-a2-a1*a2-a2^2);
70 Aout=[x1,1-x1,0;x2,0,1-x2;0,x3,0];
71 b3=1/(1-x3)*(e-A*e);
72 b2=1/(1-x2)*A*b3;
73 b1=e-b2-b3;
74 if alpha*b1>=0
75 B=[b1,b2,b3];
76 alphaout = alpha*B;
77 else
78 %Set the initial vector first element to 0
79 x33=0;
80 a1=-1;
81 while x33 <= 1
82 [a1,x1,x2,x3,B]=firstInitElem(x33,lambda,alpha,A);
83 if a1 >= 0 && x1 >= 0 && x2 >= 0 && x3 >= 0 && x3+x33 < 1
84 break;
85 end
86 x33=x33+0.01;
87 end
88
89 if a1 >= 0
90 Aout=[x1,1-x1,0;x2,0,1-x2;0,x3,x33];
91 alphaout=alpha*B;
92 else
93 %PNP+
94 x1=lambda(3);
95 x2=lambda(1)+lambda(2);
96 x3=lambda(1)*lambda(2)/(lambda(1)+lambda(2)-1);
97 Aout=[x1,0,0;0,x2,1-x2;0,x3,0];
98
99 p1=alpha*(e-A*e);
100 p2=alpha*A*(e-A*e);
101 d1=(1-lambda(1))*((1-lambda(2))*(1-lambda(3))+(-1+lambda(2)+lambda(3))*p1-p2)/((lambda(1)-lambda(2))*(lambda(1)-lambda(3)));
102 d2=(lambda(2)-1)*((1-lambda(1))*(1-lambda(3))+(-1+lambda(1)+lambda(3))*p1-p2)/((lambda(1)-lambda(2))*(lambda(2)-lambda(3)));
103 d3=(lambda(3)-1)*((1-lambda(1))*(1-lambda(2))+(-1+lambda(1)+lambda(2))*p1-p2)/((lambda(2)-lambda(3))*(lambda(3)-lambda(1)));
104 alphaout={d3/(1-lambda(3)),(d1*lambda(1)+d2*lambda(2))/((1-lambda(1))*(1-lambda(2))),(d1+d2)*(1-lambda(1)-lambda(2))/((1-lambda(1))*(1-lambda(2)))};
105
106 if min(alphaout) < 0 || min(min(Aout)) < 0
107 fprintf('DPH3Canonical: Unhandled PNP case! Input:\n');
108 disp(alpha);
109 disp(A);
110 error('DPH3Canonical: PNP ERROR!');
111 end
112 end
113 end
114 elseif real(lambda(1))>0 && real(lambda(2))<0 && real(lambda(3))<0
115 %PNN case
116 if isreal(lambda) || abs(lambda(2))^2 <= 2*lambda(1)*(-real(lambda(2)))
117 x1=-a2;
118 x2=-a1/(1+a2);
119 x3=-a0/(1+a1+a2);
120 Aout=[x1,1-x1,0;x2,0,1-x2;x3,0,0];
121 b3=1/(1-x3)*(e-A*e);
122 b2=1/(1-x2)*A*b3;
123 b1=e-b2-b3;
124 B=[b1,b2,b3];
125 alphaout=alpha*B;
126 else
127 [alphaout,A2]=PH3Canonical(alpha,A-eye(3));
128 Aout=A2+eye(3);
129 end
130 end
131 beta = alphaout;
132 B = Aout;
133end
134
135function [a1,m1,m2,m3,B]=firstInitElem(m33,sortEigs,alpha,A)
136 l1=sortEigs(1);
137 l2=sortEigs(2);
138 l3=sortEigs(3);
139
140 m1=-m33+l1+l2+l3;
141 m2=-((l2-l3)*(l1^2-l1*l2-l1*l3+l2*l3)*(m33^3-2*m33^2*l1+m33*l1^2-2*m33^2*l2+3*m33*l1*l2-l1^2*l2+m33*l2^2- ...
142 l1*l2^2-2*m33^2*l3+3*m33*l1*l3-l1^2*l3+3*m33*l2*l3-2*l1*l2*l3-l2^2*l3+m33*l3^2-l1*l3^2-l2*l3^2))/ ...
143 (2*m33*l1^2*l2+2*m33^2*l1^2*l2-l1^3*l2-3*m33*l1^3*l2+l1^4*l2-2*m33*l1*l2^2-2*m33^2*l1*l2^2+l1^3*l2^2+ ...
144 l1*l2^3+3*m33*l1*l2^3-l1^2*l2^3-l1*l2^4-2*m33*l1^2*l3-2*m33^2*l1^2*l3+l1^3*l3+3*m33*l1^3*l3-l1^4*l3+ ...
145 2*m33*l2^2*l3+2*m33^2*l2^2*l3-l2^3*l3-3*m33*l2^3*l3+l2^4*l3+2*m33*l1*l3^2+2*m33^2*l1*l3^2-l1^3*l3^2- ...
146 2*m33*l2*l3^2-2*m33^2*l2*l3^2+l2^3*l3^2-l1*l3^3-3*m33*l1*l3^3+l1^2*l3^3+l2*l3^3+3*m33*l2*l3^3-l2^2*l3^3+ ...
147 l1*l3^4-l2*l3^4);
148 m3=((l2-l3)*(l1^2-l1*l2-l1*l3+l2*l3)*(m33^3+m33^4-m33^2*l1-2*m33^3*l1+m33^2*l1^2-m33^2*l2-2*m33^3*l2+ ...
149 m33*l1*l2+3*m33^2*l1*l2-m33*l1^2*l2+m33^2*l2^2-m33*l1*l2^2-m33^2*l3-2*m33^3*l3+m33*l1*l3+3*m33^2*l1*l3- ...
150 m33*l1^2*l3+m33*l2*l3+3*m33^2*l2*l3-l1*l2*l3-4*m33*l1*l2*l3+l1^2*l2*l3-m33*l2^2*l3+l1*l2^2*l3+m33^2*l3^2- ...
151 m33*l1*l3^2-m33*l2*l3^2+l1*l2*l3^2))/(-2*m33*l1^2*l2-2*m33^2*l1^2*l2-m33^3*l1^2*l2+l1^3*l2+3*m33*l1^3*l2+ ...
152 2*m33^2*l1^3*l2-l1^4*l2-m33*l1^4*l2+2*m33*l1*l2^2+2*m33^2*l1*l2^2+m33^3*l1*l2^2-l1^3*l2^2-2*m33*l1^3*l2^2+ ...
153 l1^4*l2^2-l1*l2^3-3*m33*l1*l2^3-2*m33^2*l1*l2^3+l1^2*l2^3+2*m33*l1^2*l2^3+l1*l2^4+m33*l1*l2^4-l1^2*l2^4+ ...
154 2*m33*l1^2*l3+2*m33^2*l1^2*l3+m33^3*l1^2*l3-l1^3*l3-3*m33*l1^3*l3-2*m33^2*l1^3*l3+l1^4*l3+m33*l1^4*l3- ...
155 2*m33*l2^2*l3-2*m33^2*l2^2*l3-m33^3*l2^2*l3+l2^3*l3+3*m33*l2^3*l3+2*m33^2*l2^3*l3-l2^4*l3-m33*l2^4*l3- ...
156 2*m33*l1*l3^2-2*m33^2*l1*l3^2-m33^3*l1*l3^2+l1^3*l3^2+2*m33*l1^3*l3^2-l1^4*l3^2+2*m33*l2*l3^2+2*m33^2*l2*l3^2+ ...
157 m33^3*l2*l3^2-l2^3*l3^2-2*m33*l2^3*l3^2+l2^4*l3^2+l1*l3^3+3*m33*l1*l3^3+2*m33^2*l1*l3^3-l1^2*l3^3- ...
158 2*m33*l1^2*l3^3-l2*l3^3-3*m33*l2*l3^3-2*m33^2*l2*l3^3+l2^2*l3^3+2*m33*l2^2*l3^3-l1*l3^4-m33*l1*l3^4+ ...
159 l1^2*l3^4+l2*l3^4+m33*l2*l3^4-l2^2*l3^4);
160 b3=sum(eye(3)-A,2)/(1-m3-m33);
161 b2=(-m33*eye(3)+A)*b3/(1-m2);
162 b1=(-m3*b3+A*b2)/(1-m1);
163 B=[b1,b2,b3];
164 a1=alpha*b1;
165end