%%%%%% Define constraint matrices for GPC (no output constraints)
%%%%%% CC*Du(future) - dd - dd1*u(k) <= 0
%%%%%%
%%%%%% Dumax is limits on input increments (symetrical)
%%%%%% umax and umin are limits on the inputs
%%%%%% nu is the control horizon
%%%%%% sizeu is the number of inputs
%%%%%%
%%%%%% [CC,dd,dd1] = mpc_constraints(Dumax,umax,umin,sizeu,nu);
%%
%% Author: J.A. Rossiter (email: J.A.Rossiter@shef.ac.uk)
function [CC,dd,dd1] = mpc_constraints(Dumax,umax,umin,sizeu,nu);
%%%% Set up constraints for each loop in turn
for j=1:sizeu;
d(1:2*nu,j) = ones(2*nu,1)*Dumax(j);
C(1:nu,1:nu,j) = eye(nu);
C(nu+1:2*nu,1:nu,j) = -eye(nu);
d(2*nu+1:4*nu,j) = [ones(nu,1)*umax(j);-ones(nu,1)*umin(j)];
C(2*nu+1:3*nu,1:nu,j) = tril(ones(nu,nu));
C(3*nu+1:4*nu,1:nu,j) = -tril(ones(nu,nu));
d1(2*nu+1:4*nu,j) = [-ones(nu,1);ones(nu,1)];
end
%%%% Combine loop constraints into single inequality condition
for i=1:sizeu;
CC(i:sizeu:4*sizeu*nu,i:sizeu:nu*sizeu) = C(:,:,i);
dd(i:sizeu:4*sizeu*nu,1) = d(1:4*nu,i);
dd1(i:sizeu:4*sizeu*nu,i) = d1(1:4*nu,i);
end