[ANN] ControlSystemIdentification


This package has been around for a while but has never been announced here.
ControlSystemIdentification.jl aims to be similar in scope to Ljung’s System Identification Toolbox in Matlab, implementing estimation procedures for linear input-output models and time-series analysis. Although we are not all the way there yet, quite a number of methods are present, some of them are

  • Subspace-based identification of statespace models [1] using n4sid.
  • Identification of AR and ARX models (transfer functions) [2].
  • Nonparametric transfer-function and coherence estimation using spectral methods.
  • General statespace model estimation using the prediction-error method (PEM) with arbitrary metrics.
  • Impulse response estimation.

The package returns models in the form of TransferFunction and StateSpace types from ControlSystems.jl and makes heavy use of Optim.jl and TotalLeastSquares.jl.

The documentation is in the README as well as in docstrings for each function. There is also a collection of notebooks that illustrate usage of the package for various identification tasks.

[1] Models on the form
x_{t+1} = Ax_t + Bu_t + Kw_t
y_t \;\;\;\,= Cx_t + Du_t + w_t
where both u and y may be vectors (MIMO, multiple input multiple output).

[2] Models on the form
y_t = \sum a_k y_{t-k} + \sum b_k u_{t-k} + \sum c_k w_{t-k} or A(z)Y(z) = B(z)U(z) + C(z)W(z)
where the polynomials B and C are optional.


Awesome! Looks super useful, thanks for announcing. I have a bunch of impulse response estimation methods implemented in MeasureIR.jl (unregistered), with a more specific audio focus. Seems like maybe I should migrate some of that to your package once they’re a little more fleshed out.


This package has now reached version 1.0, indicating that I do not have any plans to break the API anytime soon. Since the original announcement, a few more features have appeared

  • Frequency weighted estimation, allows you to indicate frequency ranges where you care about the model fit. Or conversely, you can provide disturbance models to indicate that you should not spend modeling effort trying to fit the frequency ranges of the disturbance.
  • Input-output data is now stored in a struct, similar to matlabs iddata.
  • Integration with LowLevelParticleFilters.jl to perform Kalman filtering with estimated models.
  • Model-based spectrogram estimation.
  • The package has now been battle tested and is in general more robust.

This is simply amazing in my current fight at university (engineering) not to become dependent on MatLab, much appreciated <3