## Robust Control Toolbox |

This example shows how to use Robust Control Toolbox™ to build uncertain state-space models and analyze the robustness of feedback control systems with uncertain elements.

We will show how to specify uncertain physical parameters and create uncertain state-space models from these parameters. You will see how to evaluate the effects of random and worst-case parameter variations using the functions `usample`

and `robuststab`

.

**Two-Cart and Spring System**

In this example, we use the following system consisting of two frictionless carts connected by a spring `k`

:

**Figure 1:** Two-cart and spring system.

The control input is the force `u1`

applied to the left cart. The output to be controlled is the position `y1`

of the right cart. The feedback control is of the following form:

In addition, we use a triple-lead compensator:

We create this compensator using this code:

s = zpk('s'); % The Laplace 's' variable C = 100*ss((s+1)/(.001*s+1))^3;

**Block Diagram Model**

The two-cart and spring system is modeled by the block diagram shown below.

**Figure 2:** Block diagram of two-cart and spring model.

**Uncertain Real Parameters**

The problem of controlling the carts is complicated by the fact that the values of the spring constant `k`

and cart masses `m1,m2`

are known with only 20% accuracy:
,
, and
. To capture this variability, we will create three uncertain real parameters using th `ureal`

function:

k = ureal('k',1,'percent',20); m1 = ureal('m1',1,'percent',20); m2 = ureal('m2',1,'percent',20);

**Uncertain Cart Models**

We can represent the carts models as follows:

Given the uncertain parameters `m1`

and `m2`

, we will construct uncertain state-space models (USS) for G1 and G2 as follows:

G1 = 1/s^2/m1; G2 = 1/s^2/m2;

**Uncertain Model of a Closed-Loop System**

First we'll construct a plant model `P`

corresponding to the block diagram shown above (`P`

maps u1 to y1):

```
% Spring-less inner block F(s)
F = [0;G1]*[1 -1]+[1;-1]*[0,G2]
```

F = Uncertain continuous-time state-space model with 2 outputs, 2 inputs, 4 states. The model uncertainty consists of the following blocks: m1: Uncertain real, nominal = 1, variability = [-20,20]%, 1 occurrences m2: Uncertain real, nominal = 1, variability = [-20,20]%, 1 occurrences Type "F.NominalValue" to see the nominal value, "get(F)" to see all properties, and "F.Uncertainty" to interact with the uncertain elements.

Connect with the spring k

P = lft(F,k)

P = Uncertain continuous-time state-space model with 1 outputs, 1 inputs, 4 states. The model uncertainty consists of the following blocks: k: Uncertain real, nominal = 1, variability = [-20,20]%, 1 occurrences m1: Uncertain real, nominal = 1, variability = [-20,20]%, 1 occurrences m2: Uncertain real, nominal = 1, variability = [-20,20]%, 1 occurrences Type "P.NominalValue" to see the nominal value, "get(P)" to see all properties, and "P.Uncertainty" to interact with the uncertain elements.

The feedback control u1 = C*(r-y1) operates on the plant `P`

as shown below:

**Figure 3:** Uncertain model of a closed-loop system.

We'll use the `feedback`

function to compute the closed-loop transfer from r to y1.

```
% Uncertain open-loop model is
L = P*C
```

L = Uncertain continuous-time state-space model with 1 outputs, 1 inputs, 7 states. The model uncertainty consists of the following blocks: k: Uncertain real, nominal = 1, variability = [-20,20]%, 1 occurrences m1: Uncertain real, nominal = 1, variability = [-20,20]%, 1 occurrences m2: Uncertain real, nominal = 1, variability = [-20,20]%, 1 occurrences Type "L.NominalValue" to see the nominal value, "get(L)" to see all properties, and "L.Uncertainty" to interact with the uncertain elements.

Uncertain closed-loop transfer from r to y1 is

T = feedback(L,1)

T = Uncertain continuous-time state-space model with 1 outputs, 1 inputs, 7 states. The model uncertainty consists of the following blocks: k: Uncertain real, nominal = 1, variability = [-20,20]%, 1 occurrences m1: Uncertain real, nominal = 1, variability = [-20,20]%, 1 occurrences m2: Uncertain real, nominal = 1, variability = [-20,20]%, 1 occurrences Type "T.NominalValue" to see the nominal value, "get(T)" to see all properties, and "T.Uncertainty" to interact with the uncertain elements.

Note that since `G1`

and `G2`

are uncertain, both `P`

and `T`

are uncertain state-space models.

**Extracting the Nominal Plant**

The nominal transfer function of the plant is

Pnom = zpk(P.nominal)

Pnom = 1 --------------------------- (s^2 + 5.995e-16) (s^2 + 2) Continuous-time zero/pole/gain model.

**Nominal Closed-Loop Stability**

Next, we will evaluate the nominal closed-loop transfer function `Tnom`

, and then check that all the poles of the nominal system have negative real parts:

Tnom = zpk(T.nominal); maxrealpole = max(real(pole(Tnom)))

maxrealpole = -0.8232

**Stability Margin Analysis (Robustness)**

Will the feedback loop remain stable for all possible values of `k,m1,m2`

in the specified uncertainty range? We can use the `robuststab`

function to answer this question rigorously. The `robuststab`

function computes the stability margins and the smallest destabilizing parameter variations in the variable `Udestab`

(relative to the nominal values):

[StabilityMargin,Udestab,REPORT] = robuststab(T);

REPORT

REPORT = Uncertain system is robustly stable to modeled uncertainty. -- It can tolerate up to 301% of the modeled uncertainty. -- A destabilizing combination of 500% of the modeled uncertainty was found. -- This combination causes an instability at 0.693 rad/seconds. -- Sensitivity with respect to the uncertain elements are: 'k' is 20%. Increasing 'k' by 25% leads to a 5% decrease in the margin. 'm1' is 60%. Increasing 'm1' by 25% leads to a 15% decrease in the margin. 'm2' is 58%. Increasing 'm2' by 25% leads to a 14% decrease in the margin.

Udestab

Udestab = k: 1.1094e-07 m1: 0.1415 m2: 1.4914e-04

The report indicates that the closed loop can tolerate up to three times as much variability in `k,m1,m2`

before going unstable. It also provides useful information about the sensitivity of stability to each parameter. Note that the smallest destabilizing perturbation `Udestab`

requires varying `m2`

by 100%, or 5 times the specified uncertainty.

**Worst-Case Performance Analysis**

Note that the peak gain across frequency of the closed-loop transfer `T`

is indicative of the level of overshoot in the closed-loop step response. The closer this gain is to 1, the smaller the overshoot.

We use `wcgain`

to compute the worst-case gain `PeakGain`

of `T`

over the specified uncertainty range.

[PeakGain,Uwc] = wcgain(T); PeakGain

PeakGain = LowerBound: 1.0475 UpperBound: 1.0477 CriticalFrequency: 7.0502

Substitute the worst-case parameter variation `Uwc`

into `T`

to compute the worst-case closed-loop transfer `Twc`

.

```
Twc = usubs(T,Uwc); % Worst-case closed-loop transfer T
```

Finally, pick from random samples of the uncertain parameters and compare the corresponding closed-loop transfers with the worst-case transfer `Twc`

.

Trand = usample(T,4); % 4 random samples of uncertain model T clf subplot(211), bodemag(Trand,'b',Twc,'r',{10 1000}); % plot Bode response subplot(212), step(Trand,'b',Twc,'r',0.2); % plot step response

**Figure 4:** Bode diagram and step response.

In this analysis, we see that the compensator C performs robustly for the specified uncertainty on k,m1,m2.