I’m working on a structural dynamics identification topic involving the identification of a model coefficients for frequency response functions (or transfer function if your prefer).
The model is the following H(\omega) = \sum_{m = 1}^{n_m} \left(\frac{R_m}{\mathrm{i}\omega-\lambda_m}+\frac{\bar R_m}{\mathrm{i}\omega-\bar\lambda_m}\right) - \frac{R_\mathrm{L}}{\omega^2} + R_\mathrm{U}
where H(\omega) \in \mathbb{C}^{n_o\times n_i} contains the values of all input-output pairs at one frequency, R_m \in \mathbb{C}^{n_o\times n_i} are the so-called residuals.
Standard (for structural system identification) strategies exist to tackle this kind of problem, but I was wondering how I could use julia’s qualities especially in terms of the ML ecosystem to identify such a model.
@goerch@zdenek_hurak , I too saw that @baggepinnen is working on closely related topics. Unfortunately the tfest functionnality in ControlSystemIdentification does not seem to support Multiple Input - Multiple Output (MIMO) systems.
Then I suggest trying subspaceid where you package your data in a frequency-response data object FRD. This functionality is fairly new, and there is not yet a fully worked example in the documentation. The link above leads to the docstring that (if you scroll down a bit) contains the method that works on frequency-domain data. If the documentation is insufficient, I’d be happy to hear what trips you up and I’ll try to improve it. You may also look on how it’s used in the tests
The model you proposed appears linear in the parameters and I see no reason to use anything complicated to estimate it. In general, frequency-domain methods are significantly less attractive for nonlinear systems since the simple frequency response is then no longer a complete characterization of the system, the frequency response for nonlinear systems will in general depend on both amplitude and history.
The parametrization you use is not linear in the parameters, but it represents a linear system for which there are efficient estimation methods. Those methods, (like subpsaceid) estimate the model on another, equivalent form, and you can calculate the parameters in your model from the model that was identified. It requires you to calculate the residues of a rational function, Polynomials.jl contains a function for that.
Yes, it represents a LTI system indeed. I actually use some specialized methods myself (not subspace identification though).
One of the difficulties in my case is that I may work on large MIMO systems which make some resolutions troublesome.
I’m using functionalities in Polynomials or SpecialPolynomials to find the poles of some matrix-valued polynomials, but AFAIK there is no implementation specialized for rational functions.
One other potentially helpful link is https://github.com/tomasmckelvey/fsid
You can use subspace methods in the frequency domain as well, there are several papers investigating this, e.g., by the above reference author Tomas McKelvey