This example shows how to use the `slLinearizer`

interface to batch linearize a Simulink model. You vary model parameter values and obtain multiple open- and closed-loop transfer functions from the model.

You can perform the same analysis using the `linearize`

command. However, when you want to obtain multiple open- and closed-loop transfer functions, especially for a large-scale model, `slLinearizer`

can be more efficient.

The `scdcascade`

model contains a pair of cascaded feedback control loops. Each loop includes a PI controller. The plant models, `G1`

(outer loop) and `G2`

(inner loop), are LTI models.

Use the `slLinearizer`

interface to initially analyze the inner-loop dynamics. Then, analyze the outer-loop dynamics.

```
mdl = 'scdcascade';
open_system(mdl);
```

sllin = slLinearizer(mdl)

slLinearizer linearization interface for "scdcascade": No analysis points. Use the addPoint command to add new points. No permanent openings. Use the addOpening command to add new permanent openings. Properties with dot notation get/set access: Parameters : [] OperatingPoints : [] (model initial condition will be used.) BlockSubstitutions : [] Options : [1x1 linearize.LinearizeOptions]

For inner-loop analysis, vary the gains of the inner-loop PI controller block, `C2`

. Vary the proportional gain (`Kp2`

) and integral gain (`Ki2`

) in the 15% range.

Kp2_range = linspace(Kp2*0.85,Kp2*1.15,6); Ki2_range = linspace(Ki2*0.85,Ki2*1.15,4); [Kp2_grid, Ki2_grid] = ndgrid(Kp2_range,Ki2_range); params(1).Name = 'Kp2'; params(1).Value = Kp2_grid; params(2).Name = 'Ki2'; params(2).Value = Ki2_grid; sllin.Parameters = params;

`Kp2_range`

and `Ki2_range`

specify the sample values for the `Kp2`

and `Ki2`

parameters. To obtain a transfer function for each combination of `Kp2`

and `Ki2`

, you use `ndgrid`

and construct a 6x4 parameter grid, with grid arrays `Kp2_grid`

and `Ki2_grid`

. You configure the `Parameters`

property of `sllin`

with the structure `params`

. This structure specifies the parameters to be varied and their grid arrays.

The overall closed-loop transfer function for the inner loop, with the outer loop open, is equal to the transfer function from `u1`

to `y2`

. To eliminate the effects of the outer loop, break the loop at `e1`

, `y1m`

, or `y1`

. For this example, break the loop at `e1`

.

Add `u1`

and `y2`

as analysis points, and `e1`

as a permanent opening of `sllin`

.

addPoint(sllin,{'y2','u1'}); addOpening(sllin,'e1');

Obtain the transfer function from `u1`

to `y2`

.

r2yi = getIOTransfer(sllin,'u1','y2');

`r2yi`

, a 6x4 `ss`

model array, contains the transfer function for each specified parameter combination. The software uses the model initial conditions as the linearization operating point.

Because `e1`

is a permanent opening of `sllin`

, `r2yi`

does not include the effects of the outer loop.

Plot the step response for `r2yi`

.

stepplot(r2yi);

The step response for all the models varies in the 10% range. The settling time for most models is less than 1.5 seconds.

Obtain the inner-loop transfer function at `y2`

, with the outer loop open at `e1`

.

```
Li = getLoopTransfer(sllin,'y2',-1);
```

Because the software assumes positive feedback by default and `scdcascade`

uses negative feedback, you specify the feedback sign using the third input argument. Now, `Li = -G2C2`

.

Plot the bode response for `Li`

.

bodeplot(Li);

The magnitude plot for all the models varies in the 3dB range. The phase plot shows the most variation, approximately 20 degrees, in the [1 10] rad/s interval.

For outer-loop analysis, vary the gains of the outer-loop PI controller block, `C1`

. Vary the proportional gain (`Kp1`

) and integral gain (`Ki1`

) in the 20% range.

Kp1_range = linspace(Kp1*0.8,Kp1*1.2,6); Ki1_range = linspace(Ki1*0.8,Ki1*1.2,4); [Kp1_grid, Ki1_grid] = ndgrid(Kp1_range,Ki1_range); params(1).Name = 'Kp1'; params(1).Value = Kp1_grid; params(2).Name = 'Ki1'; params(2).Value = Ki1_grid; sllin.Parameters = params;

Similar to the workflow for configuring the parameter grid for inner-loop analysis, you create the structure, `params`

, that specifies a 6x4 parameter grid. You reconfigure `sllin.Parameters`

to use the new parameter grid. `sllin`

now uses the default values for `Ki2`

and `Kp2`

.

Remove `e1`

from the list of permanent openings for `sllin`

before proceeding with outer-loop analysis.

```
removeOpening(sllin,'e1');
```

To obtain the closed-loop transfer function from the reference signal, `r`

, to the plant output, `y1m`

, add `r`

and `y1m`

as analysis points to `sllin`

.

addPoint(sllin,{'r','y1m'});

Obtain the transfer function from `r`

to `y1m`

.

r2yo = getIOTransfer(sllin,'r','y1m');

Plot the step response for `r2yo`

.

stepplot(r2yo);

The step response in underdamped for all the models.

To obtain the outer-loop sensitivity at the plant output, use `y1`

as the analysis point. Add `y1`

as an analysis point to `sllin`

.

```
addPoint(sllin,'y1');
```

Obtain the outer-loop sensitivity at `y1`

.

```
So = getSensitivity(sllin,'y1');
```

Plot the step response of `So`

.

stepplot(So);

This plot indicates that it takes approximately 15 seconds to reject a step disturbance at the plant output, `y1`

.

Close the Simulink model

bdclose(mdl);

Was this topic helpful?