Этот пример показывает, как спроектировать прогнозирующий контроллер модели с перспективой (предварительный просмотр) на эталонных и измеренных траекториях нарушения порядка.
Определите модель объекта управления как линейную систему инвариантов времени с двумя входами (одна манипулируемая переменная и одно измеренное нарушение порядка) и одним выходом.
plant = ss(tf({1,1},{[1 .5 1],[1 1]}),'min');
Получите матрицы пространства состояний модели объекта управления и задайте начальное условие.
[A,B,C,D] = ssdata(plant);
Ts = 0.2; % Sample time
[Ad,Bd,Cd,Dd] = ssdata(c2d(plant,Ts));
x0 = [0;0;0];
Задайте тип входных сигналов.
plant = setmpcsignals(plant,'MV',1,'MD',2);
Создайте объект MPC.
p = 20; % prediction horizon m = 10; % control horizon mpcobj = mpc(plant,Ts,p,m); % Specify MV constraints. mpcobj.MV = struct('Min',0,'Max',2); % Specify weights mpcobj.Weights = struct('MV',0,'MVRate',0.1,'Output',1);
-->The "Weights.ManipulatedVariables" property of "mpc" object is empty. Assuming default 0.00000. -->The "Weights.ManipulatedVariablesRate" property of "mpc" object is empty. Assuming default 0.10000. -->The "Weights.OutputVariables" property of "mpc" object is empty. Assuming default 1.00000.
Запустим симуляцию с обратной связью в MATLAB.
Tstop = 30; % simulation time. time = (0:Ts:(Tstop+p*Ts))'; % time vector r = double(time>10); % reference signal v = -double(time>20); % measured disturbance signal
Объект MPCSIMOPT используется для включения функции предварительного просмотра во время симуляции замкнутой системы.
params = mpcsimopt(mpcobj); params.MDLookAhead='on'; params.RefLookAhead='on';
Симулируйте в MATLAB с командой SIM.
YY1 = sim(mpcobj,Tstop/Ts+1,r,v,params);
-->Converting model to discrete time. -->Assuming output disturbance added to measured output channel #1 is integrated white noise. -->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.
Сохраните траектории MPC с обратной связью.
YY2 = [];
% Use MPCSTATE object to specify the initial state of MPC
x = x0;
xmpc = mpcstate(mpcobj);
Запустите цикл симуляции
for ct=0:round(Tstop/Ts), % Plant equations: output update y = C*x + D(:,2)*v(ct+1); % Store signals YY2 = [YY2,y]; %#ok<*AGROW> % Compute MPC law. Extracts references r(t+1),r(t+2),...,r(t+p) and % measured disturbances v(t),v(t+1),...,v(t+p) for previewing. u = mpcmove(mpcobj,xmpc,y,r(ct+2:ct+p+1),v(ct+1:ct+p+1)); % Plant equations: state update x = Ad*x+Bd(:,1)*u+Bd(:,2)*v(ct+1); end
Постройте график результатов.
figure t = 0:Ts:Tstop; plot(t,r(1:length(t)),'c:',t,YY1,'r-',t,YY2,'bo'); xlabel('Time'); ylabel('Plant Output'); legend({'Reference';'From SIM command';'From MPCMOVE command'},'Location','SouthEast'); grid
Ответы идентичны.
Оптимальные предсказанные траектории возвращаются MPCMOVE. Предположим, что вы начинаете с текущего состояния и имеете изменение заданной точки на 0,5 за 5 шагов, и предположим, что измеренное нарушение порядка исчезло.
r1 = [ones(5,1);0.5*ones(p-5,1)]; v1 = zeros(p+1,1); [~,Info] = mpcmove(mpcobj,xmpc,y,r1(1:p),v1(1:p+1));
Извлеките оптимальные предсказанные траектории и постройте их график.
topt = Info.Topt; yopt = Info.Yopt; uopt = Info.Uopt; figure subplot(211) title('Optimal sequence of predicted outputs') stairs(topt,yopt); grid axis([0 p*Ts -2 2]); subplot(212) title('Optimal sequence of manipulated variables') stairs(topt,uopt); axis([0 p*Ts -2 2]); grid
Когда ограничения не активны, контроллер MPC ведет себя как линейный контроллер. Можно получить форму пространства состояний контроллера MPC с y, [r (t + 1); r (t + 2);...; r (t + p)] и [v (t); v (t + 1);...; v (t + p)] в качестве входов контроллера.
Получите матрицы пространства состояний линеаризированного контроллера.
LTI = ss(mpcobj,'rv','on','on'); [AL,BL,CL,DL] = ssdata(LTI);
Сохраните траектории MPC с обратной связью в массивах YY, RR.
YY3 = [];
% Setup initial state of the MPC controller
x = x0;
xL = [x0;0;0];
Запустите основной цикл симуляции
for ct=0:round(Tstop/Ts), % Plant output update y = Cd*x + Dd(:,2)*v(ct+1); % Save output and refs value YY3 =[YY3,y]; % Compute the linear MPC control action u = CL*xL + DL*[y;r(ct+2:ct+p+1);v(ct+1:ct+p+1)]; % Note that the optimal move provided by MPC would be: mpcmove(MPCobj,xmpc,y,ref(t+2:t+p+1),v(t+1:t+p+1)); % Plant update x = Ad*x + Bd(:,1)*u + Bd(:,2)*v(ct+1); % Controller update xL = AL*xL + BL*[y;r(ct+2:ct+p+1);v(ct+1:ct+p+1)]; end
Постройте график результатов.
figure plot(t,r(1:length(t)),'c:',t,YY3,'r-'); xlabel('Time'); ylabel('Plant Output'); legend({'Reference';'Unconstrained MPC'},'Location','SouthEast'); grid
Чтобы запустить этот пример, требуется Simulink ®.
if ~mpcchecktoolboxinstalled('simulink') disp('Simulink(R) is required to run this example.') return end time = (0:Ts:(Tstop+p*Ts))'; % time vector r = double(time>10); % reference signal v = -double(time>20); % measured disturbance signal % Define the reference signal in structure ref.time = time; ref.signals.values = r; % Define the measured disturbance md.time = time; md.signals.values = v; % Open Simulink model mdl = 'mpc_preview'; open_system(mdl) % Start simulation sim(mdl,Tstop);
Постройте график результатов.
figure t = 0:Ts:Tstop; plot(t,r(1:length(t)),'c:',t,YY1,'r-',t,YY2,'bo',t,ySL,'gx'); xlabel('Time'); ylabel('Plant Output'); legend({'Reference';'From SIM command';'From MPCMOVE command';'From Simulink'},'Location','SouthEast'); grid
Ответы идентичны.
bdclose('mpc_preview')