butools.ph.APHFrom3Moments

butools.ph.APHFrom3Moments()
Matlab: [alpha, A] = APHFrom3Moments(moms, maxSize)
Mathematica: {alpha, A} = APHFrom3Moments[moms, maxSize]
Python/Numpy: alpha, A = APHFrom3Moments(moms, maxSize)

Returns an acyclic PH which has the same 3 moments as given. If detects the order and the structure automatically to match the given moments.

Parameters:

moms : vector of doubles, length(3)

The moments to match

maxSize : int, optional

The maximal size of the resulting APH. The default value is 100.

Returns:

alpha : vector, shape (1,M)

The initial probability vector of the APH

A : matrix, shape (M,M)

Transient generator matrix of the APH

Raises an error if the moments are not feasible with an

APH of size “maxSize”.

References

[R4]A. Bobbio, A. Horvath, M. Telek, “Matching three moments with minimal acyclic phase type distributions,” Stochastic models, pp. 303-326, 2005.

Examples

For Matlab:

>>> moms = [10.0, 125.0, 8400.0];
>>> [a, A] = APHFrom3Moments(moms);
>>> disp(a);
   1.3212e-05      0.99999            0            0            0            0
>>> disp(A);
   -0.0022936    0.0022936            0            0            0            0
            0     -0.50029      0.50029            0            0            0
            0            0     -0.50029      0.50029            0            0
            0            0            0     -0.50029      0.50029            0
            0            0            0            0     -0.50029      0.50029
            0            0            0            0            0     -0.50029
>>> phmoms = MomentsFromPH(a, A, 3);
>>> disp(phmoms);
           10          125         8400
>>> moms = [10.0, 525.0, 31400.0];
>>> [a, A] = APHFrom3Moments(moms);
>>> disp(a);
  Columns 1 through 6
      0.21179            0            0            0            0            0
  Columns 7 through 8
            0      0.78821
>>> disp(A);
  Columns 1 through 6
     -0.15079      0.15079            0            0            0            0
            0     -0.15079      0.15079            0            0            0
            0            0     -0.15079      0.15079            0            0
            0            0            0     -0.15079      0.15079            0
            0            0            0            0     -0.15079      0.15079
            0            0            0            0            0     -0.15079
            0            0            0            0            0            0
            0            0            0            0            0            0
  Columns 7 through 8
            0            0
            0            0
            0            0
            0            0
            0            0
      0.15079            0
     -0.15079      0.15079
            0      -5.9502
>>> phmoms = MomentsFromPH(a, A, 3);
CheckMERepresentation warning: There are more than one eigenvalue with the same absolute value as the largest eigenvalue!
>>> disp(phmoms);
           10          525        31400

For Mathematica:

>>> moms = {10.0, 125.0, 8400.0};
>>> {a, A} = APHFrom3Moments[moms];
>>> Print[a];
{0.000013211714931595383, 0.9999867882850684, 0, 0, 0, 0}
>>> Print[A];
{{-0.002293559800424418, 0.002293559800424418, 0, 0, 0, 0},
 {0, -0.5002881836726082, 0.5002881836726082, 0, 0, 0},
 {0, 0, -0.5002881836726082, 0.5002881836726082, 0, 0},
 {0, 0, 0, -0.5002881836726082, 0.5002881836726082, 0},
 {0, 0, 0, 0, -0.5002881836726082, 0.5002881836726082},
 {0, 0, 0, 0, 0, -0.5002881836726082}}
>>> phmoms = MomentsFromPH[a, A, 3];
>>> Print[phmoms];
{10., 125.00000000000003, 8400.000000000162}
>>> moms = {10.0, 525.0, 31400.0};
>>> {a, A} = APHFrom3Moments[moms];
>>> Print[a];
{0.21178752772283896, 0, 0, 0, 0, 0, 0, 0.7882124722771611}
>>> Print[A];
{{-0.15078539360511473, 0.15078539360511473, 0, 0, 0, 0, 0, 0},
 {0, -0.15078539360511473, 0.15078539360511473, 0, 0, 0, 0, 0},
 {0, 0, -0.15078539360511473, 0.15078539360511473, 0, 0, 0, 0},
 {0, 0, 0, -0.15078539360511473, 0.15078539360511473, 0, 0, 0},
 {0, 0, 0, 0, -0.15078539360511473, 0.15078539360511473, 0, 0},
 {0, 0, 0, 0, 0, -0.15078539360511473, 0.15078539360511473, 0},
 {0, 0, 0, 0, 0, 0, -0.15078539360511473, 0.15078539360511473},
 {0, 0, 0, 0, 0, 0, 0, -5.950197455082666}}
>>> phmoms = MomentsFromPH[a, A, 3];
>>> Print[phmoms];
{9.999999999999998, 524.9999999999998, 31399.99999999998}

For Python/Numpy:

>>> moms = [10.0, 125.0, 8400.0]
>>> a, A = APHFrom3Moments(moms)
>>> print(a)
[[  1.32117e-05   9.99987e-01   0.00000e+00   0.00000e+00   0.00000e+00   0.00000e+00]]
>>> print(A)
[[-0.00229  0.00229  0.       0.       0.       0.     ]
 [ 0.      -0.50029  0.50029  0.       0.       0.     ]
 [ 0.       0.      -0.50029  0.50029  0.       0.     ]
 [ 0.       0.       0.      -0.50029  0.50029  0.     ]
 [ 0.       0.       0.       0.      -0.50029  0.50029]
 [ 0.       0.       0.       0.       0.      -0.50029]]
>>> phmoms = MomentsFromPH(a, A, 3)
>>> print(phmoms)
[9.9999999999999964, 124.99999999999994, 8400.0000000001164]
>>> moms = [10.0, 525.0, 31400.0]
>>> a, A = APHFrom3Moments(moms)
>>> print(a)
[[ 0.21179  0.       0.       0.       0.       0.       0.       0.78821]]
>>> print(A)
[[-0.15079  0.15079  0.       0.       0.       0.       0.       0.     ]
 [ 0.      -0.15079  0.15079  0.       0.       0.       0.       0.     ]
 [ 0.       0.      -0.15079  0.15079  0.       0.       0.       0.     ]
 [ 0.       0.       0.      -0.15079  0.15079  0.       0.       0.     ]
 [ 0.       0.       0.       0.      -0.15079  0.15079  0.       0.     ]
 [ 0.       0.       0.       0.       0.      -0.15079  0.15079  0.     ]
 [ 0.       0.       0.       0.       0.       0.      -0.15079  0.15079]
 [ 0.       0.       0.       0.       0.       0.       0.      -5.9502 ]]
>>> phmoms = MomentsFromPH(a, A, 3)
CheckMERepresentation warning: There are more than one eigenvalue with the same absolute value as the largest eigenvalue!
>>> print(phmoms)
[10.0, 525.0, 31399.999999999993]