1% [beta, B] = CanonicalFromDPH3(alpha, A, prec)
3% Returns the canonical form of an order-3 discrete phase-type
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
13% prec : double, optional
14% Numerical precision
for checking the input,
default value
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
24function [beta,B] = CanonicalFromDPH3 (alpha,A,prec)
26 if ~exist(
'prec',
'var')
30 global BuToolsCheckInput;
32 if isempty(BuToolsCheckInput)
33 BuToolsCheckInput = true;
36 if BuToolsCheckInput && ~CheckMGRepresentation(alpha,A)
37 error('CanonicalFromDPH3: Input isn''t a valid MG distribution!');
40 if BuToolsCheckInput && (size(A,1)~=3 || size(A,2)~=3)
41 error('CanonicalFromDPH3: Dimension must be 3!');
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);
50 if real(lambda(1))>0 && real(lambda(2))>=0 && real(lambda(3))>=0
52 [alphaout,A2] = CanonicalFromPH3(alpha,A-eye(3),prec);
54 elseif real(lambda(1))>0 && real(lambda(2))>=0 && real(lambda(3))<0
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];
65 elseif real(lambda(1))>0 && real(lambda(2))<0 && real(lambda(3))>=0
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];
78 %Set the initial vector first element to 0
82 [a1,x1,x2,x3,B]=firstInitElem(x33,lambda,alpha,A);
83 if a1 >= 0 && x1 >= 0 && x2 >= 0 && x3 >= 0 && x3+x33 < 1
90 Aout=[x1,1-x1,0;x2,0,1-x2;0,x3,x33];
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];
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)))};
106 if min(alphaout) < 0 || min(min(Aout)) < 0
107 fprintf(
'DPH3Canonical: Unhandled PNP case! Input:\n');
110 error(
'DPH3Canonical: PNP ERROR!');
114 elseif real(lambda(1))>0 && real(lambda(2))<0 && real(lambda(3))<0
116 if isreal(lambda) || abs(lambda(2))^2 <= 2*lambda(1)*(-real(lambda(2)))
120 Aout=[x1,1-x1,0;x2,0,1-x2;x3,0,0];
127 [alphaout,A2]=PH3Canonical(alpha,A-eye(3));
135function [a1,m1,m2,m3,B]=firstInitElem(m33,sortEigs,alpha,A)
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+ ...
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);