# Modal Analysis of Identified Models

Identify state-space models of systems. Use the models to compute frequency-response functions and modal parameters. This example requires a System Identification Toolbox™ license.

### Hammer Excitation

Load a file containing three-input/three-output hammer excitation data sampled at 4 kHz. Use the first ${10}^{4}$ samples for estimation and samples $2×{10}^{4}\text{\hspace{0.17em}}$ to $5×{10}^{4}$ for model quality validation. Specify the sample time as the inverse of the sample rate. Store the data as `@iddata` objects.

```load modaldata XhammerMISO1 YhammerMISO1 fs rest = 1:1e4; rval = 2e4:5e4; Ts = 1/fs; Estimation = iddata(YhammerMISO1(rest,:),XhammerMISO1(rest,:),Ts); Validation = iddata(YhammerMISO1(rval,:),XhammerMISO1(rval,:),Ts,'Tstart',rval(1)*Ts);```

Plot the estimation data and the validation data.

```plot(Estimation,Validation) legend(gca,'show')``` Use the `ssest` function to estimate a 7th-order state-space model of the system that minimizes the simulation error between the measured outputs and the model outputs. Specify that the state-space model has feedthrough.

```Orders = 7; opt = ssestOptions('Focus','simulation'); sys = ssest(Estimation,Orders,'Feedthrough',true,'Ts',Ts,opt);```

(To find the model order that gives the best tradeoff between accuracy and complexity, set `Orders` to `1:15` in the previous code. `ssest` outputs a log plot of singular values that lets you specify the order interactively. The function also recommends a model order of 7.) Validate the model quality on the validation dataset. Plot the normalized root mean square error (NRMSE) measure of goodness-of-fit. The model describes accurately the output signals of the validation data.

`compare(Validation,sys)` Estimate the frequency-response functions of the model. Display the functions using `modalfrf` without output arguments.

```[frf,f] = modalfrf(sys); modalfrf(sys)``` Assume that the system is well described using three modes. Compute the natural frequencies, damping ratios, and mode-shape vectors of the three modes.

```Modes = 3; [fn,dr,ms] = modalfit(sys,f,Modes)```
```fn = 3×1 103 × 0.3727 0.8525 1.3706 ```
```dr = 3×1 0.0008 0.0018 0.0029 ```
```ms = 3×3 complex 0.0036 - 0.0019i 0.0039 - 0.0005i 0.0021 + 0.0006i 0.0043 - 0.0023i 0.0010 - 0.0001i -0.0033 - 0.0010i 0.0040 - 0.0021i -0.0031 + 0.0004i 0.0011 + 0.0003i ```

Compute and display the reconstructed frequency-response functions. Express the magnitudes in decibels.

```[~,~,~,ofrf] = modalfit(sys,f,Modes); clf for ij = 1:3 for ji = 1:3 subplot(3,3,3*(ij-1)+ji) plot(f/1000,20*log10(abs(ofrf(:,ji,ij)))) axis tight title(sprintf('In%d -> Out%d',ij,ji)) if ij==3 xlabel('Frequency (kHz)') end end end``` ### Controlled Unstable Process

Load a file containing a high modal density frequency-response measurement. The data corresponds to an unstable process maintained at equilibrium using feedback control. Store the data as an `idfrd` object for identification. Plot the Bode diagram.

```load HighModalDensData FRF f G = idfrd(permute(FRF,[2 3 1]),f,0,'FrequencyUnit','Hz'); figure bodemag(G) xlim([0.01,2e3])``` Identify a transfer function with 32 poles and 32 zeros.

`sys = tfest(G,32,32);`

Compare the frequency response of the model with the measured response.

```bodemag(G,sys) xlim([0.01,2e3]) legend(gca,'show')``` Extract the natural frequencies and damping ratios of the first 10 least-damped oscillatory modes. Store the results in a table.

```[fn,dr] = modalfit(sys,[],10); T = table((1:10)',fn,dr,'VariableNames',{'Mode','Frequency','Damping'})```
```T=10×3 table Mode Frequency Damping ____ _________ _________ 1 82.764 0.011304 2 85.013 0.015632 3 124.04 0.025252 4 142.04 0.017687 5 251.46 0.0062182 6 332.79 0.0058266 7 401.21 0.0043645 8 625.14 0.0039247 9 770.49 0.002795 10 943.64 0.0019943 ```
{"ft_lang_label":"__label__en","ft_lang_prob":0.6334689,"math_prob":0.99661696,"size":3596,"snap":"2021-43-2021-49","text_gpt3_token_len":1097,"char_repetition_ratio":0.12416481,"word_repetition_ratio":0.0,"special_character_ratio":0.3339822,"punctuation_ratio":0.20667523,"nsfw_num_words":0,"has_unicode_error":false,"math_prob_llama3":0.99462706,"pos_list":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14],"im_url_duplicate_count":[null,1,null,1,null,1,null,1,null,1,null,1,null,1,null],"WARC_HEADER":"{\"WARC-Type\":\"response\",\"WARC-Date\":\"2021-12-07T00:42:08Z\",\"WARC-Record-ID\":\"<urn:uuid:5cbd7144-7b99-470c-b8b0-530443746bb4>\",\"Content-Length\":\"83966\",\"Content-Type\":\"application/http; msgtype=response\",\"WARC-Warcinfo-ID\":\"<urn:uuid:342a02ed-cb7e-44ee-80f6-a9947a843809>\",\"WARC-Concurrent-To\":\"<urn:uuid:79f5d0b0-c783-40c5-ad85-f236c21bbbed>\",\"WARC-IP-Address\":\"23.13.150.165\",\"WARC-Target-URI\":\"https://la.mathworks.com/help/signal/ug/modal-analysis-of-identified-models.html\",\"WARC-Payload-Digest\":\"sha1:IQBTSCQ5N6AA77DLLQFJHZGI2635GLNC\",\"WARC-Block-Digest\":\"sha1:MMZOJPA4FBMAAH2ABFGH3JJV3YU7EPIS\",\"WARC-Identified-Payload-Type\":\"text/html\",\"warc_filename\":\"/cc_download/warc_2021/CC-MAIN-2021-49/CC-MAIN-2021-49_segments_1637964363327.64_warc_CC-MAIN-20211206224536-20211207014536-00571.warc.gz\"}"}