butools.mam.QBDFundamentalMatrices

butools.mam.QBDFundamentalMatrices()
Matlab: M = QBDFundamentalMatrices(B, L, F, matrices, precision, maxNumIt, method)
Mathematica: M = QBDFundamentalMatrices[B, L, F, matrices, precision, maxNumIt, method]
Python/Numpy: M = QBDFundamentalMatrices(B, L, F, matrices, precision, maxNumIt, method)

Returns the fundamental matrices corresponding to the given QBD. Matrices R, G and U can be returned depending on the “matrices” parameter.

The implementation is based on [R43], please cite it if you use this method.

Parameters:

B : matrix, shape (N,N)

The matrix corresponding to backward transitions

L : matrix, shape (N,N)

The matrix corresponding to local transitions

F : matrix, shape (N,N)

The matrix corresponding to forward transitions

matrices : string

Specifies which matrices are required. ‘R’ means that only matrix ‘R’ is needed. ‘UG’ means that matrices U and G are needed. Any combinations of ‘R’, ‘G’ and ‘U’ are allowed, in any order.

precision : double, optional

The matrices are computed iteratively up to this precision. The default value is 1e-14

maxNumIt : int, optional

The maximal number of iterations. The default value is 50.

method : {“CR”, “LR”, “NI”, “FI”, “IS”}, optional

The method used to solve the matrix-quadratic equation (CR: cyclic reduction, LR: logarithmic reduction, NI: Newton iteration, FI: functional iteration, IS: invariant subspace method). The default is “CR”. “CR” is the only supported method in the Mathematica and Python implementation.

Returns:

M : list of matrices

The list of calculated matrices in the order as requested in the ‘matrices’ parameter.

Notes

Discrete and continuous QBDs are both supported, the procedure auto-detects it based on the diagonal entries of matrix L.

References

[R43](1, 2) Bini, D. A., Meini, B., Steffé, S., Van Houdt, B. (2006, October). Structured Markov chains solver: software tools. In Proceeding from the 2006 workshop on Tools for solving structured Markov chains (p. 14). ACM.

Examples

For Matlab:

>>> B = [0., 0.; 3., 4.];
>>> L = [-6., 5.; 3., -12.];
>>> F = [1., 0.; 2., 0.];
>>> L0 = [-6., 5.; 6., -8.];
>>> [R, G, U] = QBDFundamentalMatrices(B, L, F, 'RGU');
>>> disp(R);
      0.27839      0.14286
      0.55678      0.28571
>>> disp(G);
      0.42857      0.57143
      0.42857      0.57143
>>> disp(U);
      -5.5714       5.5714
       3.8571      -10.857

For Mathematica:

>>> B = {{0., 0.},{3., 4.}};
>>> L = {{-6., 5.},{3., -12.}};
>>> F = {{1., 0.},{2., 0.}};
>>> L0 = {{-6., 5.},{6., -8.}};
>>> {R, G, U} = QBDFundamentalMatrices[B, L, F, "RGU"];
"Final Residual Error for G: "5.551115123125783*^-17
"Final Residual Error for R: "0.027036455607884147
"Final Residual Error for U: "8.326672684688674*^-17
>>> Print[R];
{{0.27838827838827834, 0.14285714285714282},
 {0.5567765567765567, 0.28571428571428564}}
>>> Print[G];
{{0.42857142857142866, 0.5714285714285714},
 {0.42857142857142866, 0.5714285714285714}}
>>> Print[U];
{{-5.571428571428571, 5.571428571428571},
 {3.8571428571428577, -10.857142857142858}}

For Python/Numpy:

>>> B = ml.matrix([[0., 0.],[3., 4.]])
>>> L = ml.matrix([[-6., 5.],[3., -12.]])
>>> F = ml.matrix([[1., 0.],[2., 0.]])
>>> L0 = ml.matrix([[-6., 5.],[6., -8.]])
>>> R, G, U = QBDFundamentalMatrices(B, L, F, "RGU")
Final Residual Error for G:  1.38777878078e-16
Final Residual Error for R:  5.55111512313e-17
Final Residual Error for U:  4.16333634234e-17
>>> print(R)
[[ 0.27839  0.14286]
 [ 0.55678  0.28571]]
>>> print(G)
[[ 0.42857  0.57143]
 [ 0.42857  0.57143]]
>>> print(U)
[[ -5.57143   5.57143]
 [  3.85714 -10.85714]]