Engee documentation

ControlSystemIdentification

System identification for ControlSystems.jl.

System identification is the process of estimating a dynamical model from data. This packages estimates primarily linear time-invariant (LTI) models, in the form of statespace systems

or in the form of transfer functions

We also have capabilities for estimation of nonlinear Hammerstein-Wiener models and linear/nonlinear gray-box identification of models in continuous or discrete time.

This package is implemented in the free and open-source programming language Julia.

If you are new to this package, start your journey through the documentation by learning about Identification data. Examples are provided in the Examples section and in the form of jupyter notebooks here. An introductory video is available below (system identification example starts around 55 minutes)

See also the YouTube playlist with tutorials using this package.

Algorithm overview

The following table indicates which estimation algorithms are applicable in different scenarios. A green circle (🟒) indicates that a particular method is well suited for the situation, an orange diamond (πŸ”Ά) indicates that a match is possible, but somehow not ideal, while a red square (πŸŸ₯) indicates that a method in its standard form is ill suited for the situation. The table is not exhaustive, and is intended to give a rough overview of the applicability of different algorithms.

Estimation method SIMO MISO Disturbance models Nonlinearities Custom loss Time domain Frequency domain Multiple dataset

newpem

🟒 🟒 🟒 🟒 🟒 🟒 πŸŸ₯ πŸŸ₯

subspaceid

🟒 🟒 🟒 πŸŸ₯ 🟒 🟒 🟒 πŸŸ₯

nonlinear_pem

🟒 🟒 πŸ”Ά 🟒 πŸŸ₯ 🟒 πŸŸ₯ πŸŸ₯

arx

πŸŸ₯ 🟒 πŸŸ₯ πŸ”Ά 🟒 🟒 πŸŸ₯ 🟒

arxar

πŸŸ₯ 🟒 🟒 πŸŸ₯ 🟒 🟒 πŸŸ₯ πŸŸ₯

plr

πŸŸ₯ 🟒 🟒 πŸŸ₯ 🟒 🟒 πŸŸ₯ πŸ”Ά

era/okid

🟒 🟒 πŸŸ₯ πŸŸ₯ πŸŸ₯ 🟒 πŸŸ₯ 🟒

impulseest

πŸŸ₯ 🟒 πŸŸ₯ πŸŸ₯ 🟒 🟒 πŸŸ₯ πŸŸ₯

tfest

πŸŸ₯ πŸŸ₯ 🟒 πŸŸ₯ 🟒 🟒 🟒 πŸŸ₯

Comments

  • All methods can estimate SISO systems, i.e., systems with a single input and a single output.

  • Missing from the comparison is whether an algorithm estimates a transfer function or a statespace system, this is because one can without loss convert one to the other by simply calling tf/ss. One notable exception is for non-causal transfer functions which cannot be represented as statespace systems, but those do not appear very often.

  • Several methods are listed as πŸŸ₯ on nonlinearities, but it is oftentimes possible to handle known input nonlinearities by adding nonlinearly transformed versions of the input to the dataset. Known output nonlinearities that are invertible can be handled by similarly applying the inverse nonlinearity to the data before estimation. Only newpem has explicit methods for estimating parameters of nonlinearities. arx is listed as πŸ”Ά, since with the correct estimator option that promotes sparsity, it is possible to find the most appropriate nonlinearity among a set of candidates. However, no explicit support for this is provided.

  • Custom loss functions are sometimes supported explicitly, such as for newpem, but often supported by providing a custom estimator for methods that solve a problem on the form . The default estimator in these cases is always \, i.e., to solve a least-squares problem. Useful alternatives are, e.g., TotalLeastSquares.tls and TotalLeastSquares.irls. This can be useful to increase robustness w.r.t. noise etc.

  • In specific situations it is possible to use any method with multiple datasets by simply concatenating two datasets like [d1 d2]. This is only recommended if the state of the system in the end of the first dataset is very close to the state of the system in the beginning of the second dataset, for example, if all experiments start and end at rest in the origin.

  • Some methods estimate explicit disturbance models, such as plr and arxar, whereas other methods estimate observers with an implicit disturbance model, such as newpem and subspaceid. All methods that estimate disturbance models are able to account for input disturbance (also referred to as dynamic disturbance or load disturbance). ControlSystemIdentification.nonlinear_pem is listed as πŸ”Ά since it allows for the estimation of a disturbance model, but the user has to encode the model in the dynamics manually.

Other resources