Understanding Control Behavior by Examining Optimal Control Sequence
This example shows how to inspect the optimized sequence of manipulated variables computed by a model predictive controller at each sample time.
The plant is a double integrator subject to input saturation.
Design MPC Controller
The basic setup of the MPC controller includes:
A double integrator as the prediction model
A prediction horizon of
20
A control horizon of
10
Input constraints
-1 <= u(t) <= 1
Specify the MPC controller.
Ts = 0.1; p = 20; m = 10; mpcobj = mpc(tf(1,[1 0 0]),Ts,p,m); mpcobj.MV = struct('Min',-1,'Max',1); nu = 1;
-->"Weights.ManipulatedVariables" is empty. Assuming default 0.00000. -->"Weights.ManipulatedVariablesRate" is empty. Assuming default 0.10000. -->"Weights.OutputVariables" is empty. Assuming default 1.00000.
Simulate Model in Simulink
To run this example, Simulink® is required.
if ~mpcchecktoolboxinstalled('simulink') disp('Simulink is required to run this example.') return end
Open the Simulink model, and run the simulation.
mdl = 'mpc_sequence';
open_system(mdl)
sim(mdl)
-->Converting the "Model.Plant" property to state-space. -->Converting model to discrete time. Assuming no disturbance added to measured output #1. -->"Model.Noise" is empty. Assuming white noise on each measured output.
The MPC Controller block has an mv.seq
output port, which is enabled by selecting the Optimal control sequence block parameter. This port outputs the optimal control sequence computed by the controller at each sample time. The output signal is an array with p
+1 rows and Nmv
columns, where p
is prediction horizon and Nmv
is the number of manipulated variables.
In a similar manner, the controller can output the optimal state sequence (x.seq
) and the optimal output sequence (y.seq
).
When the simulation stops, the To Workspace
block connected to the mv.seq
port exports this control sequence to the MATLAB® workspace, logging the data in the variable useq
.
Analyze Optimal Control Sequences
Plot the optimal control sequence at specific time instants.
times = [0 0.2 1 2 2.1 2.2 3 3.5 5]; figure('Name','Optimal sequence history') for t = 1:9 ct = times(t)*10+1; subplot(3,3,t) h = stairs(0:p,useq.signals.values(ct,:)); h.LineWidth = 1.5; hold on plot((0:p)+.5,useq.signals.values(ct,:),'*r') xlabel('prediction step') ylabel('u') title(sprintf('Sequence (t=%3.1f)',useq.time(ct))) grid axis([0 p -1.1 1.1]) hold off end
The MPC controller uses the first two seconds to bring the output very close to the set point. The controller output is at the upper limit (+1) for one second and switches to the lower limit (-1) for the next second, which is the best control strategy under the input constraints.
bdclose(mdl)
See Also
Blocks
Related Examples
- Design MPC Controller at the Command Line
- Model Predictive Control of Multi-Input Single-Output Plant