| [ Team LiB ] |
|
Appendix 16.3Use the following files to reproduce the van de Vusse simulations shown in Figure 16-9. These are based on an unconstrained DMC strategy. Files for the constrained formulation, involving qp and quadprog from the optimization toolbox, are available on the book web page. dmcsim.m
% dmcsim
%
% 26 Oct 00 - revised 4/5 Aug 01 for Chapter 16 - MPC
% b.w. bequette
% unconstrained DMC simulation, calls: smatgen.m and dmccalc.m
% currently contains van de vusse reactor model and plant
%
% MPC tuning and simulation parameters
n = 50; % model length
p = 10; % prediction horizon
m = 1; % control horizon
weight = 0.0; % weighting factor
ysp = 1; % setpoint change (from 0)
timesp = 1; % time of setpoint change
delt = 0.1; % sample time
tfinal = 6; % final simulation time
noise = 0; % noise added to response coefficients
%
t = 0:delt:tfinal; % time vector
kfinal = length(t); % number of time intervals
ksp = fix(timesp/delt);
r = [zeros(ksp,1);ones(kfinal-ksp,1)*ysp]; % setpoint vector
%
% ----- insert continuous model here -----------
% model (continuous state space form)
%
a = [-2.4048 0;0.8333 -2.2381]; % a matrix – van de vusse
b = [7; -1.117]; % b matrix – van de vusse
c = [0 1]; % c matrix – van de vusse
d = 0; % d matrix – van de vusse
sysc_mod = ss(a,b,c,d); % create LTI "object"
%
% ----- insert plant here -----------
% perfect model assumption (plant = model)
ap = a;
bp = b;
cp = c;
dp = d;
sysc_plant = ss(ap,bp,cp,dp);
%
% discretize the plant with a sample time, delt
%
sysd_plant = c2d(sysc_plant,delt)
[phi,gamma,cd,dd] = ssdata(sysd_plant)
%
% evaluate discrete model step response coefficients
%
[s] = step(sysc_mod,[delt:delt:n*delt]);
%
% generate dynamic matrices (both past and future)
%
[Sf,Sp,Kmat] = smatgen(s,p,m,n,weight);
%
% plant initial conditions
xinit = zeros(size(a,1),1);
uinit = 0;
yinit = 0;
% initialize input vector
u = ones(min(p,kfinal),1)*uinit;
%
dup = zeros(n-2,1);
sn = s(n); % last step response coefficient
x(:,1)= xinit;
y(1) = yinit;
dist(1) = 0;
%
% set-up is done, start simulations
%
for k = 1:kfinal;
%
du(k) = dmccalc(Sp,Kmat,sn,dup,dist(k),r(k),u,k,n);
% perform control calculation
if k > 1;
u(k) = u(k-1)+du(k); % control input
else
u(k) = uinit + du(k);
end
% plant equations
x(:,k+1) = phi*x(:,k)+gamma*u(k);
y(k+1) = cd*x(:,k+1);
% model prediction
if k-n+1>0;
ymod(k+1) = s(1)*du(k) + Sp(1,:)*dup + sn*u(k-n+1);
else
ymod(k+1) = s(1)*du(k) + Sp(1,:)*dup;
end
% disturbance compensation
%
dist(k+1) = y(k+1) - ymod(k+1);
% additive disturbance assumption
% put input change into vector of past control moves
dup = [du(k);dup(1:n-3)];
end
%
% stairs plotting for input (zero-order hold) and setpoint
%
[tt,uu] = stairs(t,u);
[ttr,rr] = stairs(t,r);
%
figure(1)
subplot(2,1,1)
plot(ttr,rr,'--',t,y(1:length(t)))
ylabel('y')
xlabel('time')
title('plant output')
subplot(2,1,2)
plot(tt,uu)
ylabel('u')
xlabel('time')
smatgen.m
function [Sf,Sp,Kmat] = smatgen(s,p,m,n,w)
%
% b.w. bequette
% 28 Sept 00, revised 2 Oct 00
% generates dynamic matrix and feedback gain matrix
% assumes s = step response column vector
% Sf = Dynamic Matrix for future control moves (forced)
% Sp = Matrix for past control moves (free)
% Kmat = DMC feedback gain matrix
% s = step response coefficient vector
% p = prediction horizon
% m = control horizon
% n = model horizon
% w = weight on control input
%
% first, find the dynamic matrix
for j = 1:m;
Sf(:,j) = [zeros(j-1,1);s(1:p-j+1)];
end
%
% now, find the matrix for past moves
%
for i = 1:p;
Sp(i,:) = [s(i+1:n-1)' zeros(1,i-1)];
end
%
% find the feedback gain matrix, Kmat
%
Kmat = inv(Sf'*Sf + w*eye(m))*Sf';
dmccalc.m
function [delu] = dmccalc(Sp,Kmat,sn,delup,d,r,u,k,n)
%
% for use with dmcsim.m
% b.w. bequette
% 2 oct 00
% calculate the optimum control move
%
% first, calculate uold = u(k-n+1)...u(k-n+p)
%
[m,p] = size(Kmat);
uold = zeros(p,1);
for i = 1:p;
if k-n+i>0;
uold(i) = u(k-n+i);
else
uold(i) = 0;
end
end
dvec = d*ones(p,1);
rvec = r*ones(p,1);
y_free = Sp*delup + sn*uold + dvec;
e_free = rvec-y_free;
delu = Kmat(1,:)*e_free;
|
| [ Team LiB ] |
|