harold.staircase(A, B, C, compute_T=False, form='c', invert=False, block_indices=False)

Given a state model data A, B, C, Returns the so-called staircase form State realization to assess the controllability/observability properties.

If observer-form is requested, internally the system is pertransposed and same controllable-form machinery is applied.

  • A ((n, n) array_like) – State array
  • B ((n, m) array_like) – Input array
  • C ((p, n) array_like) – Output array
  • form (str, optional) – Determines whether the controller- or observer-staircase form will be computed via “c” or “o” values.
  • invert (bool, optional) – If True, the full rank part of B/C matrix will be compressed to lower/right part of the array. Naturally, this also effects the A matrix blocks to appear as lower/upper triangular block matrix.

  • Ah ((n, n) ndarray) – Resulting State array

  • Bh ((n, m) ndarray) – Resulting Input array

  • Ch ((p, n) ndarray) – Resulting Output array

  • T ((n, n) ndarray) –

    The transformation matrix such that

    [ T⁻¹AT | T⁻¹B ]   [ Ah | Bh ]
    [-------|------] = [----|----]
    [   CT  |      ]   [ Ch |    ]


For controllability and observability, the existence of zero subdiagonal blocks can be checked in a numerically stable fashion, as opposed to forming the Kalman matrices and checking the rank. For certain matrices, A^n computations can introduce large errors (for some A that have entries with varying order of magnitudes). But it is also prone to numerical rank identification.