Моделируйте прогнозирующее управление нелинейным объектом с мультивходами с мультивыходами

Этот пример показывает, как спроектировать прогнозирующий контроллер модели для нелинейного объекта с мультивходами и моделировать замкнутый цикл в 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, по умолчанию все входы объекта управления приняты как управляемые переменные, а все выходы объекта - как измеренные выходы.

Проектирование контроллера MPC

Создайте объект контроллера с периодом дискретизации, горизонтами предсказания и управления 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

Откройте ранее существовавшую модель 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.

Несмотря на наличие нелинейности, оба выхода хорошо отслеживают свои ссылки через несколько секунд, в то время как, как ожидалось, манипулируемые переменные остаются в пределах предустановленных жестких ограничений.

Измените проект MPC, чтобы отслеживать сигналы пандуса

В порядок, чтобы отследить наклон при компенсации нелинейности, задайте модель возмущения на обоих выходах как тройной интегратор (без нелинейности будет достаточно двойного интегратора).

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

См. также

| |

Похожие темы