⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 basicmpc.m

📁 一个简单的预测控制例子
💻 M
字号:
%BASICMPC Basic Predictive Control without constraints. (Script file)%% Implements unconstrained MPC for stable SISO discrete-time system % defined as LTI object.%% The following are editable parameters (most have defaults):% Tref: Time constant of exponential reference trajectory% Ts:   Sampling interval % plant: Plant definition  (discrete-time SISO LTI object)% model: Model definition  (discrete-time SISO LTI object)% P: Vector of coincidence points% M: Control horizon% tend: Duration of simulation% setpoint: Setpoint trajectory (column vector) - length must exceed%           no of steps in simulation by at least max(P).% umpast, uppast, ympast, yppast: Initial conditions of plant & model.%% Assumes Matlab 5.3. Uses Control Toolbox LTI object class. % No other toolboxes required.%% J.M.Maciejowski, 8 March 1999. Revised 22.3.99, 15.12.99.%% Copyright(C) 1999. All Rights Reserved.%% Cambridge University Engineering Department.%%%%%%%%%%%%%%%%% PROBLEM DEFINITION:% Define time-constant of reference trajectory Tref:Tref = 6;% Define sampling interval Ts (default Tref/10):if Tref == 0,  Ts = 1;else  Ts = Tref/10;end% Define plant as SISO discrete-time 'lti' object 'plant'%%%%%  CHANGE FROM  HERE TO DEFINE NEW PLANT %%%%%nump=1;denp=[1,-1.4,0.45];plant = tf(nump,denp,Ts);%%%%%  CHANGE UP TO HERE TO DEFINE NEW PLANT  %%%%%plant = tf(plant);  % Coerce to transfer function formnump = get(plant,'num'); nump = nump{:}; % Get numerator polynomialdenp = get(plant,'den'); denp = denp{:}; % Get denominator polynomialnnump = length(nump)-1; % Degree of plant numeratorndenp = length(denp)-1; % Degree of plant denominatorif nump(1)~=0, error('Plant must be strictly proper'), end;if any(abs(roots(denp))>1), disp('Warning: Unstable plant'), end% Define model as SISO discrete-time 'lti' object 'model' % (default model=plant):%%%%%  CHANGE FROM  HERE TO DEFINE NEW MODEL %%%%%model = plant;%%%%%  CHANGE UP TO HERE TO DEFINE NEW MODEL  %%%%%model = tf(model);  % Coerce to transfer function formnumm = get(model,'num'); numm = numm{:}; % Get numerator polynomialdenm = get(model,'den'); denm = denm{:}; % Get denominator polynomialnnumm = length(numm)-1; % Degree of model numeratorndenm = length(denm)-1; % Degree of model denominatorif numm(1)~=0, error('Model must be strictly proper'), end;if any(abs(roots(denm))>1), disp('Warning: Unstable model'), endnump=[zeros(1,ndenp-nnump-1),nump]; % Pad numerator with leading zerosnumm=[zeros(1,ndenm-nnumm-1),numm]; % Pad numerator with leading zeros% Define prediction horizon P (steps)(default corresponds to 0.8*Tref):if Tref == 0,  P = 5;else  P = round(0.8*Tref/Ts);end% Define control horizon (default 1):M = 1;% Compute model step response values over coincidence horizon:stepresp = step(model,[0:Ts:max(P)*Ts]);theta = zeros(length(P),M);for j=1:length(P),  theta(j,:) = [stepresp(P(j):-1:max(P(j)-M+1,1))',zeros(1,M-P(j))];endS = stepresp(P);% Compute reference error factor at coincidence points:% (Exponential approach of reference trajectory to set-point)if Tref == 0,  % Immediate jump back to set-point trajectory  errfac = zeros(length(P),1);else  errfac = exp(-P*Ts/Tref);end%%%%%%%%%%%%%%%% SIMULATION PARAMETERS:if Tref == 0,  tend = 100*Ts;else  tend = 10*Tref; % Duration of simulation (default 10*Tref)endnsteps = floor(tend/Ts); % (Number of steps in simulation).tvec = (0:nsteps-1)'*Ts; % Column vector of time points (first one 0)% Define set-point (column) vector (default constant 1):setpoint = ones(nsteps+max(P),1);% Define vectors to hold input and output signals, initialised to 0:uu = zeros(nsteps,1); % Inputyp = zeros(nsteps,1); % Plant Outputym = zeros(nsteps,1); % Model Output% Initial conditions:umpast = zeros(ndenm,1);uppast = zeros(ndenp,1);ympast = zeros(ndenm,1);  % For model responseyppast = zeros(ndenp,1);  % For plant response%%%%%%%%%%%%%%%% SIMULATION:for k=1:nsteps,  % Define reference trajectory at coincidence points:  errornow = setpoint(k)-yp(k);  reftraj = setpoint(k+P) - errornow*errfac;  % Free response of model over prediction horizon:  yfpast = ympast;  ufpast = umpast;  for kk=1:max(P), % Prediction horizon    ymfree(kk) = numm(2:nnumm+1)*ufpast-denm(2:ndenm+1)*yfpast;    yfpast=[ymfree(kk);yfpast(1:length(yfpast)-1)];	ufpast=[ufpast(1);ufpast(1:length(ufpast)-1)];  end    % Compute input signal uu(k):  if k>1,    dutraj = theta\(reftraj-ymfree(P)');    uu(k) = dutraj(1) + uu(k-1);    else	dutraj = theta\(reftraj-ymfree(P)');	uu(k) = dutraj(1) + umpast(1);  end    % Simulate plant:  % Update past plant inputs  uppast = [uu(k);uppast(1:length(uppast)-1)];  yp(k+1) = -denp(2:ndenp+1)*yppast+nump(2:nnump+1)*uppast; % Simulation  % Update past plant outputs  yppast = [yp(k+1);yppast(1:length(yppast)-1)];  % Simulate model:  % Update past model inputs  umpast = [uu(k);umpast(1:length(umpast)-1)];  ym(k+1) = -denm(2:ndenm+1)*ympast+numm(2:nnumm+1)*umpast;  % Simulation  % Update past model outputs  ympast = [ym(k+1);ympast(1:length(ympast)-1)];end % of simulation%%%%%%%%%%%%%%%% PRESENTATION OF RESULTS:disp('***** Results from script file BASICMPC :')disp(['Tref = ',num2str(Tref),',  Ts = ',num2str(Ts),...	  '  P = ',int2str(P'),' (steps),  M = ',int2str(M)])diffpm = get(plant-model,'num');if diffpm{:}==0,  disp('Model = Plant')else  disp('Plant-Model mismatch')endfiguresubplot(211)% Plot output, solid line and set-point, dashed line:plot(tvec,yp(1:nsteps),'-',tvec,setpoint(1:nsteps),'--');grid; title('Plant output (solid) and set-point (dashed)')xlabel('Time')subplot(212)% plot input signal as staircase graph:stairs(tvec,uu,'-');grid; title('Input')xlabel('Time')

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -