В этом примере показано, как использовать явный MPC, чтобы управлять сервомеханизмом DC под напряжением, и вал закручивают ограничения.
Для подобного примера, который использует традиционный неявный MPC, смотрите Сервопривод DC с Ограничением на Неизмеренный Выход.
Линейная динамическая модель разомкнутого цикла задана в 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.
Можно рассмотреть любой 2D раздел кусочного аффинного раздела, заданного явным законом о MPC управлении. Для этого сначала создайте структуру параметра, где можно задать который 2D раздел построить.
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;
Постройте заданный 2D раздел.
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. Блок Explicit MPC Controller сконфигурирован, чтобы использовать mpcobjExplicit
как его контроллер.
mdl = 'empc_motor';
open_system(mdl)
sim(mdl)
Ответ с обратной связью идентичен традиционному контроллеру MPC, спроектированному в Сервоприводе DC с Ограничением на Неизмеренный Выход.
Чтобы уменьшать объем потребляемой памяти, можно использовать 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, издание 34, № 4, стр 451-461, 1998.
bdclose(mdl)