How can I get the 'y_hat' and 'u' prediction values from my Model Predictive Controller in Simulink in Model Predictive Control Toolbox 3.1.1 (R2009b)?

3 views (last 30 days)
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.

Accepted Answer

MathWorks Support Team
MathWorks Support Team on 15 Feb 2021
Edited: MathWorks Support Team on 17 Feb 2021
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
  1 Comment
Jakobus Louw
Jakobus Louw on 28 Oct 2020
For those still coming to this thread:
You can simulate the MPC in Simulink first and then run through the simulation data step by step in MATLAB to analyse what the predictions were at each time step with "mpcmove".
Put "To Worspace" blocks in simulink to record mo, mv and ref. Set the "To Worspace" block sample time to the same sample time as the MPC
mo_data = out.mo.Data';
mv_data = out.mv.Data';
ref_data = out.ref.Data';
N = size(mo_data,2); % Number of data samples
x_mpc = mpcstate(mpc_drone_2d); % Current state of mpc
v = []; % No measured distrubances
for k = 1:N % every timestep k
ym = mo_data(:, k); % Current measurement vector
r = ref_data(:, k); % Current reference
[mv, info] = mpcmove(mpc_drone_2d, x_mpc, ym, r, v);
% Extract the data you need from info here
end

Sign in to comment.

More Answers (0)

Products


Release

R2009b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!