Build a State Space model from identified Modal Parameters

5 views (last 30 days)
I have run the modalfit example, "ModalParametersUsingLeastSquaresRationalFunctionMethodExample.mlx" I get the modal frequencies, damping rates and mode shapes. I couldn't find a function for turning that data into a State Space model.
How do I do that?

Answers (1)

Star Strider
Star Strider on 5 Dec 2022
Edited: Star Strider on 6 Dec 2022
That may be possible using the Signal Processing Toolbox invfreqz and tf2ss functions. I put the idfrd and ssest calls at the end, for comaprison.
Make appropriate changes to get the correct tranfer function order and state space realisation —
load modaldata SpaceStationFRF
frf = SpaceStationFRF.FRF;
f = SpaceStationFRF.f;
fs = SpaceStationFRF.Fs;
% nf = max(f)/fs*2*pi
Sz1 = size(frf)
Sz1 = 1×3
1000 3 3
figure
semilogy(f, abs(frf(:,1,1)))
grid
[b,a] = invfreqz(frf(:,1,1),f/fs*2*pi,4,4) % Transfer Function From Frequency Response
b = 1×5
1.0e-04 * 0.1052 0.0348 -0.2793 0.0478 0.0948
a = 1×5
1.0000 -2.0241 0.1291 1.8385 -0.9435
[A,B,C,D] = tf2ss(b,a) % State Space Realisation
A = 4×4
2.0241 -0.1291 -1.8385 0.9435 1.0000 0 0 0 0 1.0000 0 0 0 0 1.0000 0
B = 4×1
1 0 0 0
C = 1×4
1.0e-04 * 0.2478 -0.2929 -0.1457 0.1941
D = 1.0524e-05
% Extract the modal parameters of the lowest 24 modes using the least-squares rational function method.
[fn,dr,ms,ofrf] = modalfit(frf,f,fs,24,'FitMethod','lsrf');
% Compare the reconstructed FRF array to the measured one.
figure
for ij = 1:3
for ji = 1:3
subplot(3,3,3*(ij-1)+ji)
loglog(f,abs(frf(:,ji,ij)))
hold on
loglog(f,abs(ofrf(:,ji,ij)))
hold off
axis tight
title(sprintf('In%d -> Out%d',ij,ji))
if ij==3
xlabel('Frequency (Hz)')
end
end
end
% whos
FN = fieldnames(SpaceStationFRF)
FN = 3×1 cell array
{'FRF'} {'f' } {'Fs' }
FRF11_Data = idfrd(frf(:,1,1), f, 1/fs)
FRF11_Data = IDFRD model. Contains Frequency Response Data for 1 output(s) and 1 input(s). Response data is available at 1000 frequency points, ranging from 0.01592 rad/s to 159.2 rad/s. Sample time: 0.003125 seconds Status: Created by direct construction or transformation. Not estimated.
ss_sys = ssest(FRF11_Data)
ss_sys = Continuous-time identified state-space model: dx/dt = A x(t) + B u(t) + K e(t) y(t) = C x(t) + D u(t) + e(t) A = x1 x2 x3 x4 x1 -0.001584 0.1563 1.977e-07 -3.976e-05 x2 -0.6433 -0.001584 -0.0008179 0.1629 x3 -1.083e-10 -6.133e-10 -0.0006166 0.1563 x4 9.888e-10 -8.261e-10 -0.09739 -0.0006166 B = u1 x1 2.587e-08 x2 -7.953e-05 x3 -7.629e-05 x4 0.3125 C = x1 x2 x3 x4 y1 -0.001145 -6.471e-06 -4.126e-06 0.0007976 D = u1 y1 0 K = y1 x1 0 x2 0 x3 0 x4 0 Parameterization: FREE form (all coefficients in A, B, C free). Feedthrough: none Disturbance component: none Number of free coefficients: 24 Use "idssdata", "getpvec", "getcov" for parameters and their uncertainties. Status: Estimated using SSEST on frequency response data "FRF11_Data". Fit to estimation data: 90.97% FPE: 2.13e-07, MSE: 2.096e-07
EDIT — (6 Dec 2022 at 00:04)
Minor code change.
.
  2 Comments
Alan
Alan on 6 Dec 2022
Thanks for the answer. But this seems to involve two "fitting" steps. The first to get the modal parameter from modalfit and the second using invfreqz. I think we could have skipped a step.
I was looking for a function that would create the state space matrices from the modal parameters and vectors directly. I think I would know how to do that; I was hoping MATLAB had a function already (which I hadn't been able to find.)
Star Strider
Star Strider on 6 Dec 2022
My pleasure!
The System Identification Toolbox has two functions that can be used for this, those being idfrd and ssest, coded here as:
FRF11_Data = idfrd(frf(:,1,1), f, 1/fs)
ss_sys = ssest(FRF11_Data)
It’s possible to combine those into one function call:
ss_sys = ssest(idfrd(frf(:,1,1), f, 1/fs))
and perhaps even create an anonymous function to do that:
ss_frd = @(frd,f,ts) ssest(idfrd(frd, f, ts))
ss_sys = ss_frd(frf(:,1,1), f, 1/fs)
There otherwsie does not appear to be an existing function for that. If it were necessary to include other arguments to the functions within ‘ss_frd’, they would need to be added to its argument list as well, and then referenced in the appropriate functions.
.

Sign in to comment.

Categories

Find more on Periodic Waveform Generation in Help Center and File Exchange

Products


Release

R2022b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!