Этот пример показывает, как использовать нелинейный образцовый прогнозирующий контроллер, чтобы управлять этиленовым объектом оксидирования, когда он переходит от одной рабочей точки до другого. Кроме того, линейные контроллеры MPC сгенерированы непосредственно от нелинейного диспетчера MPC, чтобы реализовать запланированную на усиление схему управления, которая производит сопоставимую производительность.
Этот пример требует, чтобы программное обеспечение Optimization Toolbox™ решило проблему нелинейного программирования в каждом интервале управления.
if ~mpcchecktoolboxinstalled('optim') disp('Optimization Toolbox is required to run this example.') return end
Этот пример также требует, чтобы программное обеспечение Simulink® моделировало MPC управление этиленовым объектом оксидирования в Simulink.
if ~mpcchecktoolboxinstalled('simulink') disp('Simulink is required to run this example.') return end
Добавьте папку в качестве примера в путь MATLAB®.
addpath(fullfile(matlabroot,'examples','mpc','main'));
Оксидирование этилена (C2H4) к этиленовой окиси (C2H4O) происходит в охлажденной, газовой фазе каталитический реактор. Три реакции происходят одновременно в хорошо смешанной газовой фазе в реакторе:
C2H4 + 0.5*O2 -> C2H4O
C2H4 + 3*O2 -> 2*CO2 + 2*H2O
C2H4O + 2.5*O2 -> 2*CO2 + 2*H2O
Смесь воздуха и этилен питаются постоянно. Объект описан первым принципом нелинейная динамическая модель, реализованная как набор обыкновенных дифференциальных уравнений (ОДУ) в функции oxidationStateFcn
. Для получения дополнительной информации смотрите oxidationStateFcn.m
.
Объект содержит четыре состояния:
Плотность газа в реакторе (x1)
Концентрация C2H4 в реакторе (x2)
Концентрация C2H4O в реакторе (x3)
Температура в реакторе (x4)
Объект имеет два входных параметров:
Общая объемная скорость потока жидкости канала (u1)
Концентрация C2H4 канала (u2)
Объект имеет тот вывод:
Концентрация C2H4O в сточном потоке (y, эквивалентный x3)
Для удобства все переменные в модели предварительно масштабируются, чтобы быть безразмерными. Все состояния измеримы. Уравнения объекта и параметры получены от [1].
В этом примере общая объемная скорость потока жидкости канала (u1) является переменной, которой управляют, (MV), и концентрация C2H4O в сточном потоке (y) является выходной переменной (OV). Хорошая производительность отслеживания y требуется в рабочем диапазоне от 0.03
до 0.05
. Соответствующими u1 значениями является 0.38
и 0.15
, соответственно.
Концентрация C2H4 в потоке канала (u2) является измеренным воздействием. Его номинальной стоимостью является 0.5
, и типичное воздействие имеет размер 0.1
. Контроллер обязан отклонять такое воздействие.
Переменная, которой управляют, u1 имеет диапазон от 0.0704
до 0.7042
из-за ограничений привода.
В целом использование нелинейного MPC с точной нелинейной моделью прогноза обеспечивает производительность сравнительного теста; то есть, лучшее решение для управления можно достигнуть. Однако на практике линейные решения для MPC управления, такие как адаптивный MPC или запланированный на усиление MPC, более в вычислительном отношении эффективны, чем нелинейный MPC. Если ваше линейное решение для управления может поставить сопоставимую производительность, нет никакой потребности реализовать нелинейное решение для управления, особенно в окружении реального времени.
В этом примере вы сначала разрабатываете нелинейный контроллер MPC, чтобы получить производительность сравнительного теста. Позже, вы генерируете несколько линейных объектов MPC от нелинейного диспетчера в различной рабочей точке с помощью функции convertToMPC
. Наконец, вы реализуете запланированный на усиление MPC с помощью этих линейных объектов MPC и сравниваете производительность.
Создайте нелинейный контроллер MPC с состояниями 4
, 1
вывод, 1
управлял переменной, и 1
измерил воздействие.
nlobj = nlmpc(4,1,'MV',1,'MD',2);
Задайте шаг расчета контроллера и прогноз и управляйте горизонтами.
Ts = 5; PredictionHorizon = 10; ControlHorizon = 3; nlobj.Ts = Ts; nlobj.PredictionHorizon = PredictionHorizon; nlobj.ControlHorizon = ControlHorizon;
Задайте нелинейную модель прогноза использование oxidationStateFcn.m
, который является непрерывно-разовой моделью.
nlobj.Model.StateFcn = 'oxidationStateFcn'; nlobj.States(1).Name = 'Den'; nlobj.States(2).Name = 'CE'; nlobj.States(3).Name = 'CEO'; nlobj.States(4).Name = 'Tc';
Задайте выходную функцию, которая возвращает концентрацию C2H4O в сточном потоке (то же самое как x3). Его масштабным коэффициентом является его типичный рабочий диапазон.
nlobj.Model.OutputFcn = @(x,u) x(3);
nlobj.OV.Name = 'CEOout';
nlobj.OV.ScaleFactor = 0.03;
Задайте ограничения мВ на основе ограничений привода контроллера. Его масштабным коэффициентом является его типичный рабочий диапазон.
nlobj.MV.Min = 0.0704;
nlobj.MV.Max = 0.7042;
nlobj.MV.Name = 'Qin';
nlobj.MV.ScaleFactor = 0.6;
Задайте измеренное имя воздействия. Его масштабным коэффициентом является его типичный рабочий диапазон.
nlobj.MD.Name = 'CEin';
nlobj.MD.ScaleFactor = 0.5;
Первоначально объект в рабочей точке равновесия с низкой концентрацией C2H4O (y = 0.03
) в сточном потоке. Найдите начальные значения состояний и выведите использование fsolve
от Optimization Toolbox.
options = optimoptions('fsolve','Display','none'); uLow = [0.38 0.5]; xLow = fsolve(@(x) oxidationStateFcn(x,uLow),[1 0.3 0.03 1],options); yLow = xLow(3);
Подтвердите это, функции модели прогноза не имеют никаких числовых проблем с помощью команды validateFcns
. Подтвердите функции в начальном состоянии и выходных значениях.
validateFcns(nlobj,xLow,uLow(1),uLow(2));
Model.StateFcn is OK. Model.OutputFcn is OK. Analysis of user-provided model, cost, and constraint functions complete.
Задайте ссылочный сигнал в структуре, где это подъемы от 0.03
до 0.05
в секунды 50
во время 100
.
Tstop = 300; time = (0:Ts:(Tstop+PredictionHorizon*Ts))'; r = [yLow*ones(sum(time<100),1);linspace(yLow,yLow+0.02,11)';(yLow+0.02)*ones(sum(time>150),1)]; ref.time = time; ref.signals.values = r;
Чтобы оценить нелинейную производительность MPC, используйте модель Simulink. Блок Nonlinear MPC Controller в модели сконфигурирован, чтобы использовать nlobj
в качестве его контроллера.
mdlNMPC = 'oxidationNMPC';
open_system(mdlNMPC)
Запустите симуляцию и просмотрите вывод.
sim(mdlNMPC)
open_system([mdlNMPC '/y'])
Нелинейный контроллер MPC производит хорошее отслеживание уставки и производительность подавления помех, как ожидалось.
Несмотря на то, что подобное пандусу изменение заданного значения в концентрации C2H4O происходит между 100 и 150 секундами (желтая кривая ступеньки в графике), диспетчер знает об изменении уже в 50 секунд из-за ссылочного предварительного просмотра. Поскольку цель состоит в том, чтобы минимизировать ошибки отслеживания через целый горизонт, диспетчер решает переместить объект, заранее таким образом, что отслеживание ошибки является самым маленьким через горизонт прогноза. Если бы предварительный просмотр отключен, контроллер начал бы реагировать в 100 секунд, которые произвели бы большую ошибку отслеживания.
В этом примере, поскольку все состояния измеримы, полная обратная связь состояния используется нелинейным контроллером MPC. В целом, когда существуют неизмеримые состояния, необходимо разработать нелинейное средство оценки состояния, такое как расширенный фильтр Калмана (EKF) или движущееся средство оценки горизонта (MHE).
На практике, при создании сопоставимой производительности, линейный MPC всегда предпочитается по нелинейному MPC из-за его более высокой эффективности вычисления. Поскольку вы разработали нелинейный контроллер MPC как сравнительный тест, можно преобразовать его в линейный контроллер MPC в определенной рабочей точке.
В этом примере вы генерируете три линейных контроллера MPC с концентрациями C2H4O в 0.03
, 0.04
и 0.05
, соответственно. Во время преобразования нелинейная модель объекта управления линеаризуется в заданной рабочей точке. Все масштабные коэффициенты, линейные ограничения и квадратичные веса, заданные в нелинейном объекте MPC, сохраняются. Однако любая пользовательская нелинейная функция стоимости или пользовательское нелинейное равенство или ограничения неравенства отбрасываются.
Сгенерируйте линейный контроллер MPC в рабочей точке с низкой скоростью преобразования C2H4O y
= 0.03
. Задайте рабочую точку с помощью соответствующих и входных значений состояния, xLow
и uLow
, соответственно.
mpcobjLow = convertToMPC(nlobj,xLow,uLow);
Сгенерируйте линейный контроллер MPC в рабочей точке со средней скоростью преобразования C2H4O y
= 0.04
.
uMedium = [0.24 0.5]; xMedium = fsolve(@(x) oxidationStateFcn(x,uMedium),[1 0.3 0.03 1],options); mpcobjMedium = convertToMPC(nlobj,xMedium,uMedium);
Сгенерируйте линейный контроллер MPC в рабочей точке с высокой скоростью преобразования C2H4O y
= 0.05
.
uHigh = [0.15 0.5]; xHigh = fsolve(@(x) oxidationStateFcn(x,uHigh),[1 0.3 0.03 1],options); mpcobjHigh = convertToMPC(nlobj,xHigh,uHigh);
Реализуйте запланированное на усиление решение MPC с помощью трех сгенерированных линейных контроллеров MPC. Схема планирования:
Если y ниже, чем 0,035, используйте mpcobjLow
.
Если y выше, чем 0,045, используйте mpcobjHigh
.
В противном случае используйте mpcobjMedium
.
Чтобы оценить запланированную на усиление производительность контроллера, используйте другую модель Simulink.
mdlMPC = 'oxidationMPC';
open_system(mdlMPC)
Запустите симуляцию и просмотрите вывод.
sim(mdlMPC)
open_system([mdlMPC '/y'])
-->Converting model to discrete time. -->Assuming output disturbance added to measured output channel #1 is integrated white noise. -->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel. -->Converting model to discrete time. -->Assuming output disturbance added to measured output channel #1 is integrated white noise. -->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel. -->Converting model to discrete time. -->Assuming output disturbance added to measured output channel #1 is integrated white noise. -->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.
Запланированный на усиление контроллер производит сопоставимое отслеживание уставки и производительность подавления помех.
Этот пример иллюстрирует общий рабочий процесс к:
Разработайте и моделируйте нелинейный контроллер MPC в MATLAB и Simulink для производительности управления сравнительным тестом.
Используйте нелинейный объект MPC непосредственно сгенерировать линейные контроллеры MPC в желаемых рабочих точках.
Реализуйте запланированную на усиление схему MPC управления с помощью этих контроллеров.
Если производительность запланированного на усиление контроллера сопоставима с тем из нелинейного контроллера, можно чувствовать себя, уверенно реализовывая линейное решение для управления нелинейной проблемы управления.
Удалите папку в качестве примера из пути MATLAB и близкую модель Simulink.
rmpath(fullfile(matlabroot,'examples','mpc','main')); bdclose(mdlNMPC)
[1] Х. Дуранд, М. Эллис, П. Д. Кристофайдс. "Экономические образцовые прогнозирующие системы управления для входной ограничительной обработки скорости изменения и гарантируемых экономических показателей". Компьютеры и Химическое машиностроение, Издание 92, 2016, стр 18-36.
Нелинейный контроллер MPC | nlmpc