В этом примере показано, как управлять нестабильным самолетом с насыщением приводов с помощью явного прогнозирующего управления модели.
Для примера, который управляет тем же объектом с помощью традиционного контроллера MPC, смотрите Самолет с Нестабильными полюсами.
Линейная динамическая модель разомкнутого цикла самолета имеет следующие матрицы пространства состояний:
A = [-0.0151 -60.5651 0 -32.174; -0.0001 -1.3411 0.9929 0; 0.00018 43.2541 -0.86939 0; 0 0 1 0]; B = [-2.516 -13.136; -0.1689 -0.2514; -17.251 -1.5766; 0 0]; C = [0 1 0 0; 0 0 0 1]; D = [0 0; 0 0];
Создайте объект и задайте начальные состояния как нуль.
plant = ss(A,B,C,D); x0 = zeros(4,1);
Переменные, которыми управляют, являются углами флаперона и лифтом. Углами нападения и подачи являются измеренные выходные параметры, которые будут отрегулированы.
Ответ разомкнутого цикла системы нестабилен.
pole(plant)
ans = -7.6636 + 0.0000i 5.4530 + 0.0000i -0.0075 + 0.0556i -0.0075 - 0.0556i
Чтобы получить Явный контроллер MPC, необходимо сначала спроектировать традиционный (неявный) прогнозирующий контроллер модели, который может достигнуть целей управления.
Ограничения мВ
Обе переменные, которыми управляют, ограничиваются между +/-25 градусов. Поскольку вводы и выводы объекта имеют различные порядки величины, вы также используете масштабные коэффициенты, чтобы упростить настройку MPC. Типичным выбором масштабного коэффициента является верхнее / нижний предел или рабочий диапазон.
MV = struct('Min',{-25,-25},'Max',{25,25},'ScaleFactor',{50,50});
Ограничения OV
Оба объекта выходные параметры имеют ограничения, чтобы ограничить отклонение от номинала на первом шаге горизонта прогноза. Кроме того, задайте масштабные коэффициенты для выходных параметров.
OV = struct('Min',{[-0.5;-Inf],[-100;-Inf]},'Max',{[0.5;Inf],[100;Inf]},'ScaleFactor',{1,200});
Веса
Задача управления состоит в том, чтобы получить нулевое смещение для кусочно-постоянных ссылок при предотвращении нестабильности из-за входной насыщенности. Поскольку и переменные MV и OV уже масштабируются в контроллере MPC, веса MPC являются безразмерными и применились к масштабированному мВ и значениям OV. В этом примере вы штрафуете эти два выходных параметров наравне с теми же весами OV.
Weights = struct('MV',[0 0],'MVRate',[0.1 0.1],'OV',[10 10]);
Создайте традиционный контроллер MPC
Создайте контроллер MPC с заданной моделью объекта управления, шагом расчета и горизонтами.
Ts = 0.05; % Sample time p = 10; % Prediction horizon m = 2; % Control horizon mpcobj = mpc(plant,Ts,p,m,Weights,MV,OV);
Явный MPC выполняет эквивалентную явную кусочную аффинную версию закона о MPC управлении, заданного традиционным контроллером MPC. Чтобы сгенерировать явный контроллер MPC от традиционного диспетчера MPC, необходимо указать диапазон для каждого состояния контроллера, ссылочного сигнала, управлял переменным и измеренным воздействием. Выполнение так гарантирует, что мультипараметрическая задача квадратичного программирования решена в пространстве параметров, заданном этими областями значений.
Получите структуру области значений для инициализации
Чтобы получить структуру области значений, где можно указать диапазон для каждого параметра, используйте generateExplicitRange
команда.
range = generateExplicitRange(mpcobj);
-->Converting model to discrete time. -->Assuming output disturbance added to measured output channel #1 is integrated white noise. -->Assuming output disturbance added to measured output channel #2 is integrated white noise. -->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.
Укажите диапазоны для состояний контроллера
Контроллер MPC состояния включает состояния от модели объекта управления, возмущения и шумовой модели, в том порядке. Установка области значений переменной состояния иногда затрудняет, когда состояние не соответствует физическому параметру. В этом случае несколько запусков симуляции объекта разомкнутого цикла с типичной ссылкой и сигналами воздействия рекомендуются для того, чтобы собрать данные, которые отражают области значений состояний.
range.State.Min(:) = -10000; range.State.Max(:) = 10000;
Укажите диапазоны для ссылочных сигналов
Обычно вы знаете практическую область значений ссылочных сигналов, используемых в номинальной рабочей точке на объекте. Области значений, используемые, чтобы сгенерировать явный контроллер MPC, должны быть, по крайней мере, столь же большими как практическая область значений.
range.Reference.Min = [-1;-11]; range.Reference.Max = [1;11];
Укажите диапазоны для переменных, которыми управляют,
Если переменные, которыми управляют, ограничиваются, области значений, используемые, чтобы сгенерировать явный контроллер MPC, должны быть, по крайней мере, столь же большими как эти пределы.
range.ManipulatedVariable.Min = [MV(1).Min; MV(2).Min] - 1; range.ManipulatedVariable.Max = [MV(1).Max; MV(2).Max] + 1;
Создайте явный контроллер MPC
Используйте generateExplicitMPC
команда, чтобы получить явный контроллер MPC с ранее заданными областями значений параметра.
mpcobjExplicit = generateExplicitMPC(mpcobj, range); display(mpcobjExplicit)
Regions found / unexplored: 483/ 0 Explicit MPC Controller --------------------------------------------- Controller sample time: 0.05 (seconds) Polyhedral regions: 483 Number of parameters: 10 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.
Чтобы соединить пары областей, соответствующие усиления которых являются тем же самым и чье объединение является выпуклым набором, используйте simplify
команда с 'exact'
метод. Эта практика может уменьшать объем потребляемой памяти явного контроллера MPC, не жертвуя производительностью.
mpcobjExplicitSimplified = simplify(mpcobjExplicit, 'exact');
display(mpcobjExplicitSimplified)
Regions to analyze: 471/ 471 Explicit MPC Controller --------------------------------------------- Controller sample time: 0.05 (seconds) Polyhedral regions: 471 Number of parameters: 10 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.
Количество кусочных аффинных областей было сокращено.
Можно рассмотреть любой 2D раздел кусочного аффинного раздела, заданного Явным законом о MPC управлении.
Получите структуру параметра графика для инициализации
Чтобы получить структуру параметра, где можно задать который 2D раздел построить, используйте generatePlotParameters
функция.
params = generatePlotParameters(mpcobjExplicitSimplified);
Задайте параметры для 2D графика
В этом примере вы строите угол подачи (4-я переменная состояния) по сравнению с ее ссылкой (2-й ссылочный сигнал). Все другие параметры должны быть зафиксированы в значениях в их соответствующих областях значений.
Зафиксируйте другие переменные состояния.
params.State.Index = [1 2 3 5 6]; params.State.Value = [0 0 0 0 0];
Зафиксируйте другие ссылочные сигналы.
params.Reference.Index = 1; params.Reference.Value = 0;
Зафиксируйте переменные, которыми управляют.
params.ManipulatedVariable.Index = [1 2]; params.ManipulatedVariable.Value = [0 0];
Постройте 2D раздел
Используйте plotSection
команда, чтобы построить 2D раздел, заданный ранее.
plotSection(mpcobjExplicitSimplified,params); axis([-10 10 -10 10]) grid xlabel('Pitch angle (x_4)') ylabel('Reference on pitch angle (r_2)')
Чтобы запустить этот пример, Simulink® требуется.
if ~mpcchecktoolboxinstalled('simulink') disp('Simulink(R) is required to run this example.') return end
Симулируйте управление с обратной связью линейной модели объекта управления в Simulink. Для этого для блока MPC Controller, набор свойство Explicit MPC Controller к mpcobjExplicitSimplified
.
mdl = 'empc_aircraft';
open_system(mdl)
sim(mdl)
Ответ с обратной связью идентичен традиционному контроллеру MPC, спроектированному в Самолете с Нестабильными полюсами.
[1] П. Кэпэзоурис, М. Атэнс и Г. Стайн, "Проект систем управления с обратной связью для нестабильных объектов с насыщением приводов", Proc. IFAC Symp. на Нелинейном Проекте Системы управления, Pergamon Press, стр 302 - 307, 1990
[2] А. Бемпорэд, А. Касавола и Э. Моска, "Нелинейное управление ограниченных линейных систем через прогнозирующее ссылочное управление", IEEE® Trans. Автоматическое управление, издание AC-42, № 3, стр 340-349, 1997.
bdclose(mdl)