Если ваш объект нелинеен, контроллер, спроектированный, чтобы действовать в конкретной целевой области, может выполнить плохо в других областях. Распространенный способ компенсировать состоит в том, чтобы создать несколько контроллеров, каждый спроектированный для конкретной комбинации условий работы. Можно затем переключиться между контроллерами в режиме реального времени, когда условия изменяются. Для получения дополнительной информации смотрите Запланированный на усиление MPC.
Следующий пример показывает, как скоординировать многоуровневую модель прогнозирующие контроллеры с этой целью.
Объект содержит две массы, M1
и M2
, соединенный с двумя пружинами. Пружина с коэффициентом упругости k1
масса получений по запросу M1
направо, и пружина с коэффициентом упругости k2
масса получений по запросу M2
налево. Переменная, которой управляют, является силой, вытягивающей массовый M1
налево, показавший Красной стрелой в следующем рисунке.
Обе массы перемещаются свободно, пока они не сталкиваются. Столкновение неэластично, и массы склеиваются, пока изменение в приложенной силе не разделяет их. Поэтому существует два условий работы для системы с различной динамикой.
Цель управления состоит в том, чтобы сделать положение M1
отследите ссылочный сигнал, показавший синим треугольником в предыдущем изображении. Только положение M1
и датчик контакта доступен для обратной связи.
Задайте параметры модели.
M1 = 1; % masses M2 = 5; k1 = 1; % spring constants k2 = 0.1; b1 = 0.3; % friction coefficients b2 = 0.8; yeq1 = 10; % wall mount positions yeq2 = -10;
Создайте модель в пространстве состояний для того, когда массы не будут в контакте; это когда массовый 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,'MV',1,'MD',2);
Создайте модель в пространстве состояний для того, когда массы будут соединены.
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,'MV',1,'MD',2);
Для обеих моделей:
Состояния являются положением и скоростью M1
.
Входные параметры являются приложенной силой, которая является переменной, которой управляют, (MV) и калибровочным сигналом коэффициента упругости, который является измеренным воздействием (MD).
Выход является положением M1
.
Спроектируйте один контроллер MPC для каждой из моделей объекта управления. Оба контроллера идентичны за исключением своих внутренних моделей предсказания.
Задайте тот же шаг расчета, Ts
, горизонт предсказания, p
, и управляйте горизонтом, m
, для обоих контроллеров.
Ts = 0.2; p = 20; m = 1;
Создайте контроллеры MPC по умолчанию для каждой модели объекта управления.
MPC1 = mpc(sys1,Ts,p,m); MPC2 = mpc(sys2,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. -->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); MPC2.MV = MPC1.MV;
Симулируйте производительность контроллеров, использующих блок MPC Controller.
Откройте модель Simulink.
mdl = 'mpc_switching';
open_system(mdl)
В модели Массовая подсистема M1 симулирует движение массового M1
, и при перемещении свободно и, когда соединено с M2
. Массовая подсистема M2 симулирует движение массового M2, когда это перемещается свободно. Выбор режима и скоростные подсистемы сброса координируют столкновение и разделение масс.
Модель содержит переключающуюся логику, которая обнаруживает когда положения M1
и M2
то же самое. Получившееся переключение сигнализирует о подключениях к switch
импорт блока Multiple MPC Controllers и средства управления, какой контроллер MPC активен.
Задайте исходное положение для каждой массы.
y1initial = 0; y2initial = 10;
Чтобы задать запланированные на усиление контроллеры, дважды кликните блок Multiple MPC Controllers. В диалоговом окне Block Parameters задайте контроллеры как массив ячеек имен контроллера. Установите начальные состояния для каждого контроллера к их соответствующей номинальной стоимости путем определения состояний как {'[],'[]'}
.
Нажать ОК.
Запустите симуляцию.
sim(mdl)
-->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.
Чтобы просмотреть результаты симуляции, откройте осциллограф сигналов.
open_system([mdl '/signals'])
Первоначально, MPC1
масса перемещений M1
к ссылочному заданному значению. Приблизительно в 13 секунд, M2
сталкивается с M1
. Переключающийся сигнал изменяется от 1 до 2, который переключает управление на MPC2
.
Столкновение перемещает M1
далеко от его заданного значения и MPC2
быстро возвращает объединенные массы в контрольную точку.
Во время последующих ссылочных переходов сигнала, когда массы отделяются и сталкиваются переключатели блока Multiple MPC Controllers между MPC1
и MPC2
соответственно. В результате объединенные массы обосновываются быстро к контрольным точкам.
Чтобы продемонстрировать преимущество использования двух контроллеров MPC для этого приложения, симулируйте систему, использующую только MPC2
.
Измените MPC1
совпадать с MPC2
.
MPC1save = MPC1; MPC1 = MPC2;
Запустите симуляцию.
sim(mdl)
Когда массы не соединяются, MPC2
прикладывает чрезмерную силу, поскольку она ожидает большую массу. Это агрессивное действие управления производит колебательное поведение. Если массы соединяются, производительность управления улучшается, поскольку контроллер спроектирован для этого условия.
В качестве альтернативы изменение MPC2
совпадать с MPC1
результаты в вялых действиях управления и долго обосновывающиеся времена, когда массы соединяются.
Установите MPC1
назад к его исходной настройке.
MPC1 = MPC1save;
Чтобы уменьшать онлайновое вычислительное усилие, можно создать явный контроллер MPC для каждых условий работы и реализовать запланированное на усиление явное MPC управление с помощью блока Multiple Explicit MPC Controllers. Для получения дополнительной информации о явных контроллерах MPC смотрите Явный MPC.
Чтобы создать явный контроллер MPC, сначала задайте рабочие диапазоны для состояний контроллера, входных сигналов и ссылочных сигналов.
Создайте явный объект области значений MPC с помощью соответствующего традиционного контроллера, MPC1
.
range = generateExplicitRange(MPC1);
Укажите диапазоны для состояний контроллера. Оба MPC1
и MPC2
содержите состояния для:
Положение и скорость массового M1
.
Интегратор от выходного возмущения по умолчанию.
Когда возможно, используйте свое знание объекта, чтобы задать области значений состояния. Например, первое состояние соответствует положению M1
, который имеет область значений между-10 и 10.
Установка области значений переменной состояния может затруднить, когда состояние не соответствует физическому параметру, такой что касается выходного состояния возмущения. В этом случае соберите информацию области значений с помощью симуляций с типичной ссылкой и сигналами воздействия. Для этой системы можно активировать дополнительный est.state
выходной порт блока Multiple MPC Controllers и представление предполагаемые состояния с помощью осциллографа. При симуляции ответов контроллера используйте ссылочный сигнал, который покрывает ожидаемый рабочий диапазон.
Задайте области значений состояния для явных контроллеров MPC на основе областей значений предполагаемых состояний.
range.State.Min(:) = [-10;-8;-3]; range.State.Max(:) = [10;8;3];
Задайте область значений для ссылочного сигнала. Выберите диапазон ссылки, который меньше, чем 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(MPC1,range);
Regions found / unexplored: 4/ 0
Создайте явный контроллер MPC, который соответствует MPC2
. Начиная с MPC1
и MPC2
действуйте по тем же и входным диапазонам состояния и имейте те же ограничения, можно использовать тот же объект области значений.
expMPC2 = generateExplicitMPC(MPC2,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(MPC1,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)
Чтобы задать явные контроллеры MPC, дважды кликните блок Multiple Explicit MPC Controllers. В диалоговом окне Block Parameters задайте контроллеры как массив ячеек имен контроллера. Установите начальные состояния для каждого контроллера к их соответствующей номинальной стоимости путем определения состояний как {'[],'[]'}
.
Нажать ОК.
Если бы вы ранее подтвердили свои явные контроллеры MPC, то замена и конфигурирование блока Multiple Explicit MPC Controllers должны привести к тем же результатам как блок Multiple MPC Controllers.
Запустите симуляцию.
sim(expModel)
Чтобы просмотреть результаты симуляции, откройте осциллограф сигналов.
open_system([expModel '/signals'])
Запланированные на усиление явные контроллеры MPC обеспечивают ту же производительность как запланированные на усиление неявные контроллеры MPC.
bdclose('all')
Multiple Explicit MPC Controllers | Multiple MPC Controllers