В этом примере показано, как спроектировать прогнозирующий контроллер модели для мультивхода, мультивыводит нелинейный объект, заданный в Simulink®, и симулируют замкнутый цикл. Объект имеет три переменные, которыми управляют, и два измеренных выходных параметров.
Чтобы запустить этот пример, Simulink® и Simulink Control Design™ требуются.
% Check that both Simulink and Simulink Control Design are installed, % otherwise display a message and return 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
. Заметьте нелинейность 0.2*u(1)^3
от первого входа до первого выхода.
open('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'};
Обратите внимание на то, что, поскольку вы не задали измеренного или неизмеренного воздействия или любого неизмеренный выход, когда контроллер MPC создается на основе plant
, по умолчанию все входные параметры объекта приняты, чтобы быть переменными, которыми управляют, и всем объектом, выходные параметры приняты, чтобы быть измеренными выходными параметрами.
Создайте объект контроллера с выборкой периода, предсказания и управляйте горизонтами 0,2 секунд, 5 шагов и 2 перемещений, соответственно;
mpcobj = mpc(plant,0.2,5,2);
-->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]);
Отобразите объект MPC рассмотреть его свойства.
mpcobj
MPC object (created on 22-Jul-2021 21:29:28): --------------------------------------------- Sampling time: 0.2 (seconds) Prediction Horizon: 5 Control Horizon: 2 Plant Model: -------------- 3 manipulated variable(s) -->| 5 states | | |--> 2 measured output(s) 0 measured disturbance(s) -->| 3 inputs | | |--> 0 unmeasured output(s) 0 unmeasured disturbance(s) -->| 2 outputs | -------------- Disturbance and Noise Models: Output disturbance model: default (type "getoutdist(mpcobj)" for details) Measurement noise model: default (unity gain after scaling) Weights: ManipulatedVariables: [0 0 0] ManipulatedVariablesRate: [0.1000 0.1000 0.1000] OutputVariables: [1 1] ECR: 100000 State Estimation: Default Kalman Filter (type "getEstimator(mpcobj)" for details) Constraints: -3 <= Mass Flow (kg/s) <= 3, -1000 <= Mass Flow/rate (kg/s) <= Inf, Temperature (K) is unconstrained -2 <= Heat Flow (J/s) <= 2, -1000 <= Heat Flow/rate (J/s) <= Inf, Level (m) is unconstrained -2 <= Pressure (Pa) <= 2, -1000 <= Pressure/rate (Pa) <= Inf
Откройте существующую ранее модель Simulink для симуляции с обратной связью. Модель объекта управления идентична той, используемой для линеаризации, в то время как контроллер MPC реализован с контроллером MPC блок, который имеет объект MPC рабочей области mpcobj
как параметр. Ссылка для первого выхода является сигналом шага, повышающимся от нуля до одного для t=0, как только симуляция запускается. Ссылка для второго выхода
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);
Откройте существующую ранее модель Simulink для симуляции с обратной связью. Это идентично предыдущей модели замкнутого цикла, за исключением того, что ссылка для первого объекта, выход больше не является шагом, а пандусом, сигнализирует что повышения с наклоном 0,2 после 3 секунд.
mdl2 = 'mpc_nonlinear_setoutdist';
open_system(mdl2)
Запустите симуляцию замкнутого цикла в течение 12 секунд.
sim(mdl2,12)
-->Converting model to discrete time. -->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.
Когда ограничения не активны, контроллер MPC ведет себя как линейный контроллер. Симулируйте две версии неограниченного контроллера MPC в замкнутом цикле, чтобы проиллюстрировать этот факт.
Во-первых, удалите ограничения из mcpobj
.
mpcobj.MV = [];
Затем сбросьте выходное возмущение, чтобы принять значение по умолчанию, (это только сделано, чтобы получить более простую версию линейного контроллера MPC на следующем шаге).
setoutdist(mpcobj,'integrators');
Преобразуйте неограниченный контроллер MPC в пространство состояний линейного независимого от времени (LTI) динамическая система, имея векторный [ym;r]
как введено, где ym
вектор из измеренных выходных сигналов (на данном шаге), и r
вектор из выходных ссылок (на том же данном шаге).
LTI = ss(mpcobj,'r'); % use reference as additional input signal
-->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.
Откройте существующую ранее модель Simulink для симуляции с обратной связью. Блок "ссылок" содержит два сигнала шага (действующий после 4 и 0 секунд, соответственно), которые используются в качестве ссылки. Блок "MPC control loop" эквивалентен первому замкнутому циклу, за исключением того, что опорные сигналы предоставляются ему, как введено. Блок "Linear control loop" эквивалентен блоку "MPC control loop" за исключением того, что контроллер является блоком LTI, имеющим рабочую область ss
объект LTI
как параметр.
refs = [1;1]; % set values for step signal references mdl3 = 'mpc_nonlinear_ss'; open_system(mdl3)
Запустите симуляцию замкнутого цикла в течение 12 секунд.
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.68434e-14 The MPC controller and the linear controller produce the same closed-loop trajectories.
Как ожидалось существует только незначительное различие из-за числовых ошибок.
Закройте все открытые модели Simulink, не сохраняя изменения.
bdclose all