control.bdschur

control.bdschur(a, condmax=None, sort=None)[source]

Block-diagonal Schur decomposition.

Parameters
a(M, M) array_like

Real matrix to decompose.

condmaxNone or float, optional

If None (default), use 1/sqrt(eps), which is approximately 1e8.

sort{None, ‘continuous’, ‘discrete’}

Block sorting; see below.

Returns
amodal(M, M) real ndarray

Block-diagonal Schur decomposition of a.

tmodal(M, M) real ndarray

Similarity transform relating a and amodal.

blksizes(N,) int ndarray

Array of Schur block sizes.

Notes

If sort is None, the blocks are not sorted.

If sort is ‘continuous’, the blocks are sorted according to associated eigenvalues. The ordering is first by real part of eigenvalue, in descending order, then by absolute value of imaginary part of eigenvalue, also in decreasing order.

If sort is ‘discrete’, the blocks are sorted as for ‘continuous’, but applied to log of eigenvalues (i.e., continuous-equivalent eigenvalues).

Examples

>>> Gs = ct.tf2ss([1], [1, 3, 2])
>>> amodal, tmodal, blksizes = ct.bdschur(Gs.A)
>>> amodal                                                   
array([[-2.,  0.],
       [ 0., -1.]])