Этот пример показывает, как разработать образцовый прогнозирующий контроллер для нелинейного объекта мультивывода мультивхода. Объект имеет 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" и линеаризуется в условиях работы по умолчанию с помощью "линеаризовать" команды от 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) % Open Simulink Model sim(mdl1); % Start Simulation
-->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) % Open Simulink Model sim(mdl2); % Start Simulation
-->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) % Open Simulink(R) Model sim(mdl3); % Start Simulation
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 | MPC Designer | mpc