В этом примере показано, как использовать блок Multiple MPC Controllers и блок Multiple Explicit MPC Controllers для реализации запланированного управления MPC нелинейной установки.
Система состоит из двух масс M1 и M2 соединены с двумя пружинами k1 и k2 соответственно. Столкновение предполагается совершенно неэластичным. M1 массы натягивается силой F, которая является управляемой переменной. Цель состоит в том, чтобы сделать положение массы M1 y1 дорожкой заданной привязки r.
Динамика двоякая: когда массы оторваны, M1 свободно перемещается. В противном случае M1 и M2 двигаться вместе. Мы предполагаем, что только M1 для обратной связи доступны датчик положения и контактный датчик. Последний используется для переключения контроллеров MPC. Обратите внимание, что положение и скорость масс M2 не управляемы.
/-----\ k1 ||
F <--- | M1 |----/\/\/\-------------[|| wall
|| | |---/ ||
|| k2 \-/ /----\ ||
wall||]--/\/\/\-------------------| M2 | ||
|| \----/ ||
|| ||
----yeq2------------------ y1 ------ y2 ----------------yeq1----> y axisМодель представляет собой упрощенный вариант модели, предложенный в [1].
M1 = 1; % mass M2 = 5; % mass k1 = 1; % spring constant k2 = 0.1; % spring constant b1 = 0.3; % friction coefficient b2 = 0.8; % friction coefficient yeq1 = 10; % wall mount position yeq2 = -10; % wall mount position
Модели установок в пространстве состояний для этих примеров имеют следующие входные и выходные сигналы:
Положение и скорость масс M1
Управляемая переменная: Сила вытягивания F
Измеренное возмущение: Постоянное значение 1 который калибрует силу пружины до правильного значения
Измеренный выходной сигнал: Положение массы M1
Определение модели состояния-пространства M1 когда массы не соприкасаются.
A1 = [0 1;-k1/M1 -b1/M1];
B1 = [0 0;-1/M1 k1*yeq1/M1];
C1 = [1 0];
D1 = [0 0];
sys1 = ss(A1,B1,C1,D1);
sys1 = setmpcsignals(sys1,'MD',2);
-->Assuming unspecified input signals are manipulated variables.
Определите модель состояния-пространства, когда две массы находятся в контакте.
A2 = [0 1;-(k1+k2)/(M1+M2) -(b1+b2)/(M1+M2)];
B2 = [0 0;-1/(M1+M2) (k1*yeq1+k2*yeq2)/(M1+M2)];
C2 = [1 0];
D2 = [0 0];
sys2 = ss(A2,B2,C2,D2);
sys2 = setmpcsignals(sys2,'MD',2);
-->Assuming unspecified input signals are manipulated variables.
Укажите время выборки контроллера Ts, горизонт прогнозирования pи горизонт управления m.
Ts = 0.2; p = 20; m = 1;
Спроектируйте первый контроллер MPC для случая, когда масса M1 отсоединяет от M2.
MPC1 = mpc(sys1,Ts,p,m); MPC1.Weights.OV = 1;
-->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.
Задайте ограничения для управляемой переменной.
MPC1.MV = struct('Min',0,'Max',30,'RateMin',-10,'RateMax',10);
Спроектируйте второй контроллер MPC для случая, когда массы M1 и M2 вместе.
MPC2 = mpc(sys2,Ts,p,m); MPC2.Weights.OV = 1;
-->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.
Задайте ограничения для управляемой переменной.
MPC2.MV = struct('Min',0,'Max',30,'RateMin',-10,'RateMax',10);
Моделирование управления MPC по расписанию усиления с использованием блока Multiple MPC Controllers, который переключается между MPC1 и MPC2.
% To run this example, Simulink(R) is required. if ~mpcchecktoolboxinstalled('simulink') disp('Simulink is required to run this example.') return end
Откройте и настройте модель.
y1initial = 0; % Initial position of M1 y2initial = 10; % Initial position of M2 mdl = 'mpc_switching'; open_system(mdl) if exist('animationmpc_switchoff','var') && animationmpc_switchoff close_system([mdl '/Animation']) clear animationmpc_switchoff end

Моделирование модели.
open_system([mdl '/signals'])
sim(mdl)
MPC1saved = MPC1;
MPC2saved = MPC2;
-->Converting model to discrete time. -->Assuming output disturbance added to measured output channel #1 is integrated white noise. -->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel. -->Converting model to discrete time. -->Assuming output disturbance added to measured output channel #1 is integrated white noise. -->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel. -->Converting model to discrete time. -->Assuming output disturbance added to measured output channel #1 is integrated white noise. -->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.


Использование двух контроллеров обеспечивает удовлетворительную производительность при любых условиях.
MPC1 ТолькоПовторите моделирование, предполагая, что массы никогда не соприкасаются; то есть с использованием только контроллера MPC1.
MPC1 = MPC1saved; MPC2 = MPC1saved; sim(mdl)


В этом случае производительность снижается при каждом соединении двух масс.
MPC2 ТолькоПовторите моделирование, предполагая, что массы всегда находятся в контакте; то есть с использованием только контроллера MPC2.
MPC1 = MPC2saved; MPC2 = MPC2saved; sim(mdl)


В этом случае производительность ухудшается, когда массы отделяются, что приводит к тому, что контроллер прикладывает чрезмерную силу.
bdclose(mdl); close(findobj('Tag','mpc_switching_demo'));
Чтобы уменьшить вычислительные усилия в оперативном режиме, можно создать явный контроллер MPC для каждого рабочего условия и реализовать явное управление MPC по расписанию усиления с помощью блока «Несколько явных контроллеров MPC».
Чтобы создать явный MPC-контроллер, сначала определите рабочие диапазоны для состояний контроллера, входных сигналов и опорных сигналов. Создайте явный объект диапазона MPC с помощью соответствующего традиционного контроллера, MPC1.
range = generateExplicitRange(MPC1saved);
Укажите диапазоны для состояний контроллера. Оба MPC1 и MPC2 содержат состояния для:
Положение и скорость масс M1
Интегратор из модели выходного возмущения по умолчанию
range.State.Min(:) = [-10;-8;-3]; range.State.Max(:) = [10;8;3];
По возможности используйте свои знания о заводе для определения диапазонов состояний. Однако может быть трудно, когда состояние не соответствует физическому параметру, например, для состояния модели выходного возмущения. В этом случае собирать информацию о дальности с помощью моделирования с использованием типичных опорных сигналов и сигналов возмущения. Для этой системы можно активировать дополнительный est.state outport блока Multiple MPC Controllers и просмотр оценочных состояний с использованием области. При моделировании ответов контроллера используйте опорный сигнал, охватывающий ожидаемый рабочий диапазон.
Определите диапазон для опорного сигнала. Выберите опорный диапазон, который меньше M1 диапазон положения.
range.Reference.Min = -8; range.Reference.Max = 8;
Задайте диапазон манипулируемых переменных, используя определенные ограничения СН.
range.ManipulatedVariable.Min = 0; range.ManipulatedVariable.Max = 30;
Определите диапазон для измеренного сигнала возмущения. Так как измеренное возмущение является постоянным, укажите небольшой диапазон вокруг постоянного значения, 1.
range.MeasuredDisturbance.Min = 0.9; range.MeasuredDisturbance.Max = 1.1;
Создать явный контроллер MPC, соответствующий MPC1 с использованием указанного объекта диапазона.
expMPC1 = generateExplicitMPC(MPC1saved,range);
Regions found / unexplored: 4/ 0
Создать явный контроллер MPC, соответствующий MPC2. С тех пор MPC1 и MPC2 работать в одном и том же состоянии и входных диапазонах и иметь одинаковые ограничения, можно использовать один и тот же объект диапазона.
expMPC2 = generateExplicitMPC(MPC2saved,range);
Regions found / unexplored: 5/ 0
В общем, явные диапазоны MPC различных контроллеров могут не совпадать. Например, контроллеры могут иметь различные ограничения или диапазоны состояний. В таких случаях создайте отдельный явный объект диапазона MPC для каждого контроллера.
Рекомендуется проверять производительность каждого явного контроллера MPC перед реализацией явного MPC с запланированным усилением. Например, для сравнения производительности MPC1 и expMPC1, смоделировать отклик по замкнутому контуру каждого контроллера, используя sim.
r = [zeros(30,1); 5*ones(160,1); -5*ones(160,1)]; [Yimp,Timp,Uimp] = sim(MPC1saved,350,r,1); [Yexp,Texp,Uexp] = sim(expMPC1,350,r,1);
-->Converting model to discrete time. -->Assuming output disturbance added to measured output channel #1 is integrated white noise. -->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.
Сравните выходные данные установки и управляемые последовательности переменных для двух контроллеров.
figure subplot(2,1,1) plot(Timp,Yimp,'b-',Texp,Yexp,'r--') grid on xlabel('Time (s)') ylabel('Output') title('Explicit MPC Validation') legend('Implicit MPC','Explicit MPC') subplot(2,1,2) plot(Timp,Uimp,'b-',Texp,Uexp,'r--') grid on ylabel('MV') xlabel('Time (s)')

Отклики замкнутого цикла и управляемые последовательности переменных неявных и явных контроллеров совпадают. Аналогичным образом можно проверить производительность expMPC2 против MPC2.
Если ответы неявных и явных контроллеров не совпадают, настройте явные диапазоны MPC и создайте новый явный контроллер MPC.
Чтобы реализовать явное управление MPC по расписанию усиления, замените блок Multiple MPC Controllers блоком Multiple Explicit MPC Controllers.
expModel = 'mpc_switching_explicit';
open_system(expModel)

Запустите моделирование.
sim(expModel)

Для просмотра результатов моделирования откройте область сигналов.
open_system([expModel '/signals'])

Явные MPC-контроллеры с планированием усиления обеспечивают ту же производительность, что и неявные MPC-контроллеры с планированием усиления.
[1] А. Бемпорад, С. Ди Кэрано, И. В. Колмановский и Д. Хроват, «Гибридное моделирование и управление многозвенным магнитным приводом для автомобильных приложений», в Proc. 46-й IEEE ® Conf. on Decision and Control, New Orleans, LA, 2007.
bdclose(expModel) close(findobj('Tag','mpc_switching_demo'))
Несколько явных контроллеров MPC | Несколько контроллеров MPC