Оцените эффективность управления с помощью корректировки горизонта во время выполнения

В этом примере показано, как настроить горизонты предсказания и управления во время исполнения, чтобы оценить эффективность контроллера, не воссоздавая объект контроллера или не регенерируя код.

Обзор Предсказания и управления выбором горизонта

Горизонты предсказания и управления вместе со шагом расчета контроллера определяются обычно до разработки других настроек MPC, таких как ограничения и веса.

Существуют определенные инструкции, которые помогут выбрать шаг расчета Ts, горизонт предсказания p, и управляйте горизонтом m. Например, предположим, что вы хотите определить, как далеко контроллер должен смотреть в будущее. В теории время предсказания должно быть достаточно большим, чтобы захватить доминирующее динамическое поведение объекта, но не больше, чтобы избежать траты ресурсов, используемых в расчетах. На практике вы часто начинаете с небольшого значения и постепенно увеличиваете его, чтобы увидеть, как улучшается производительность управления. Когда будет плато, остановитесь.

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

В этом примере мы демонстрируем, как настроить горизонты предсказания и управления блоком MPC Controller с помощью его входных портов и сравнить эффективность управления после нескольких запусков симуляции, не воссоздавая объект контроллера MPC, используемый блоком. Если блок работает во встраиваемой системе, можно настроить горизонты и в реальном времени, не регенерируя и не перераспределяя код.

Чтобы запустить этот пример, требуются Design™ Simulink ® и Simulink Control.

if ~mpcchecktoolboxinstalled('simulink')
    disp('Simulink is required to run this example.')
    return
end
if ~mpcchecktoolboxinstalled('slcontrol')
    disp('Simulink Control Design is required to run this example.')
    return
end

Линеаризация нелинейного объекта в номинальной рабочей точке

Объект с одним входом и одним выходом реализована в модели Simulink mpc_nloffsets. В номинальной рабочей точке объект находится в установившемся состоянии с выходом -0,5.

plant_mdl = 'mpc_nloffsets';

Используйте operspec команда из Simulink Control Design создать объект спецификации рабочей точки с желаемым выходным значением, фиксированным в установившемся состоянии.

op = operspec(plant_mdl);
op.Outputs.Known = true;
op.Outputs.y = -0.5;

Используйте findop команда из Simulink Control Design, чтобы получить номинальную рабочую точку.

[op_point, op_report] = findop(plant_mdl,op);
 Operating point search report:
---------------------------------

 Operating point search report for the Model mpc_nloffsets.
 (Time-Varying Components Evaluated at time t=0)

Operating point specifications were successfully met.
States: 
----------
(1.) mpc_nloffsets/Integrator
      x:         0.595      dx:      1.03e-13 (0)
(2.) mpc_nloffsets/Integrator2
      x:          2.19      dx:      -1.1e-09 (0)

Inputs: 
----------
(1.) mpc_nloffsets/In1
      u:         -1.18    [-Inf Inf]

Outputs: 
----------
(1.) mpc_nloffsets/Out1
      y:          -0.5    (-0.5)

Используйте linearize команда из Simulink Control Design для линеаризации объекта в номинальном рабочем условии.

plant = linearize(plant_mdl, op_point);

Получите номинальные состояния объекта управления, выход и вход.

x0 = [op_report.States(1).x;op_report.States(2).x];
y0 = op_report.Outputs.y;
u0 = op_report.Inputs.u;

Линеаризированный объект является недостаточно демпфированной системой второго порядка. Использование damp команда, мы можем узнать доминирующую постоянную времени объекта, которая составляет около 1,7 секунд.

damp(plant)
                                                                       
         Pole              Damping       Frequency      Time Constant  
                                       (rad/seconds)      (seconds)    
                                                                       
 -5.95e-01 + 1.84e+00i     3.07e-01       1.94e+00         1.68e+00    
 -5.95e-01 - 1.84e+00i     3.07e-01       1.94e+00         1.68e+00    

Разработка контроллера MPC по умолчанию

Простое руководство рекомендует, чтобы время предсказания покрывало, по крайней мере, доминирующую постоянную времени (1,7 секунды), а горизонт управления составлял 10% ~ 20% от горизонта предсказания. Поэтому, если мы выберем шаг расчета 0,1, горизонт предсказания должен быть около 17. Это дает нам начальной точке выбрать горизонты по умолчанию

Ts = 0.1;
p = 20;
m = 4;
mpcobj = mpc(plant,Ts,p,m);
-->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.

Установите номинальные значения в контроллере.

mpcobj.Model.Nominal = struct('X', x0, 'U', u0, 'Y', y0);

Установите ограничение СН.

mpcobj.MV.Max = 2;
mpcobj.MV.Min = -2;

Поскольку на объекте мало шума, мы уменьшаем коэффициент усиления модели шума, чтобы сделать фильтр Калмана по умолчанию более агрессивным.

mpcobj.Model.Noise = 0.1;

Сравнение эффективности между различными вариантами горизонта предсказания

The mpc_onlineHorizons модель реализует систему управления с обратной связью. Наша цель - отследить изменение шага -0,2 в опорный сигнал с минимальным перерегулированием. Мы также хотим, чтобы время урегулирования было менее 5 секунд.

r0 = -0.7;
mdl = 'mpc_onlineHorizons';
open_system(mdl)

В модели блок MPC имеет два входных порта, где мы можем соединить сигнал горизонта предсказания и сигнал горизонта управления. В каждой симуляции мы варьируем значение горизонта предсказания (от 5 до 50), сохраняя контрольный горизонт на уровне 4. Мы измеряем и перерегулирование (%), и время урегулирования (сек) по сохраненным результатам симуляции. Обратите внимание, что объект контроллера MPC не изменяется. Вместо этого новые значения горизонта подаются как входные сигналы во время исполнения.

p_choices = 5:5:50;
set_param([mdl '/Control Horizon'],'Value','4')
for p = p_choices
    set_param([mdl '/Prediction Horizon'],'Value',num2str(p))
    sim(mdl,20)
    settling_timeP(p/5) = ...
        find((abs(y.signals.values-r0)<0.01)&(abs([0;diff(y.signals.values)])<0.001),1,'first')*Ts;
    if r0>y0
        overshootP(p/5) = abs((max(y.signals.values)-r0)/r0)*100;
    else
        overshootP(p/5) = abs((min(y.signals.values)-r0)/r0)*100;
    end
end
figure
subplot(2,1,1)
plot(p_choices,overshootP,'*')
xlabel('prediction horizon')
ylabel('overshoot (%)')
title('control horizon = 4')
subplot(2,1,2)
plot(p_choices,settling_timeP,'*')
ylabel('settling time (sec)')
xlabel('prediction horizon')
-->Converting model to discrete time.
-->Assuming output disturbance added to measured output channel #1 is integrated white noise.

Как показывают два графика выше, когда горизонт предсказания увеличивается с 5 до 15, перерегулирование падает с 6% до 3% и время урегулирования увеличивается с 3 секунд до 4 секунд. После этого, однако, и перерегулирование, и время урегулирования остаются более или менее одинаковыми. В сложение все значения времени урегулирования удовлетворяют верхней границе в 5 секунд. Поэтому мы выбираем горизонт предсказания 15, потому что это наименьшее значение, чтобы достичь удовлетворительной эффективности путем формирования наименьшей задачи оптимизации.

Сравнение эффективности между различными вариантами горизонта управления

После того, как мы выберем горизонт предсказания, мы используем ту же настройку, чтобы вычислить различные варианты горизонта управления. В каждой симуляции мы варьируем контрольный горизонт (от 1 до 10), сохраняя горизонт предсказания на уровне 15.

c_choices = 1:10;
set_param([mdl '/Prediction Horizon'],'Value','15')
for c = c_choices
    set_param([mdl '/Control Horizon'],'Value',num2str(c))
    sim(mdl,20)
    settling_timeC(c) = ...
        find((abs(y.signals.values-r0)<0.01)&(abs([0;diff(y.signals.values)])<0.001),1,'first')*Ts;
    if r0>y0
        overshootC(c) = abs((max(y.signals.values)-r0)/r0)*100;
    else
        overshootC(c) = abs((min(y.signals.values)-r0)/r0)*100;
    end
end
figure
subplot(2,1,1)
plot(c_choices,overshootC,'*')
xlabel('control horizon')
ylabel('overshoot (%)')
title('prediction horizon = 15')
subplot(2,1,2)
plot(c_choices,settling_timeC,'*')
xlabel('control horizon')
ylabel('settling time (sec)')

Как показывают два графика выше, когда горизонт управления увеличивается с 1 до 3, перерегулирование падает с 10% до 2%. После этого он увеличивается до 5% при росте контрольного горизонта от 4 до 10. Объяснение состоит в том, что, когда горизонт управления равен 1, контроллер не имеет достаточной степени свободы, чтобы достичь разумной реакции. Когда горизонт управления находится за пределами 4, контроллер имеет больше переменных принятия решений, так что первый оптимальный ход часто становится более агрессивным и, таким образом, приводит к большему перерегулированию, но более короткому времени урегулирования. В этом примере, поскольку основной целью управления является достижение минимального перерегулирования, мы выбираем 3 в качестве горизонта управления.

Модель моделируется с горизонтом предсказания = 15 и управляющим горизонтом = 3. Напомним, что нашим исходным выбором проекта является горизонт предсказания = 20 и горизонт управления = 4 на основе простого руководства, которое близко к нашему окончательному выбору.

set_param([mdl '/Prediction Horizon'],'Value','15')
set_param([mdl '/Control Horizon'],'Value','3')
open_system([mdl '/Input'])
open_system([mdl '/Output'])
sim(mdl)

Настройка горизонтов в режиме реального времени во встраиваемых системах

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

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

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

bdclose(mdl)

См. также

Похожие темы