В этом примере показано, как использовать блок Multiple MPC Controllers, и блок Multiple Explicit MPC Controllers, чтобы реализовать усиление запланировал MPC управление нелинейным объектом.
Система составлена двумя массами M1
и M2
соединенный с двумя пружинами k1 и k2 соответственно. Столкновение принято абсолютно неэластичное. Массовый M1 вытягивает сила F, который является переменной, которой управляют. Цель состоит в том, чтобы заставить положение y1 массового M1 отследить данную ссылку 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
Переменная Manipulated: Получение по запросу силы 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 управление с помощью блока Multiple Explicit MPC Controllers.
Чтобы создать явный контроллер MPC, сначала задайте рабочие диапазоны для состояний контроллера, входных сигналов и ссылочных сигналов. Создайте явный объект области значений MPC с помощью соответствующего традиционного контроллера, MPC1
.
range = generateExplicitRange(MPC1saved);
Укажите диапазоны для состояний контроллера. Оба MPC1
и MPC2
содержите состояния для:
Положение и скорость массового M1
Интегратор от выходного возмущения по умолчанию
range.State.Min(:) = [-10;-8;-3]; range.State.Max(:) = [10;8;3];
Когда возможно, используйте свое знание объекта, чтобы задать области значений состояния. Однако это может затруднить, когда состояние не соответствует физическому параметру, такой что касается выходного состояния возмущения. В этом случае соберите информацию области значений с помощью симуляций с типичной ссылкой и сигналами воздействия. Для этой системы можно активировать дополнительный est.state
выходной порт блока 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] А. Бемпорэд, С. Ди Кайрано, я. В. Кольмановский и Д. Хровэт, "Гибридное моделирование и управление мультитела магнитный привод для автомобильных приложений", в материалах 46-я Конференция IEEE® по Решению и Управлению, Новому Орлеану, LA, 2007.
bdclose(expModel) close(findobj('Tag','mpc_switching_demo'))
Multiple Explicit MPC Controllers | Multiple MPC Controllers