No BSD License  

Highlights from
Model-based Predictive Control: A Practical Approach

mpc_constraints.m
%%%%%%   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

Contact us at files@mathworks.com