# Robustness Analysis in Simulink

This example shows how to use Simulink® blocks and helper functions provided by Robust Control Toolbox™ to specify and analyze uncertain systems in Simulink and how to use these tools to perform Monte Carlo simulations of uncertain systems.

## Contents

## Introduction

The Simulink model `usim_model` consists of an uncertain plant in feedback with a sensor:

```
open_system('usim_model')
```

The plant is a first-order model with two sources of uncertainty:

- Real pole whose location varies between -10 and -4
- Unmodeled dynamics which amount to 25% relative uncertainty at low frequency rising to 100% uncertainty at 130 rad/s.

The feedback path has a cheap sensor which is modeled by a first-order filter at 20 rad/s and an uncertain gain ranging between 0.1 and 2. To specify these uncertain variables, type

% First-order plant model unc_pole = ureal('unc_pole',-5,'Range',[-10 -4]); plant = ss(unc_pole,5,1,1); % Unmodeled plant dynamics input_unc = ultidyn('input_unc',[1 1]); wt = makeweight(0.25,130,2.5); % Sensor gain sensor_gain = ureal('sensor_gain',1,'Range',[0.1 2]);

## Simulink Blocks for Uncertainty Modeling and Analysis

The `RCTblocks` library contains blocks to model and analyze uncertainty effects in Simulink. To open the library, type

```
open('RCTblocks')
```

The `Uncertain State Space` block lets you specify uncertain linear systems (USS objects). `usim_model` contains three such blocks which are highlighted in blue. The dialog for the "Plant" block appears below.

In this dialog box,

- The "Uncertain system variable" parameter specifies the uncertain plant model (first-order model with uncertain pole
`unc_pole`). - The "Uncertainty value" parameter specifies values for the block's uncertain variables (
`unc_pole`in this case).

`uval` is a structure whose field names and values are the uncertain variable names and values to use for simulation. You can set `uval` to `[]` to use nominal values for the uncertain variables or vary `uval` to analyze how uncertainty affects the model responses.

The `MultiPlot Graph` block is a convenient way to visualize the response spread as you vary the uncertainty. This block superposes the simulation results obtained for each uncertainty value.

## Monte Carlo Simulation of Uncertain Systems

To easily control the uncertainty value used for simulation, `usim_model` uses the same "Uncertainty value" `uval` in all three `Uncertain State Space` blocks. Setting `uval` to `[]` simulates the closed-loop response for the nominal values of `unc_pole`, `input_unc`, and `sensor_gain`:

uval = []; % use nominal value of uncertain variables sim('usim_model',10); % simulate response

To analyze how uncertainty affects the model responses, you can use the `ufind` and `usample` commands to generate random values of `unc_pole`, `input_unc`, and `sensor_gain`. First use `ufind` to find the `Uncertain State Space` blocks in `usim_model` and compile a list of all uncertain variables in these blocks:

[uvars,pathinfo] = ufind('usim_model'); uvars % uncertain variables

uvars = struct with fields: input_unc: [1x1 ultidyn] sensor_gain: [1x1 ureal] unc_pole: [1x1 ureal]

```
pathinfo(:,1) % paths to USS blocks
```

ans = 3x1 cell array {'usim_model/Plant' } {'usim_model/Sensor Gain' } {'usim_model/Unmodeled Plant Dynamics'}

Then use `usample` to generate uncertainty values `uval` consistent with the specified uncertainty ranges. For example, you can simulate the closed-loop response for 10 random values of `unc_pole`, `input_unc`, and `sensor_gain` as follows:

for i=1:10; uval = usample(uvars); % generate random instance of uncertain variables sim('usim_model',10); % simulate response end

The `MultiPlot Graph` window now shows 10 possible responses of the uncertain feedback loop. Note that each `uval` instance is a structure containing values for the uncertain variables `input_unc`, `sensor_gain`, and `unc_pole`:

```
uval % sample value of uncertain variables
```

uval = struct with fields: input_unc: [1x1 ss] sensor_gain: 0.9495 unc_pole: -5.6164

## Randomized Simulations

If needed, you can configure the model to use a different uncertainty value `uval` for each new simulation. To do this, add `uvars` to the Base or Model workspace and attach the `usample` call to the model InitFcn:

bdclose('usim_model'), open_system('usim_model') % Write the uncertain variable list in the Base Workspace evalin('base','uvars=ufind(''usim_model'');') % Modify the model InitFcn set_param('usim_model','InitFcn','uval = usample(uvars);'); % Simulate ten times (same as pressing "Start simulation" ten times) for i=1:10; sim('usim_model',10); end % Clean up set_param('usim_model','InitFcn','');

Again the `MultiPlot Graph` window shows 10 possible responses of the uncertain feedback loop.

## Linearization of Uncertain Simulink Models

If you have Simulink Control Design™, you can use the same workflow to linearize and analyze uncertain systems in the frequency domain. For example, you can plot the closed-loop Bode response for 10 random samples of the model uncertainty:

clear sys wmax = 50; % max natural frequency for unmodeled dynamics (input_unc) for i=1:10; uval = usample(uvars,1,wmax); sys(:,:,i) = linearize('usim_model'); end bode(sys) title('Ten linearizations of usim\_model');

If the operating point is independent of the uncertain variables, a faster approach is to compute an uncertain linearization (USS object) in one shot using the `ulinearize` command:

```
usys = ulinearize('usim_model')
```

usys = Uncertain continuous-time state-space model with 1 outputs, 1 inputs, 3 states. The model uncertainty consists of the following blocks: input_unc: Uncertain 1x1 LTI, peak gain = 1, 1 occurrences sensor_gain: Uncertain real, nominal = 1, range = [0.1,2], 1 occurrences unc_pole: Uncertain real, nominal = -5, range = [-10,-4], 1 occurrences Type "usys.NominalValue" to see the nominal value, "get(usys)" to see all properties, and "usys.Uncertainty" to interact with the uncertain elements.

You can then sample the uncertain state-space model `usys` to generate a similar Bode plot:

```
bode(usample(usys,10,wmax))
title('Ten linearizations of usim\_model');
```