В этом примере показано, как настроить предсказание, и горизонты управления во времени выполнения, чтобы оценить эффективность контроллера, не воссоздавая контроллер возражают или регенерируя код.
Предсказание и горизонты управления, вместе с шагом расчета контроллера, обычно определяются, прежде чем другие настройки MPC, такие как ограничения и веса спроектированы.
Существуют определенные инструкции, чтобы помочь выбрать шаг расчета Ts
, горизонт предсказания p
, и управляйте горизонтом m
. Например, примите, что вы хотите определить, как далеко контроллер должен изучить будущее. В теории время предсказания должно быть достаточно долгим, чтобы получить доминирующее динамическое поведение объекта, но больше чтобы не тратить впустую ресурсы, используемые в расчете. На практике вы часто начинаете с маленького значения и постепенно увеличиваете его, чтобы видеть, как эффективность управления улучшается. Когда это выровняется, остановиться.
Горизонт управления определяет, сколько переменных MPC решения использует в оптимизации. Если значение слишком мало, у вас нет достаточных степеней свободы, чтобы достигнуть удовлетворительной эффективности. С другой стороны, если значение является слишком большим, и загрузка расчета и увеличение объема потребляемой памяти значительно с небольшим повышением производительности. Поэтому это - другое место, вы хотите попробовать различные значения и сравнить результаты.
В этом примере мы демонстрируем, как настроить предсказание и горизонты управления блока MPC Controller с помощью его импорта и сравнить эффективность управления после нескольких запусков симуляции, не воссоздавая контроллер MPC объект, используемый блоком. Если блок работает на встраиваемой системе, можно настроить горизонты в режиме реального времени также, не регенерируя и повторно развертывая код.
Чтобы запустить этот пример, Simulink® и Simulink Control Design™ требуются.
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: --------------------------------- opreport = Operating point search report for the Model mpc_nloffsets. (Time-Varying Components Evaluated at time t=0) Operating point specifications were successfully met. States: ---------- <strong>Min</strong> <strong>x</strong> <strong>Max</strong> <strong>dxMin</strong> <strong>dx</strong> <strong>dxMax</strong> <strong>____</strong> <strong>_______</strong> <strong>___</strong> <strong>_____</strong> <strong>___________</strong> <strong>_____</strong> (1.) mpc_nloffsets/Integrator -Inf 0.59453 Inf 0 1.0258e-13 0 (2.) mpc_nloffsets/Integrator2 -Inf 2.1891 Inf 0 -1.0989e-09 0 Inputs: ---------- <strong>Min</strong> <strong>u</strong> <strong>Max</strong> <strong>____</strong> <strong>_______</strong> <strong>___</strong> (1.) mpc_nloffsets/In1 -Inf -1.1806 Inf Outputs: ---------- <strong>Min</strong> <strong>y</strong> <strong>Max</strong> <strong>____</strong> <strong>____</strong> <strong>____</strong> (1.) mpc_nloffsets/Out1 -0.5 -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;
Линеаризовавший объект является underdamped системой второго порядка. Используя 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
Простая инструкция рекомендует, чтобы время предсказания, по крайней мере, покрыло доминирующую постоянную времени (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;
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 и Адаптивных блоках MPC - то, что можно оценить и настроить эффективность контроллера в режиме реального времени, не регенерируя код и повторно развернув его на целевой системе. Эта функция очень полезна на этапе прототипирования.
Чтобы использовать корректировку горизонта во время выполнения в режиме реального времени, целевая система должна поддержать динамическое выделение памяти, потому что, когда горизонты изменяются, размеры всего, что матрицы раньше создавали изменение задачи оптимизации во времени выполнения также.
Также необходимо задать максимальный горизонт предсказания в диалоговом окне блока, чтобы задать верхнюю границу размеров этих матриц. Поэтому объем потребляемой памяти был бы большим. После нахождения лучшего выбора горизонта рекомендуется отключить опцию, чтобы иметь эффективную генерацию кода с данными фиксированного размера.
bdclose(mdl)