# ss

Convert unconstrained MPC controller to state-space linear system form

## Syntax

## Description

Use the Model Predictive Control Toolbox™
`ss`

function to convert an unconstrained MPC controller with defined
sample time to state space form (see `mpc`

for background). The returned controller is equivalent to the original MPC
controller `mpcobj`

when no constraints are active. You can then use
Control System Toolbox™ software for sensitivity analysis and other diagnostic
calculations.

To create or convert a generic LTI dynamical system to state space form, see `ss`

and
Dynamic System Models.

specifies whether the returned controller has preview action, that is if it uses the whole
reference and measured disturbance sequences as input signals.`kssFullPv`

= ss(`mpcobj`

,`signals`

,`refPreview`

,`mdPreview`

)

## Examples

### Convert Unconstrained MPC Controller to State-Space Model

Create the plant model.

plant = rss(5,2,3); plant.D = 0; plant = setmpcsignals(plant,'mv',1,'md',2,'ud',3,'mo',1,'uo',2);

Configure the MPC controller with a sample time of 0.1 seconds and nonzero nominal values, weights, and input targets.

mpcobj = mpc(plant,0.1);

-->"PredictionHorizon" is empty. Assuming default 10. -->"ControlHorizon" is empty. Assuming default 2. -->"Weights.ManipulatedVariables" is empty. Assuming default 0.00000. -->"Weights.ManipulatedVariablesRate" is empty. Assuming default 0.10000. -->"Weights.OutputVariables" is empty. Assuming default 1.00000. for output(s) y1 and zero weight for output(s) y2

mpcobj.Model.Nominal.U = [0.7 0.8 0]; mpcobj.Model.Nominal.Y = [0.5 0.6]; mpcobj.Model.Nominal.DX = rand(5,1); mpcobj.Weights.MV = 2; mpcobj.Weights.OV = [3 4]; mpcobj.MV.Target = [0.1 0.2 0.3];

Specifying `mpcobj.Model.Nominal.DX`

as nonzero means that the nominal values are not at steady state `mpcobj.MV.Target`

specifies three preview steps.

Convert `mpcobj`

to a state-space model.

Kss = ss(mpcobj)

-->Converting model to discrete time. -->The "Model.Disturbance" property is empty: Assuming unmeasured input disturbance #3 is integrated white noise. Assuming no disturbance added to measured output #1. -->"Model.Noise" is empty. Assuming white noise on each measured output. Kss = A = xMPC1 xMPC2 xMPC3 xMPC4 xMPC5 xMPC6 prev.MV1 xMPC1 0.76 0.2216 -0.006469 0.3508 0.02977 -0.04783 3.019e-05 xMPC2 -0.231 1.135 -0.4594 0.5914 0.01656 -0.1007 7.773e-08 xMPC3 -0.03007 0.1185 0.5467 0.1386 0.01752 -0.11 0.0001122 xMPC4 -0.1927 -0.2434 -0.1331 0.2121 -0.02496 -0.1596 0.0001298 xMPC5 -0.1399 -0.2179 0.09667 -0.3748 0.5926 0.1385 -2.941e-05 xMPC6 -0.09826 0 0.1393 -0.1346 -0.09578 1 0 prev.MV1 -2.511 0.02726 -2.984 -1.2 -0.08729 -2.102 0.001735 B = MO1 xMPC1 0.05903 xMPC2 0.1294 xMPC3 0.03619 xMPC4 -0.0589 xMPC5 -0.08955 xMPC6 -0.09022 prev.MV1 0.09002 C = xMPC1 xMPC2 xMPC3 xMPC4 xMPC5 xMPC6 prev.MV1 MV1 -2.511 0.02726 -2.984 -1.2 -0.08729 -2.102 0.001735 D = MO1 MV1 0.09002 Sample time: 0.1 seconds Discrete-time state-space model.

The output, `sys`

, is a seventh-order SISO state-space model. The seven states include the five plant model states, one state from the default input disturbance model, and one state from the previous move, `u(k-1)`

.

Set `mpcobj`

to use custom state estimation.

`setEstimator(mpcobj,'custom');`

Convert `mpcobj`

to a static gain matrix for state-feedback.

K = ss(mpcobj)

-->Converting model to discrete time. -->The "Model.Disturbance" property is empty: Assuming unmeasured input disturbance #3 is integrated white noise. Assuming no disturbance added to measured output #1. -->"Model.Noise" is empty. Assuming white noise on each measured output. K = D = xMPC1 xMPC2 xMPC3 xMPC4 xMPC5 xMPC6 prev.MV1 MV1 -2.609 0.02726 -2.845 -1.334 -0.1829 -2.102 0.001735 Static gain.

As expected this is a row vector with seven elements.

Reset `mpcobj`

to use the default estimator.

`setEstimator(mpcobj,'default');`

You can use `'rv'`

as a second argument to return a system with 3 additional inputs (reference of measured plant output, reference of unmeasured plant output and measured disturbance).

`Kss = ss(mpcobj, 'rv')`

-->Converting model to discrete time. -->The "Model.Disturbance" property is empty: Assuming unmeasured input disturbance #3 is integrated white noise. Assuming no disturbance added to measured output #1. -->"Model.Noise" is empty. Assuming white noise on each measured output. Kss = A = xMPC1 xMPC2 xMPC3 xMPC4 xMPC5 xMPC6 prev.MV1 xMPC1 0.76 0.2216 -0.006469 0.3508 0.02977 -0.04783 3.019e-05 xMPC2 -0.231 1.135 -0.4594 0.5914 0.01656 -0.1007 7.773e-08 xMPC3 -0.03007 0.1185 0.5467 0.1386 0.01752 -0.11 0.0001122 xMPC4 -0.1927 -0.2434 -0.1331 0.2121 -0.02496 -0.1596 0.0001298 xMPC5 -0.1399 -0.2179 0.09667 -0.3748 0.5926 0.1385 -2.941e-05 xMPC6 -0.09826 0 0.1393 -0.1346 -0.09578 1 0 prev.MV1 -2.511 0.02726 -2.984 -1.2 -0.08729 -2.102 0.001735 B = MO1 ref.MO1 ref.UO1 MD1 xMPC1 0.05903 -0.003162 -0.03311 -0.06524 xMPC2 0.1294 -8.142e-06 -8.526e-05 -0.0008242 xMPC3 0.03619 -0.01175 -0.123 0.08255 xMPC4 -0.0589 -0.01359 -0.1423 0.03386 xMPC5 -0.08955 0.003081 0.03226 -0.005793 xMPC6 -0.09022 0 0 0 prev.MV1 0.09002 -0.1817 -1.903 1.503 C = xMPC1 xMPC2 xMPC3 xMPC4 xMPC5 xMPC6 prev.MV1 MV1 -2.511 0.02726 -2.984 -1.2 -0.08729 -2.102 0.001735 D = MO1 ref.MO1 ref.UO1 MD1 MV1 0.09002 -0.1817 -1.903 1.503 Sample time: 0.1 seconds Discrete-time state-space model.

Use `'t'`

as a second argument to return a system with 3 additional inputs (input target channels corresponding to three preview steps).

`Kss = ss(mpcobj, 't')`

Kss = A = xMPC1 xMPC2 xMPC3 xMPC4 xMPC5 xMPC6 prev.MV1 xMPC1 0.76 0.2216 -0.006469 0.3508 0.02977 -0.04783 3.019e-05 xMPC2 -0.231 1.135 -0.4594 0.5914 0.01656 -0.1007 7.773e-08 xMPC3 -0.03007 0.1185 0.5467 0.1386 0.01752 -0.11 0.0001122 xMPC4 -0.1927 -0.2434 -0.1331 0.2121 -0.02496 -0.1596 0.0001298 xMPC5 -0.1399 -0.2179 0.09667 -0.3748 0.5926 0.1385 -2.941e-05 xMPC6 -0.09826 0 0.1393 -0.1346 -0.09578 1 0 prev.MV1 -2.511 0.02726 -2.984 -1.2 -0.08729 -2.102 0.001735 B = MO1 MV1.target(0 MV1.target(1 MV1.target(2 xMPC1 0.05903 0.01207 -0.001223 -0.009782 xMPC2 0.1294 3.109e-05 -3.149e-06 -2.519e-05 xMPC3 0.03619 0.04487 -0.004544 -0.03635 xMPC4 -0.0589 0.05191 -0.005257 -0.04206 xMPC5 -0.08955 -0.01176 0.001191 0.00953 xMPC6 -0.09022 0 0 0 prev.MV1 0.09002 0.6938 -0.07026 -0.5621 C = xMPC1 xMPC2 xMPC3 xMPC4 xMPC5 xMPC6 prev.MV1 MV1 -2.511 0.02726 -2.984 -1.2 -0.08729 -2.102 0.001735 D = MO1 MV1.target(0 MV1.target(1 MV1.target(2 MV1 0.09002 0.6938 -0.07026 -0.5621 Sample time: 0.1 seconds Discrete-time state-space model.

You can use the second output argument to return the vector of manipulated variables target values. This vector corresponds to `C.MV.Target`

- `C.Model.Nominal.U(1)`

.

[Kss, ut] = ss(mpcobj); ut

`ut = `*3×1*
-0.6000
-0.5000
-0.4000

## Input Arguments

`mpcobj`

— Model predictive controller

`mpc`

object

Model predictive controller, specified as an MPC controller
object. To create an MPC controller, use `mpc`

.

`signals`

— Signal selection

`''`

(default) | character array | string

Specify `signals`

as a character vector or string with any
combination that contains one or more of the following characters:

`'r'`

— Output references

`'v'`

— Measured disturbances

`'o'`

— Offset terms

`'t'`

— Input targets

For example, to obtain a controller that maps [*y _{m}*;

*r*;

*v*] to

*u*, use:

kss = ss(mpcobj,'rv');

**Example: **`'r'`

`refPreview`

— use whole reference sequence as input

`'off'`

(default) | `'on'`

If this flag is `'on'`

, then the input matrices of the returned
controller have a larger size to multiply the whole reference sequence.

**Example: **`'on'`

`mdPreview`

— use whole measured disturbance sequence as input

`'off'`

(default) | `'on'`

If this flag is `'on'`

, then the input matrices of the returned
controller have a larger size to multiply the whole disturbance sequence.

**Example: **`'on'`

## Output Arguments

`kss`

— state space form of the unconstrained MPC controller

`ss`

object

The discrete-time state space form of the unconstrained MPC controller has the following structure:

*x*(*k* + 1) =
*A**x*(*k*) +
*B**y _{m}*(

*k*)

*u*(*k*) =
*C**x*(*k*) +
*D**y _{m}*(

*k*)

where *A*, *B*, *C*, and
*D* are the matrices forming a state space realization of the
controller `kss`

, *y _{m}* is the
vector of measured outputs of the plant, and

*u*is the vector of manipulated variables. The sampling time of controller

`kss`

is
`mpcobj.Ts`

.

**Note**

Vector *x* includes the states of the observer (plant +
disturbance + noise model states) and the previous manipulated variable
*u*(*k*-1).

**Note**

Only the following fields of `mpcobj`

are used when computing
the state-space model: `Model`

,
`PredictionHorizon`

, `ControlHorizon`

,
`Ts`

, `Weights`

.

**Note**

If `mpcobj`

is set to use custom state estimation, then
`ss`

returns a static gain feedback matrix from the states of
the augmented discrete-time plant, including previous values of the manipulated
variables, to the manipulated variables.

`kssFull`

— full state space form of the unconstrained MPC controller

`ss`

object

The full discrete-time state space form of the unconstrained MPC controller has the following structure:

*x*(*k* + 1) =
*A**x*(*k*) +
*B**y _{m}*(

*k*) +

*B*

_{r}*r*(

*k*) +

*B*

_{v}*v*(

*k*) +

*B*

_{ut}*u*(

_{target}*k*) +

*B*

_{off}*u*(*k*) =
*C**x*(*k*) +
*D**y _{m}*(

*k*) +

*D*

_{r}*r*(

*k*) +

*D*

_{v}*v*(

*k*) +

*D*

_{ut}*u*(

_{target}*k*) +

*D*

_{off}Here:

*A*,*B*,*C*, and*D*are the matrices forming a state space realization of the controller from measured plant output to manipulated variables*r*is the vector of setpoints for both measured and unmeasured plant outputs*v*is the vector of measured disturbances.*u*is the vector of preferred values for manipulated variables._{target}

In the general case of nonzero offsets,
*y*_{m}, *r*,
*v*, and *u*_{target} must be
interpreted as the difference between the vector and the corresponding offset. Offsets
can be nonzero is `mpcobj.Model.Nominal.Y`

or
`mpcobj.Model.Nominal.U`

are nonzero.

Vectors *B _{off}* and

*D*are constant terms. They are nonzero if and only if

_{off}`mpcobj.Model.Nominal.DX`

is nonzero (continuous-time
prediction models), or
`mpcobj.Model.Nominal.Dx`

-`mpcobj.Model.Nominal.X`

is nonzero (discrete-time prediction models). In other words, when
`Nominal.X`

represents an equilibrium state,
*B*

_{off},

*D*

_{off}are zero.

`kssFullPv`

— full state space form of the unconstrained MPC controller

`ss`

object

If the flag `refPreview = 'on'`

, then matrices
*B _{r}* and

*D*multiply the whole reference sequence:

_{r}*x*(*k* + 1) =
*A**x*(*k*) +
*B**y _{m}*(

*k*) +

*B*[

_{r}*r*(

*k*);

*r*(

*k*+ 1);...;

*r*(

*k*+

*p*– 1)] +...

*u*(*k*) =
*C**x*(*k*) +
*D**y _{m}*(

*k*) +

*D*[

_{r}*r*(

*k*);

*r*(

*k*+ 1);...;

*r*(

*k*+

*p*– 1)] +...

Similarly, if the flag `mdPreview='on'`

, then matrices
*B _{v}* and

*D*multiply the whole measured disturbance sequence:

_{v}*x*(*k* + 1) =
*A**x*(*k*) +...+
*B _{v}*[

*v*(

*k*);

*v*(

*k*+ 1);...;

*v*(

*k*+

*p*)] +...

*u*(*k*) =
*C**x*(*k*) +...+
*D _{v}*[

*v*(

*k*);

*v*(

*k*+ 1);...;

*v*(

*k*+

*p*)] +...

`ut`

— target values

column vector

`ut`

is returned as a vector of doubles, ```
[utarget(k);
utarget(k+1); ... utarget(k+h)]
```

.

Here:

*h*— Maximum length of previewed inputs; that is,`h = max(length(mpcobj.ManipulatedVariables(:).Target))`

`utarget`

— Difference between the input target and corresponding input offsets; that is,`mpcobj.ManipulatedVariables(:).Targets - mpcobj.Model.Nominal.U`

## Version History

**Introduced before R2006a**

## See Also

### Functions

### Objects

## Open Example

You have a modified version of this example. Do you want to open this example with your edits?

## MATLAB Command

You clicked a link that corresponds to this MATLAB command:

Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.

Select a Web Site

Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .

You can also select a web site from the following list:

## How to Get Best Site Performance

Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.

### Americas

- América Latina (Español)
- Canada (English)
- United States (English)

### Europe

- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)

- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)