control.eigensys_realization

control.eigensys_realization(YY, r)[source]

Calculate ERA model based on impulse-response data.

This function computes a discrete-time system

x[k+1] &= A x[k] + B u[k] \\\\
y[k] &= C x[k] + D u[k]

of order r for a given impulse-response data (see [1]).

The function can be called with 2 arguments:

  • sysd, S = eigensys_realization(data, r)

  • sysd, S = eigensys_realization(YY, r)

where data is a TimeResponseData object, YY is a 1D or 3D array, and r is an integer.

Parameters
YYarray_like

Impulse response from which the StateSpace model is estimated, 1D or 3D array.

dataTimeResponseData

Impulse response from which the StateSpace model is estimated.

rinteger

Order of model.

minteger, optional

Number of rows in Hankel matrix. Default is 2*r.

ninteger, optional

Number of columns in Hankel matrix. Default is 2*r.

dtTrue or float, optional

True indicates discrete time with unspecified sampling time and a positive float is discrete time with the specified sampling time. It can be used to scale the StateSpace model in order to match the unit-area impulse response of python-control. Default is True.

transposebool, optional

Assume that input data is transposed relative to the standard Time series data conventions. For TimeResponseData this parameter is ignored. Default is False.

Returns
sysStateSpace

State space model of the specified order.

Sarray

Singular values of Hankel matrix. Can be used to choose a good r value.

References

1

Samet Oymak and Necmiye Ozay, Non-asymptotic Identification of LTI Systems from a Single Trajectory. https://arxiv.org/abs/1806.05722

Examples

>>> T = np.linspace(0, 10, 100)
>>> _, YY = ct.impulse_response(ct.tf([1], [1, 0.5], True), T)
>>> sysd, _ = ct.eigensys_realization(YY, r=1)
>>> T = np.linspace(0, 10, 100)
>>> response = ct.impulse_response(ct.tf([1], [1, 0.5], True), T)
>>> sysd, _ = ct.eigensys_realization(response, r=1)