Явное MPC управление сервоприводом DC с ограничением на неизмеренный Вывод

Этот пример показывает, как использовать Явный MPC, чтобы управлять сервомеханизмом DC под напряжением и ограничениями крутящего момента вала.

Ссылка

[1] А. Бемпорэд и Э. Моска, ''Выполнение трудных ограничений в неопределенных линейных системах ссылочным управлением'', Automatica, издание 34, № 4, стр 451-461, 1998.

См. также MPCMOTOR.

Задайте модель сервопривода DC

Линейная динамическая модель разомкнутого цикла задана на "объекте". Переменная "tau" является максимальным допустимым крутящим моментом, который будет использоваться в качестве выходного ограничения.

[plant, tau] = mpcmotormodel;

Разработайте контроллер MPC

Задайте типы сигнала ввода и вывода для контроллера MPC. Второй вывод, крутящий момент, неизмерим.

plant = setmpcsignals(plant,'MV',1,'MO',1,'UO',2);

Ограничения мВ

Переменная, которой управляют, ограничивается между +/-220 вольт. Поскольку вводы и выводы объекта имеют различные порядки величины, вы также используете масштабные коэффициенты, чтобы упростить настройку MPC. Типичным выбором масштабного коэффициента является верхнее / нижний предел или рабочий диапазон.

MV = struct('Min',-220,'Max',220,'ScaleFactor',440);

Ограничения OV

Ограничения крутящего момента только наложены во время первых трех шагов прогноза, чтобы ограничить сложность явного проекта 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

Создайте контроллер MPC с моделью объекта управления, шагом расчета и горизонтами.

Ts = 0.1;           % Sampling time
p = 10;             % Prediction horizon
m = 2;              % Control horizon
mpcobj = mpc(plant,Ts,p,m,Weights,MV,OV);

Сгенерируйте явный контроллер MPC

Явный MPC выполняет эквивалентную явную кусочную аффинную версию закона о MPC управлении, заданного традиционным MPC. Чтобы сгенерировать Явный MPC от традиционного MPC, необходимо указать, что область значений для каждого состояния контроллера, ссылочного сигнала, управляла переменным и измеренным воздействием так, чтобы мультипараметрическая проблема квадратичного программирования была решена в наборах параметра, заданных этими областями значений.

Получите структуру области значений для инициализации

Используйте команду generateExplicitRange, чтобы получить структуру области значений, где можно задать область значений для каждого параметра впоследствии.

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

Используйте команду generateExplicitMPC, чтобы получить Явный контроллер MPC с ранее заданными областями значений параметра.

mpcobjExplicit = generateExplicitMPC(mpcobj, range);
display(mpcobjExplicit);

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 управлении.

Получите структуру параметра графика для инициализации

Используйте команду generatePlotParameters, чтобы получить структуру параметра, где можно задать который 2D раздел построить впоследствии.

params = generatePlotParameters(mpcobjExplicit);

Задайте параметры для 2D графика

В этом примере вы строите 1th переменную состояния по сравнению с 2-й переменной состояния. Все другие параметры должны быть зафиксированы в значении в его области значений.

Зафиксируйте другие переменные состояния

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, чтобы построить 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) и Явным 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('SIM command: Difference between QP-based and Explicit MPC trajectories = %g\n',norm(u2-u1)+norm(y2-y1));
SIM command: Difference between QP-based and Explicit MPC trajectories = 8.68909e-12

Моделируйте Используя Simulink®

Чтобы запустить этот пример, 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, разработанному в "mpcmotor" примере.

Управляйте Используя субоптимальный явный MPC

Чтобы уменьшать объем потребляемой памяти, можно использовать команду simplify, чтобы сократить количество кусочных аффинных областей решения. Например, можно удалить области, радиус Чебычева которых меньше, чем.08. Однако цена, которую вы платите, - то, что производительность контроллера теперь становится субоптимальной.

Используйте команду simplify, чтобы сгенерировать Явный MPC с субоптимальными решениями.

mpcobjExplicitSimplified = simplify(mpcobjExplicit, 'radius', 0.08);
disp(mpcobjExplicitSimplified);

Regions to analyze:       75/      75 --> 37 regions deleted.

  explicitMPC with properties:

                        MPC: [1x1 mpc]
                      Range: [1x1 struct]
        OptimizationOptions: [1x1 struct]
    PiecewiseAffineSolution: [1x38 struct]
               IsSimplified: 1

Количество кусочных аффинных областей было сокращено.

Сравните симуляцию с обратной связью между субоптимальным Явным 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('SIM command: Difference between exact and suboptimal MPC trajectories = %g\n',norm(u3-u2)+norm(y3-y2));
SIM command: Difference between exact and suboptimal 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 немного хуже.

bdclose(mdl)

Похожие темы