Этот пример показывает, как использовать блок 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
Модель является упрощенной версией модели, предложенной в следующей ссылке:
А. Бемпорэд, С. Ди Кайрано, я. В. Кольмановский и Д. Хровэт, "Гибридное моделирование и управление мультитела магнитный привод для автомобильных приложений", в материалах 46-я Конференция IEEE® по Решению и Управлению, Новому Орлеану, LA, 2007.
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 = 0.2; % sampling time p = 20; % prediction horizon m = 1; % control horizon
Разработайте первый контроллер 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);
Чтобы запустить этот пример, Simulink® требуется.
if ~mpcchecktoolboxinstalled('simulink') disp('Simulink(R) is required to run this example.') return end
Моделируйте запланированное MPC управление усиления с блоком Multiple MPC Controllers.
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
disp('Start simulation by switching control between MPC1 and MPC2 ...'); disp('Control performance is satisfactory.'); open_system([mdl '/signals']); sim(mdl); MPC1saved = MPC1; MPC2saved = MPC2;
Start simulation by switching control between MPC1 and MPC2 ... Control performance is satisfactory. -->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.
Использование двух контроллеров обеспечивает хорошую производительность при всех условиях.
disp('Now repeat simulation by using only MPC1 ...'); disp('When two masses stick together, control performance deteriorates.'); MPC1 = MPC1saved; MPC2 = MPC1saved; sim(mdl);
Now repeat simulation by using only MPC1 ... When two masses stick together, control performance deteriorates.
В этом случае производительность ухудшается каждый раз, когда эти две массы присоединяются.
disp('Now repeat simulation by using only MPC2 ...'); disp('When two masses are detached, control performance deteriorates.'); MPC1 = MPC2saved; MPC2 = MPC2saved; sim(mdl);
Now repeat simulation by using only MPC2 ... When two masses are detached, control performance deteriorates.
В этом случае производительность ухудшается, когда массы отделяются, заставляя контроллер прикладывать чрезмерную силу.
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.
bdclose(expModel); close(findobj('Tag','mpc_switching_demo'));
Несколько явных контроллеров MPC | Несколько контроллеров MPC