В этом примере показано, как спроектировать прогнозирующий контроллер модели для нелинейного объекта мультивыхода мультивхода. Объект имеет 3 переменные, которыми управляют, и 2 измеренных выходных параметров.
Чтобы запустить этот пример, Simulink® и Simulink Control Design™ требуются.
if ~mpcchecktoolboxinstalled('simulink') disp('Simulink(R) is required to run this example.') return end if ~mpcchecktoolboxinstalled('slcontrol') disp('Simulink Control Design(R) is required to run this example.') return end
Нелинейный объект реализован в модели Simulink mpc_nonlinmodel
и линеаризовавший в условиях работы по умолчанию с помощью linearize
команда от Simulink Control Design.
plant = linearize('mpc_nonlinmodel');
Присвойте имена к переменным I/O.
plant.InputName = {'Mass Flow';'Heat Flow';'Pressure'}; plant.OutputName = {'Temperature';'Level'}; plant.InputUnit = {'kg/s' 'J/s' 'Pa'}; plant.OutputUnit = {'K' 'm'};
Создайте объект контроллера с выборкой периода, прогноза и управляйте горизонтами:
Ts = 0.2; p = 5; m = 2; mpcobj = mpc(plant,Ts,p,m);
-->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.
Задайте ограничения мВ.
mpcobj.MV = struct('Min',{-3;-2;-2},'Max',{3;2;2},'RateMin',{-1000;-1000;-1000});
Задайте веса на которыми управляют и управляемых переменных.
mpcobj.Weights = struct('MV',[0 0 0],'MVRate',[.1 .1 .1],'OV',[1 1]);
Запустите симуляцию.
mdl1 = 'mpc_nonlinear';
open_system(mdl1)
sim(mdl1)
-->Converting model to discrete time. -->Assuming output disturbance added to measured output channel #1 is integrated white noise. -->Assuming output disturbance added to measured output channel #2 is integrated white noise. -->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.
Для того, чтобы отследить пандус, тройной интегратор задан как выходное возмущение на обоих выходных параметрах.
outdistmodel = tf({1 0;0 1},{[1 0 0 0],1;1,[1 0 0 0]});
setoutdist(mpcobj,'model',outdistmodel);
Запустите симуляцию.
mdl2 = 'mpc_nonlinear_setoutdist';
open_system(mdl2)
sim(mdl2)
-->Converting model to discrete time. -->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.
Когда ограничения не активны, контроллер MPC ведет себя как линейный контроллер.
mpcobj.MV = [];
Сбросьте выходное возмущение, чтобы принять значение по умолчанию
setoutdist(mpcobj,'integrators');
Вход к линейному LTI контроллера является вектором [ym; r], где ym является вектором измеренных выходных параметров, и r является вектором выходных ссылок.
LTI = ss(mpcobj,'r');
-->Converting model to discrete time. -->Assuming output disturbance added to measured output channel #1 is integrated white noise. -->Assuming output disturbance added to measured output channel #2 is integrated white noise. -->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.
Запустите симуляцию.
refs = [1;1]; % output references are step signals mdl3 = 'mpc_nonlinear_ss'; open_system(mdl3) sim(mdl3)
fprintf('Compare output trajectories: ||ympc-ylin|| = %g\n',norm(ympc-ylin)); disp('The MPC controller and the linear controller produce the same closed-loop trajectories.');
Compare output trajectories: ||ympc-ylin|| = 1.50163e-14 The MPC controller and the linear controller produce the same closed-loop trajectories.
bdclose(mdl1) bdclose(mdl2) bdclose(mdl3)
MPC Controller | MPC Designer | mpc