ControlSystemIdentification
Identification of the system for https://github.com/JuliaControl/ControlSystems.jl /[ControlSystems.jl].
System identification is the process of evaluating a dynamic model based on data. This package is intended primarily for evaluating linear models with constant parameters (LPP) in the form of systems in the state space.
or in the form of transfer functions
There are also possibilities for evaluating nonlinear Hammerstein-Wiener models and identifying linear or nonlinear models using the gray box method in continuous or discrete time.
This package is implemented in a free programming language. https://julialang.org /[Julia] is open source.
If you have no experience working with this package, start reading it in the documentation section. Identification data. Examples are available in the Examples section and in the form https://github.com/JuliaControl/ControlExamples.jl [Jupyter interactive scripts]. Below is an introductory video (an example of system identification begins at about the 55th minute).
See also https://youtube.com/playlist?list=PLC0QOsNQS8ha6SwaNOZDXyG9Bj8MPbF-q&si ;=AiOZVhBVwYReDrAm[Youtube playlist] with instructions on how to use this package.
Algorithm Overview
The table below shows which evaluation algorithms are applicable in certain scenarios. The green circle (🟢) indicates that the method is well suited to the situation, the orange diamond (🔶) indicates that the method may be applicable but does not work well, and the red square (🟥) indicates that the method in its standard form is poorly suited to the situation. The table is not exhaustive and provides only a general idea of the applicability of various algorithms.
Estimation method | SIMO | MISO | Perturbation models | Non-linearity | Custom loss functions | Time domain | Frequency domain | Multiple datasets |
---|---|---|---|---|---|---|---|---|
|
🟢 | 🟢 | 🟢 | 🟢 | 🟢 | 🟢 | 🟥 | 🟥 |
|
🟢 | 🟢 | 🟢 | 🟥 | 🟢 | 🟢 | 🟢 | 🟥 |
|
🟢 | 🟢 | 🔶 | 🟢 | 🟥 | 🟢 | 🟥 | 🟥 |
|
🟥 | 🟢 | 🟥 | 🔶 | 🟢 | 🟢 | 🟥 | 🟢 |
|
🟥 | 🟢 | 🟢 | 🟥 | 🟢 | 🟢 | 🟥 | 🟥 |
|
🟥 | 🟢 | 🟢 | 🟥 | 🟢 | 🟢 | 🟥 | 🔶 |
|
🟢 | 🟢 | 🟥 | 🟥 | 🟥 | 🟢 | 🟥 | 🟢 |
|
🟥 | 🟢 | 🟥 | 🟥 | 🟢 | 🟢 | 🟥 | 🟥 |
|
🟥 | 🟥 | 🟢 | 🟥 | 🟢 | 🟢 | 🟢 | 🟥 |
Notes
-
All methods are suitable for evaluating SISO systems, i.e. systems with one input and one output.
-
The comparison does not indicate whether the algorithm * evaluates the transfer function or the system in the state space*, since they can be transformed into each other without any loss by simply calling `tf/ss'. An important exception is non-penal transfer functions, which cannot be represented as systems in the state space, but they are rare.
-
Some methods are labeled as 🟥 with respect to non-linearity, but often known input non-linearities can be eliminated by adding non-linearly transformed versions of the input to the dataset. Known reversible non-linearities at the output can be eliminated in a similar way: by applying an inverse non-linearity to the data before evaluation. Only the function
newpem
there are explicit methods for estimating non-linearity parameters. Function 'arx` is denoted as 🔶, because with the correct parameterestimator
, which promotes sparsity, it is possible to find the most suitable nonlinearity from a set of options. However, this feature is not explicitly supported. -
Custom loss functions are sometimes explicitly supported, for example for 'newpem`, but are more often supported by a custom evaluation tool (
estimator
) for methods that solve a problem in the form . The default evaluation tool in such cases is always\
, that is, the least squares problem is solved. Useful alternatives are, for example, https://github.com/baggepinnen/TotalLeastSquares.jl [`TotalLeastSquares.tls'] and `TotalLeastSquares.irls'. They can be used to increase resistance to noise, etc. -
In special situations, you can use any method with multiple datasets by simply combining them like this: `[d1 d2]'. It is recommended to do this only if the state of the system at the end of the first data set is very close to its state at the beginning of the second, for example, if all experiments begin and end at rest at the starting point.
-
Some methods, for example
plr
and 'arx', evaluate explicit perturbation models, while others, for examplenewpem
andsubspaceid
, is estimated by observers using an implicit perturbation model. All methods that evaluate perturbation models can take into account the input perturbation (also called dynamic or load perturbation). FunctionControlSystemIdentification.nonlinear_pem
is designated as 🔶, as it allows you to evaluate disturbance models, but the user must program the dynamics of the model manually.
Other resources
-
Youtube playlist with instructions on how to use this package.
-
To evaluate linear nonstationary models (LTV), use the package https://github.com/baggepinnen/LTVModels.jl [LTVModels.jl].
-
To evaluate linear and nonlinear gray box models in continuous time use the package https://docs.sciml.ai/DiffEqParamEstim/stable /[DifferentialEquations.jl (parameter estimation)].
-
Evaluation of nonlinear black box models in continuous time: https://github.com/JuliaDiffEq/DiffEqFlux.jl /[DiffEqFlux.jl] and https://docs.sciml.ai/DataDrivenDiffEq/stable /[DataDrivenDiffEq.jl].
-
Advanced features of spectral estimation, mutual coherence, etc. can be found in the package. https://github.com/baggepinnen/LPVSpectral.jl [LPVSpectral.jl].
-
This package interacts well with https://github.com/baggepinnen/MonteCarloMeasurements.jl [montecarlomeasuries.jl]. See https://github.com/baggepinnen/MonteCarloMeasurements.jl/blob/master/examples/controlsystems.jl [sample file].
-
Assessment of states simplifies the package https://github.com/baggepinnen/LowLevelParticleFilters.jl [LowLevelParticleFilters.jl].