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)
Show older comments
MathWorks Support Team
on 29 Jan 2010
Edited: MathWorks Support Team
on 17 Feb 2021
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
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
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
More Answers (0)
See Also
Categories
Find more on Linear Plant Specification in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!