MATLAB: How to get the ‘y_hat’ and ‘u’ prediction values from the Model Predictive Controller in Simulink in Model Predictive Control Toolbox 3.1.1 (R2009b)

controlhorizonmodelModel Predictive Control Toolboxpredictionpredictive

I have designed my MPC object using the MPC toolbox. I can simulate this with the command SIM but I would like the y_hat and u prediction values at each step along the way.

Best Answer

It is not possible to get the 'y_hat' and 'u' prediction values from the MPC controller block in Simulink. This functionality is not available in Model Predictive Control Toolbox 3.1.1 (R2009b). You can, however, get this information via simulation in MATLAB using the MPCMOVE function in a step by step method as outlined below:
% Open-loop system parameters
% True plant and true initial state
sys = ss(tf({1,1,1},{[1 .5 1],[1 1],[.7 .5 1]}));
x0 = [0 0 0 0 0]';
% MPC object setup
Ts = 0.2; % sampling time
% Define type of input signals
sys.InputGroup=struct('Manipulated',1,'Measured',2,'Unmeasured',3);
% Define constraints on manipulated variable
MV = struct('Min', 0, 'Max', 1);
Model = []; % Reset structure Model
Model.Plant = sys;
% Integrator driven by white noise with variance=1000
Model.Disturbance = tf(sqrt(1000), [1 0]);
p = []; % Prediction horizon (take default one)
m = 3; % Control horizon
weights = []; % Default value for weights
MPCobj = mpc(Model, Ts, p, m, weights, MV);
% Simulate closed loop system using MPCMOVE
Tstop = 30; %Simulation time
xmpc = mpcstate(MPCobj); % Initial state of MPC controller
x = x0; % Initial state of Plant
r = 1; % Output reference trajectory
% State-space matrices of Plant model
[A, B, C, D] = ssdata(c2d(sys, Ts));
YY = [];
XX = [];
RR = [];
for t = 0:round(Tstop/Ts)-1
XX=[XX, x];
% Define measured disturbance signal
v = 0;
if t*Ts>=10
v=1;
end
% Define unmeasured disturbance signal
d=0;
if t*Ts>=20
d=-0.5;
end
% Plant equations: output update
% (note: no feedrthrough from MV to Y, D(:,1)=0)
y = C*x+D(:,2)*v+D(:,3)*d;
YY = [YY, y];
% Compute MPC law
[u, info] = mpcmove(MPCobj, xmpc, y, r, v);
info %here is where you can collect all of the states in update.
% Plant equations: state update
x = A*x+B(:, 1)*u+B(:, 2)*v+B(:, 3)*d;
end
% Plot results
plot(0:Ts:Tstop-Ts, YY);
grid
Related Question