Main Content

Solve a Finite Set MPC Problem in MATLAB

This example shows how to solve, in MATLAB®, an MPC problem in which some manipulated variables belong to a finite (discrete) set.

Create a Plant Model

Fix the random generator seed for reproducibility.

rng(0);

Create a discrete-time strictly proper plant with 4 states, two inputs and one output.

plant = drss(4,1,2);
plant.D = 0;

Set the sampling time to 0.1s, and increase the control authority of the first input, to better illustrate its control contribution.

plant.Ts = 0.1;
plant.B(:,1)=plant.B(:,1)*2;

Design the MPC Controller

Create an MPC controller with one second sampling time, 20 steps prediction horizon and 5 steps control horizon.

mpcobj = mpc(plant,0.1,20,5);
-->"Weights.ManipulatedVariables" is empty. Assuming default 0.00000.
-->"Weights.ManipulatedVariablesRate" is empty. Assuming default 0.10000.
-->"Weights.OutputVariables" is empty. Assuming default 1.00000.

Specify the first manipulated variable as belonging to a set of seven possible values (you could also specify the type as an integer using the instruction mpcobj.MV(1).Type = 'integer';)

mpcobj.MV(1).Type = [-1 -0.7 -0.3 0 0.2 0.5 1];

Use rate limits to enforce maximum increment and decrement values for the first manipulated variable.

mpcobj.MV(1).RateMin = -0.5;
mpcobj.MV(1).RateMax = 0.5;

Set limits on the second manipulated variable, whose default type (continuous) has not been changed.

mpcobj.MV(2).Min = -2;
mpcobj.MV(2).Max = 2;

Simulate the Closed Loop Using the sim Command and Plot Results

Set the number of simulation steps.

simsteps = 50;

Create an output reference signal equal to zero from steps 20 to 35 and equal to 0.6 before and after.

r = ones(simsteps,1)*0.6;
r(20:35) = 0;

Simulate the closed loop using the sim command. Return the plant input and output signals.

[YY,~,UU,~,~,~,status] = sim(mpcobj,simsteps,r);
-->Assuming output disturbance added to measured output #1 is integrated white noise.
-->"Model.Noise" is empty. Assuming white noise on each measured output.

Plot results.

figure(1)

subplot(211)    % plant output
plot([YY,r]);
grid
title("Tracking control");

subplot(223)    % first plant input
stairs(UU(:,1));
grid
title("MV(1) finite set ")

subplot(224)    % second plant input
stairs(UU(:,2));
grid
title("MV(2) continuous between [-2 2]")

Figure contains 3 axes objects. Axes object 1 with title Tracking control contains 2 objects of type line. Axes object 2 with title MV(1) finite set contains an object of type stair. Axes object 3 with title MV(2) continuous between [-2 2] contains an object of type stair.

As expected, the first manipulated variable is restricted to the values specified in the finite set (with jumps less than the specified limit), while the second one can vary continuously between -2 and 2. The plant output tracks the reference value after a few seconds.

Simulate the Closed Loop Using the mpcmove Command and Plot Results

Get handle to mpcobj state and initialize plant state.

xmpc = mpcstate(mpcobj);
x = xmpc.Plant;

Initialize arrays that store signals.

YY = []; RR = []; UU = []; XX = [];

Perform simulation using the mpcmove command to calculate the control actions.

for k = 1:simsteps
    XX = [XX;x']; % store plant state
    y = plant.C*x; % calculate plant output
    YY = [YY;y]; % store plant output
    RR = [RR;r(k)]; % store reference
    u = mpcmove(mpcobj,xmpc,y,r(k)); % calculate optimal mpc move
    UU = [UU;u']; % store plant input
    x = plant.A*x+plant.B*u; % update plant state
    % is the last line necessary since x=xmpc.Plant gets updated anyway?
end

Plot results.

figure(2)

subplot(211)    % plant output
plot([YY,r]);
grid
title("Tracking control");

subplot(223)    % first plant input
stairs(UU(:,1));
grid
title("MV(1) finite set")

subplot(224)    % second plant input
stairs(UU(:,2));
grid
title("MV(2) continuous between [-2 2]")

Figure contains 3 axes objects. Axes object 1 with title Tracking control contains 2 objects of type line. Axes object 2 with title MV(1) finite set contains an object of type stair. Axes object 3 with title MV(2) continuous between [-2 2] contains an object of type stair.

The simulation results are identical as the ones achieved using the sim command.

See Also

Functions

Objects

Related Examples

More About