В этом примере показано, как использовать явный MPC для управления сервомеханизмом постоянного тока при ограничениях напряжения и крутящего момента вала.
Аналогичный пример использования традиционного неявного MPC см. в разделе Сервомотор постоянного тока с ограничением на неизмеренном выходе.
Линейная динамическая модель с разомкнутым контуром определена в plant. Переменная tau - максимально допустимый крутящий момент, используемый в качестве выходного ограничения.
[plant,tau] = mpcmotormodel;
Укажите типы входных и выходных сигналов для контроллера MPC. Второй выход, крутящий момент, не поддается измерению.
plant = setmpcsignals(plant,'MV',1,'MO',1,'UO',2);
Управляемая переменная ограничена между +/- 220 вольт. Поскольку заводские входы и выходы имеют разные порядки величин, для упрощения настройки MPC используются также масштабные коэффициенты. Типичными вариантами масштабного коэффициента являются верхний/нижний предел или рабочий диапазон.
MV = struct('Min',-220,'Max',220,'ScaleFactor',440);
Ограничения на выход крутящего момента накладываются только в течение первых трех этапов прогнозирования, чтобы ограничить сложность явной конструкции MPC.
OV = struct('Min',{Inf, [-tau;-tau;-tau;-Inf]},... 'Max',{Inf, [tau;tau;tau;Inf]},... 'ScaleFactor',{2*pi, 2*tau});
Задача управления состоит в том, чтобы получить нулевое смещение отслеживания для углового положения. Поскольку имеется только одна управляемая переменная, крутящий момент вала может плавать в пределах ограничения, устанавливая его вес равным нулю.
Weights = struct('MV',0,'MVRate',0.1,'OV',[0.1 0]);
Создание контроллера MPC со временем выборки Ts, горизонт прогнозирования pи горизонт управления m.
Ts = 0.1; p = 10; m = 2; mpcobj = mpc(plant,Ts,p,m,Weights,MV,OV);
Явный MPC выполняет эквивалентную явно кусочно-аффинную версию закона управления MPC, определенного традиционным неявным контроллером MPC. Чтобы создать явный MPC-контроллер из неявного MPC-контроллера, необходимо указать диапазон для каждого состояния контроллера, опорный сигнал, управляемую переменную и измеряемое возмущение, чтобы проблема многопараметрического квадратичного программирования решалась в наборах параметров, определяемых этими диапазонами.
Создайте структуру диапазона, в которой можно указать диапазон для каждого параметра.
range = generateExplicitRange(mpcobj);
-->Converting model to discrete time. Assuming no disturbance added to measured output channel #1. -->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.
Укажите диапазоны для состояний контроллера
Состояния контроллера MPC включают в себя состояния из модели установки, модели возмущения и модели шума в этом порядке. Установка диапазона переменной состояния иногда затруднена, когда состояние не соответствует физическому параметру. В этом случае для сбора данных о диапазоне состояний рекомендуется выполнять несколько имитаций установки с разомкнутым контуром с типичными опорными сигналами и сигналами возмущения.
range.State.Min(:) = -1000; range.State.Max(:) = 1000;
Обычно известен практический диапазон эталонных сигналов, используемых в номинальной рабочей точке установки. Диапазоны, используемые для создания явного контроллера MPC, должны быть по крайней мере такими же, как и практический диапазон. Обратите внимание, что диапазон для привязки крутящего момента зафиксирован на 0 потому что он имеет нулевой вес.
range.Reference.Min = [-5;0]; range.Reference.Max = [5;0];
Если управляемые переменные ограничены, диапазоны, используемые для создания явного контроллера MPC, должны быть по крайней мере такими же, как эти пределы.
range.ManipulatedVariable.Min = MV.Min - 1; range.ManipulatedVariable.Max = MV.Max + 1;
Создайте явный MPC-контроллер с указанными диапазонами.
mpcobjExplicit = generateExplicitMPC(mpcobj,range)
Regions found / unexplored: 75/ 0 Explicit MPC Controller --------------------------------------------- Controller sample time: 0.1 (seconds) Polyhedral regions: 75 Number of parameters: 6 Is solution simplified: No State Estimation: Default Kalman gain --------------------------------------------- Type 'mpcobjExplicit.MPC' for the original implicit MPC design. Type 'mpcobjExplicit.Range' for the valid range of parameters. Type 'mpcobjExplicit.OptimizationOptions' for the options used in multi-parametric QP computation. Type 'mpcobjExplicit.PiecewiseAffineSolution' for regions and gain in each solution.
Можно просмотреть любой 2-D раздел кусочно-аффинного раздела, определенного явным законом управления MPC. Для этого сначала создайте структуру параметров, в которой можно указать, какое 2-D сечение будет выводиться на печать.
params = generatePlotParameters(mpcobjExplicit);
В этом примере отображается первая переменная состояния относительно второй переменной состояния. Все остальные параметры должны быть зафиксированы значениями в соответствующих диапазонах.
Исправьте другие переменные состояния.
params.State.Index = [3 4]; params.State.Value = [0 0];
Фиксация опорных сигналов.
params.Reference.Index = [1 2]; params.Reference.Value = [pi 0];
Исправьте управляемые переменные.
params.ManipulatedVariable.Index = 1; params.ManipulatedVariable.Value = 0;
Постройте график указанного раздела 2-D.
plotSection(mpcobjExplicit,params); axis([-.3 .3 -2 2]); grid title('Section of partition [x3(t)=0, x4(t)=0, u(t-1)=0, r(t)=pi]') xlabel('x1(t)') ylabel('x2(t)')

sim ФункцияСравните результаты моделирования с обратной связью между неявным MPC и явным MPC-контроллерами.
Tstop = 8; % seconds Tf = round(Tstop/Ts); % simulation iterations r = [pi 0]; % reference signal [y1,t1,u1] = sim(mpcobj,Tf,r); % simulation with traditional MPC [y2,t2,u2] = sim(mpcobjExplicit,Tf,r); % simulation with Explicit MPC
-->Converting model to discrete time. Assuming no disturbance added to measured output channel #1. -->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.
Результаты моделирования идентичны.
fprintf('Difference between implicit and explicit MPC trajectories = %g\n',... norm(u2-u1)+norm(y2-y1));
Difference between implicit and explicit MPC trajectories = 8.68909e-12
Для выполнения этого примера необходимо приложение Simulink ®.
if ~mpcchecktoolboxinstalled('simulink') disp('Simulink(R) is required to run this example.') return end
Моделирование управления по замкнутому контуру линейной модели установки в Simulink. Блок явного контроллера MPC настроен на использование mpcobjExplicit в качестве своего контроллера.
mdl = 'empc_motor';
open_system(mdl)
sim(mdl)





Отклик с замкнутым контуром идентичен традиционному MPC-контроллеру, разработанному в сервомоторе постоянного тока с ограничением на неизмеренный выход.
Чтобы уменьшить объем памяти, можно использовать simplify функция уменьшения количества кусочно-аффинных областей раствора. Например, можно удалить регионы, чебышевский радиус которых меньше 0.08. Однако цена, которую вы платите, заключается в том, что производительность контроллера является неоптимальной.
mpcobjExplicitSimplified = simplify(mpcobjExplicit,'radius',0.08)
Regions to analyze: 75/ 75 --> 37 regions deleted. Explicit MPC Controller --------------------------------------------- Controller sample time: 0.1 (seconds) Polyhedral regions: 38 Number of parameters: 6 Is solution simplified: Yes State Estimation: Default Kalman gain --------------------------------------------- Type 'mpcobjExplicitSimplified.MPC' for the original implicit MPC design. Type 'mpcobjExplicitSimplified.Range' for the valid range of parameters. Type 'mpcobjExplicitSimplified.OptimizationOptions' for the options used in multi-parametric QP computation. Type 'mpcobjExplicitSimplified.PiecewiseAffineSolution' for regions and gain in each solution.
Количество кусочно-аффинных областей уменьшено.
Сравните результаты моделирования с обратной связью между неоптимальным явным MPC и явным MPC.
[y3,t3,u3] = sim(mpcobjExplicitSimplified, Tf, r);
-->Converting model to discrete time. Assuming no disturbance added to measured output channel #1. -->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.
Результаты моделирования не совпадают.
fprintf('Difference between exact and suboptimal explicit MPC trajectories = %g\n',... norm(u3-u2)+norm(y3-y2));
Difference between exact and suboptimal explicit MPC trajectories = 439.399
Результаты графика.
figure subplot(3,1,1) plot(t1,y1(:,1),t3,y3(:,1),'o') grid title('Angle (rad)') legend('Explicit','sub-optimal Explicit') subplot(3,1,2) plot(t1,y1(:,2),t3,y3(:,2),'o') grid title('Torque (Nm)') legend('Explicit','sub-optimal Explicit') subplot(3,1,3) plot(t1,u1,t3,u3,'o') grid title('Voltage (V)') legend('Explicit','sub-optimal Explicit')

Результат моделирования с использованием неоптимального явного MPC несколько хуже.
[1] А. Бемпорад и Е. Моска, «Выполнение жестких ограничений в неопределенных линейных системах путем управления ссылками», Automatica, vol. 34, no. 4, pp. 451-461, 1998.
bdclose(mdl)