Этот пример показывает, как спроектировать прогнозирующий контроллер модели для нелинейного объекта с мультивходами и моделировать замкнутый цикл в Simulink. Объект имеет 3 манипулированные переменные и 2 измеренных выхода.
Чтобы запустить этот пример, требуются Design™ Simulink ® и Simulink Control.
% 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 Toolbox.
plant = linearize('mpc_nonlinmodel');
Присвойте имена переменным ввода-вывода.
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 27-Jan-2021 07:35:32): --------------------------------------------- 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 для симуляции замкнутой системы. Блок «references» содержит два сигнала шага (действующий через 4 и 0 секунд, соответственно), которые используются в качестве ссылки. Блок «MPC управлению цикла» эквивалентен первому закрытому циклу, за исключением того, что опорные сигналы подаются на него как на вход. Блок «Linear цикл управления» эквивалентен блоку «MPC управление 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|| = 9.5904e-15 The MPC controller and the linear controller produce the same closed-loop trajectories.
Как и ожидалось, существует лишь незначительное различие из-за числовых ошибок.
Закройте все открытые модели Simulink, не сохраняя никаких изменений.
bdclose all
mpc
| MPC Controller | MPC Designer