nlmpc

Нелинейный прогнозирующий контроллер модели

Описание

Нелинейный прогнозирующий контроллер модели вычисляет оптимальное управление, преодолевает горизонт прогноза с помощью нелинейной модели прогноза, нелинейной функции стоимости и нелинейных ограничений. Для получения дополнительной информации о нелинейном MPC смотрите Нелинейный MPC.

Создание

Описание

пример

nlobj = nlmpc(nx,ny,nu) создает nlmpc возразите, чья модель прогноза имеет nx состояния, ny выходные параметры и nu входные параметры, где все входные параметры являются переменными, которыми управляют. Используйте этот синтаксис, если ваша модель не имеет никаких измеренных или неизмеренных входных параметров воздействия.

nlobj = nlmpc(nx,ny,'MV',mvIndex,'MD',mdIndex) создает nlmpc возразите, чья модель прогноза измерила входные параметры воздействия. Задайте входные индексы для переменных, которыми управляют, mvIndex, и измеренные воздействия, mdIndex.

nlobj = nlmpc(nx,ny,'MV',mvIndex,'UD',udIndex) создает nlmpc возразите, чья модель прогноза имеет неизмеренные входные параметры воздействия. Задайте входные индексы для переменных, которыми управляют, и неизмеренных воздействий, udIndex.

пример

nlobj = nlmpc(nx,ny,'MV',mvIndex,'MD',mdIndex,'UD',udIndex) создает nlmpc возразите, чья модель прогноза и измерилась и неизмеренные входные параметры воздействия. Задайте входные индексы для переменных, которыми управляют, измеренных воздействий и неизмеренных воздействий.

Входные параметры

развернуть все

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

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

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

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

Объединенный набор индексов от mvIndex, mdIndex, и udIndex должен содержать все целые числа от 1 через Nu, где Nu является количеством входных параметров модели прогноза.

Измеренные индексы воздействия, заданные как вектор положительных целых чисел. Вы не можете изменить эти индексы после создания объекта контроллера. Это значение хранится в Dimensions.MDIndex свойство контроллера.

Объединенный набор индексов от mvIndex, mdIndex, и udIndex должен содержать все целые числа от 1 через Nu, где Nu является количеством входных параметров модели прогноза.

Неизмеренные индексы воздействия, заданные как вектор положительных целых чисел. Вы не можете изменить эти индексы после создания объекта контроллера. Это значение хранится в Dimensions.UDIndex свойство контроллера.

Объединенный набор индексов от mvIndex, mdIndex, и udIndex должен содержать все целые числа от 1 через Nu, где Nu является количеством входных параметров модели прогноза.

Свойства

развернуть все

Шаг расчета модели Prediction, заданный как положительный конечный скаляр. Диспетчер использует модель дискретного времени с шагом расчета Ts для прогноза. Если вы задаете модель прогноза непрерывного времени (Model.IsContinuousTime true), затем контроллер дискретизирует модель с помощью встроенного неявного метода трапеций с шагом расчета Ts.

Шаги горизонта прогноза, заданные как положительное целое число. Продукт PredictionHorizon и Ts время прогноза; то есть, как далеко контроллер изучает будущее.

Управляйте горизонтом, заданным как одно из следующего:

  • Положительное целое число, m, между 1 и p, включительно, где p равен PredictionHorizon. В этом случае контроллер вычисляет m свободные перемещения управления, происходящие во времена k через k +m-1, и содержит выход контроллера, постоянный для остающихся шагов горизонта прогноза от k +m через k +p-1. Здесь, k является текущим интервалом управления.

  • Вектор положительных целых чисел [m 1, m 2, …], задавая длины блокирующихся интервалов. По умолчанию контроллер вычисляет блоки M свободных перемещений, где M является количеством блокирующихся интервалов. Первое свободное перемещение применяется ко временам k через k +m1-1, второе свободное перемещение применяется со времени k +m1 через k +m1+m2-1 и так далее. Используя перемещения блока может улучшить робастность вашего контроллера. Сумма значений в ControlHorizon должен совпадать с горизонтом прогноза p. Если вы задаете вектор, сумма которого:

    • Меньше, чем горизонт прогноза, затем контроллер добавляет блокирующийся интервал. Длина этого интервала такова, что суммой длин интервала является p. Например, если p =10 и вы задаете горизонт управления ControlHorizon=[1 2 3], затем диспетчер использует четыре интервала с длинами [1 2 3 4].

    • Больше, чем горизонт прогноза, затем интервалы являются усеченными, пока сумма длин интервала не равна p. Например, если p =10 и вы задаете горизонт управления ControlHorizon= [1 2 3 6 7], затем диспетчер использует четыре интервала с длинами [1 2 3 4].

Кусочные постоянные перемещения блокирования часто слишком строги для оптимальных приложений планирования пути. Чтобы произвести менее - строгая, лучше обусловленная проблема нелинейного программирования, можно задать кусочные линейные переменные интервалы блокирования, которыми управляют. Для этого установите Optimization.MVInterpolationOrder свойство вашего nlmpc объект контроллера к 1.

Для получения дополнительной информации о том, как переменное блокирование, которым управляют, работает с различными методами интерполяции, смотрите Переменное Блокирование, которым Управляют.

Это свойство доступно только для чтения.

Размерная информация модели Prediction, указанная, когда контроллер создается и хранится как структура со следующими полями.

Количество состояний в модели прогноза, заданной как положительное целое число. Это значение соответствует nx.

Количество выходных параметров в модели прогноза, заданной как положительное целое число. Это значение соответствует ny.

Количество входных параметров в модели прогноза, заданной как положительное целое число. Это значение соответствует любому nmv или сумма длин mvIndex, mdIndex, и udIndex.

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

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

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

Модель Prediction, заданная как структура со следующими полями.

Функция состояния, заданная как строка, вектор символов или указатель на функцию. Для модели прогноза непрерывного времени, StateFcn производная функция состояния. Для модели прогноза дискретного времени, StateFcn функция обновления состояния.

Если ваша функция состояния является непрерывным временем, контроллер автоматически дискретизирует модель с помощью неявного метода трапеций. Этот метод может обработать умеренно жесткие модели, и его точность прогноза зависит от шага расчета контроллера Ts; то есть, время большой выборки приводит к неточному прогнозу.

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

Можно задать функцию состояния одним из следующих способов:

  • Имя функции в текущей рабочей папке или на пути MATLAB®, заданном как строка или вектор символов

    Model.StateFcn = "myStateFunction";
  • Обработайте к функции в текущей рабочей папке или на пути MATLAB

    Model.StateFcn = @myStateFunction;
  • Анонимная функция

    Model.StateFcn = @(x,u,params) myStateFunction(x,u,params)

Для получения дополнительной информации смотрите, Задают Модель Прогноза для Нелинейного MPC.

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

Примечание

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

Можно задать выходную функцию одним из следующих способов:

  • Имя функции в текущей рабочей папке или на пути MATLAB, заданном как строка или вектор символов

    Model.OutputFcn = "myOutputFunction";
  • Обработайте к функции в текущей рабочей папке или на пути MATLAB

    Model.OutputFcn = @myOutputFunction;
  • Анонимная функция

    Model.OutputFcn = @(x,u,params) myOutputFunction(x,u,params)

Для получения дополнительной информации смотрите, Задают Модель Прогноза для Нелинейного MPC.

Отметьте указание на временной интервал модели прогноза, заданный как одно из следующего:

  • true — Модель прогноза непрерывного времени. В этом случае контроллер автоматически дискретизирует модель во время прогноза с помощью Ts.

  • false — Модель прогноза дискретного времени. В этом случае, Ts шаг расчета модели.

Примечание

IsContinuousTime должно быть сопоставимо с функциями, заданными в Model.StateFcn и Model.OutputFcn.

Количество дополнительных параметров модели используется моделью прогноза, пользовательской функцией стоимости и пользовательскими ограничительными функциями, заданными как неотрицательное целое число. Количество параметров включает все параметры, используемые этими функциями. Например, если функция состояния использует только параметр p1, ограничительные функции используют только параметр p2, и функция стоимости использует только параметр p3, затем NumberOfParameters 3.

Информация состояния, границы и масштабные коэффициенты, заданные как массив структур с элементами Nx, где Nx является количеством состояний. Каждый элемент структуры имеет следующие поля.

Нижняя граница состояния, заданная как скаляр или вектор. По умолчанию нижняя граница неограничена.

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

Чтобы варьироваться связанное по горизонту прогноза со времени k +1 ко времени k +p, задайте вектор до значений p. Здесь, k является текущим временем, и p является горизонтом прогноза. Если вы задаете меньше, чем значения p, связанный финал используется в остающихся шагах горизонта прогноза.

Границы состояния всегда являются трудными ограничениями.

Верхняя граница состояния, заданная как скаляр или вектор. По умолчанию верхняя граница неограничена.

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

Чтобы варьироваться связанное по горизонту прогноза со времени k +1 ко времени k +p, задайте вектор до значений p. Здесь, k является текущим временем, и p является горизонтом прогноза. Если вы задаете меньше, чем значения p, связанный финал используется в остающихся шагах горизонта прогноза.

Границы состояния всегда являются трудными ограничениями.

Имя состояния, заданное как строка или вектор символов. Именем состояния по умолчанию является "x#", где # его индекс состояния.

Модули состояния, заданные как строка или вектор символов.

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

Информация о выходной переменной (OV), границы и масштабные коэффициенты, заданные как массив структур с элементами Ny, где Ny является количеством выходных переменных. Чтобы получить доступ к этому свойству, можно использовать псевдоним OV вместо OutputVariables.

Каждый элемент структуры имеет следующие поля.

Нижняя граница OV, заданная как скаляр или вектор. По умолчанию эта нижняя граница неограничена.

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

Чтобы варьироваться связанное по горизонту прогноза со времени k +1 ко времени k +p, задайте вектор до значений p. Здесь, k является текущим временем, и p является горизонтом прогноза. Если вы задаете меньше, чем значения p, связанный финал используется в остающихся шагах горизонта прогноза.

Верхняя граница OV, заданная как скаляр или вектор. По умолчанию эта верхняя граница неограничена.

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

Чтобы варьироваться связанное по горизонту прогноза со времени k +1 ко времени k +p, задайте вектор до значений p. Здесь, k является текущим временем, и p является горизонтом прогноза. Если вы задаете меньше, чем значения p, связанный финал используется в остающихся шагах горизонта прогноза.

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

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

Чтобы варьироваться значение ECR по горизонту прогноза со времени k +1 ко времени k +p, задайте вектор до значений p. Здесь, k является текущим временем, и p является горизонтом прогноза. Если вы задаете меньше, чем значения p, итоговое значение ECR используется в остающихся шагах горизонта прогноза.

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

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

Чтобы варьироваться значение ECR по горизонту прогноза со времени k +1 ко времени k +p, задайте вектор до значений p. Здесь, k является текущим временем, и p является горизонтом прогноза. Если вы задаете меньше, чем значения p, итоговое значение ECR используется в остающихся шагах горизонта прогноза.

Имя OV, заданное как строка или вектор символов. Именем OV по умолчанию является "y#", где # его выходной индекс.

Модули OV, заданные как строка или вектор символов.

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

Информация о Переменной, которой управляют, (MV), границы и масштабные коэффициенты, заданные как массив структур с элементами Nmv, где Nmv является количеством переменных, которыми управляют. Чтобы получить доступ к этому свойству, можно использовать псевдоним MV вместо ManipulatedVariables.

Каждый элемент структуры имеет следующие поля.

Нижняя граница мВ, заданная как скаляр или вектор. По умолчанию эта нижняя граница неограничена.

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

Чтобы варьироваться связанное по горизонту прогноза со времени k ко времени k +p-1, задайте вектор до значений p. Здесь, k является текущим временем, и p является горизонтом прогноза. Если вы задаете меньше, чем значения p, связанный финал используется в остающихся шагах горизонта прогноза.

Верхняя граница мВ, заданная как скаляр или вектор. По умолчанию эта верхняя граница неограничена.

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

Чтобы варьироваться связанное по горизонту прогноза со времени k ко времени k +p-1, задайте вектор до значений p. Здесь, k является текущим временем, и p является горизонтом прогноза. Если вы задаете меньше, чем значения p, связанный финал используется в остающихся шагах горизонта прогноза.

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

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

Чтобы варьироваться значение ECR по горизонту прогноза со времени k ко времени k +p-1, задайте вектор до значений p. Здесь, k является текущим временем, и p является горизонтом прогноза. Если вы задаете меньше, чем значения p, итоговое значение ECR используется в остающихся шагах горизонта прогноза.

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

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

Чтобы варьироваться значение ECR по горизонту прогноза со времени k ко времени k +p-1, задайте вектор до значений p. Здесь, k является текущим временем, и p является горизонтом прогноза. Если вы задаете меньше, чем значения p, итоговое значение ECR используется в остающихся шагах горизонта прогноза.

Нижняя граница скорости изменения мВ, заданная как неположительный скаляр или вектор. Скорость изменения мВ задана как MV (k) - MV (k-1), где k является текущим временем. По умолчанию эта нижняя граница неограничена.

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

Чтобы варьироваться связанное по горизонту прогноза со времени k ко времени k +p-1, задайте вектор до значений p. Здесь, k является текущим временем, и p является горизонтом прогноза. Если вы задаете меньше, чем значения p, связанный финал используется в остающихся шагах горизонта прогноза.

Верхняя граница скорости изменения мВ, заданная как неотрицательный скаляр или вектор. Скорость изменения мВ задана как MV (k) - MV (k-1), где k является текущим временем. По умолчанию эта нижняя граница неограничена.

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

Чтобы варьироваться связанное по горизонту прогноза со времени k ко времени k +p-1, задайте вектор до значений p. Здесь, k является текущим временем, и p является горизонтом прогноза. Если вы задаете меньше, чем значения p, связанный финал используется в остающихся шагах горизонта прогноза.

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

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

Чтобы варьироваться значения ECR по горизонту прогноза со времени k ко времени k +p-1, задайте вектор до значений p. Здесь, k является текущим временем, и p является горизонтом прогноза. Если вы задаете меньше, чем значения p, итоговые значения ECR используются в остающихся шагах горизонта прогноза.

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

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

Чтобы варьироваться значения ECR по горизонту прогноза со времени k ко времени k +p-1, задайте вектор до значений p. Здесь, k является текущим временем, и p является горизонтом прогноза. Если вы задаете меньше, чем значения p, итоговые значения ECR используются в остающихся шагах горизонта прогноза.

Имя мВ, заданное как строка или вектор символов. Именем мВ по умолчанию является "u#", где # его входной индекс.

Модули мВ, заданные как строка или вектор символов.

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

Информация об измеренном воздействии (MD) и масштабные коэффициенты, заданные как массив структур с элементами Nmd, где Nmd является количеством измеренных воздействий. Если ваша модель не имеет измеренных воздействий, то MeasuredDisturbances []. Чтобы получить доступ к этому свойству, можно использовать псевдоним MD вместо MeasuredDisturbances.

Каждый элемент структуры имеет следующие поля.

Имя MD, заданное как строка или вектор символов. Именем MD по умолчанию является "u#", где # его входной индекс.

Модули MD, заданные как строка или вектор символов.

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

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

Примечание

Если вы задаете пользовательскую функцию стоимости с помощью Optimization.CustomCostFcn и набор Optimization.ReplaceStandardCost к true, затем контроллер игнорирует стандартные настраивающие веса функции стоимости в Weights.

Weights имеет следующие поля.

Переменные настраивающие веса, которыми управляют, которые штрафуют отклонения от целей мВ, заданных как вектор-строка или массив неотрицательных значений. Весом по умолчанию для всех переменных, которыми управляют, является 0.

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

Чтобы варьироваться настраивающиеся веса по горизонту прогноза со времени k ко времени k +p-1, задайте массив со столбцами Nmv и до строк p. Здесь, k является текущим временем, и p является горизонтом прогноза. Каждая строка содержит переменные настраивающие веса, которыми управляют, для одного шага горизонта прогноза. Если вы задаете меньше, чем строки p, веса в итоговой строке используются в остающихся шагах горизонта прогноза.

Чтобы задать цели мВ во время выполнения, создайте nlmpcmoveopt объект и набор его MVTarget свойство.

Настраивающие веса с плавающей ставкой, которыми управляют, которые штрафуют большие изменения в перемещениях управления, заданных как вектор-строка или массив неотрицательных значений. Весом по умолчанию для всех плавающих курсов, которыми управляют, является 0.1.

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

Чтобы варьироваться настраивающиеся веса по горизонту прогноза со времени k ко времени k +p-1, задайте массив со столбцами Nmv и до строк p. Здесь, k является текущим временем, и p является горизонтом прогноза. Каждая строка содержит настраивающие веса с плавающей ставкой, которыми управляют, для одного шага горизонта прогноза. Если вы задаете меньше, чем строки p, веса в итоговой строке используются в остающихся шагах горизонта прогноза.

Настраивающие веса выходной переменной, которые штрафуют отклонение от выходных ссылок, заданных как вектор-строка или массив неотрицательных значений. Весом по умолчанию для всех выходных переменных является 1.

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

Чтобы варьироваться настраивающиеся веса по горизонту прогноза со времени k +1 ко времени k +p, задайте массив со столбцами Ny и до строк p. Здесь, k является текущим временем, и p является горизонтом прогноза. Каждая строка содержит настраивающие веса выходной переменной для одного шага горизонта прогноза. Если вы задаете меньше, чем строки p, веса в итоговой строке используются в остающихся шагах горизонта прогноза.

Ослабьте переменный настраивающий вес, заданный как положительная скалярная величина.

Пользовательские функции оптимизации и решатель, заданный как структура со следующими полями.

Пользовательская функция стоимости, заданная как одно из следующего:

  • Имя функции в текущей рабочей папке или на пути MATLAB, заданном как строка или вектор символов

    Optimization.CustomCostFcn = "myCostFunction";
  • Обработайте к функции в текущей рабочей папке или на пути MATLAB

    Optimization.CustomCostFcn = @myCostFunction;
  • Анонимная функция

    Optimization.CustomCostFcn = @(X,U,e,data,params) myCostFunction(X,U,e,data,params);

Ваша функция стоимости должна иметь подпись:

function J = myCostFunction(X,U,e,data,params)

Для получения дополнительной информации смотрите, Задают Функцию стоимости для Нелинейного MPC.

Отметьте указание, заменить ли стандартную функцию стоимости на пользовательскую функцию стоимости, заданную как одно из следующего:

  • true — Диспетчер использует одну только пользовательскую стоимость в качестве целевой функции во время оптимизации. В этом случае, Weights свойство контроллера проигнорировано.

  • false — Диспетчер использует сумму стандартной стоимости и пользовательской стоимости как целевая функция во время оптимизации.

Если вы не задаете пользовательскую функцию стоимости с помощью CustomCostFcn, затем контроллер игнорирует RepalceStandardCost.

Для получения дополнительной информации смотрите, Задают Функцию стоимости для Нелинейного MPC.

Пользовательская функция ограничения равенства, заданная как одно из следующего:

  • Имя функции в текущей рабочей папке или на пути MATLAB, заданном как строка или вектор символов

    Optimization.CustomEqConFcn = "myEqConFunction";
  • Обработайте к функции в текущей рабочей папке или на пути MATLAB

    Optimization.CustomEqConFcn = @myEqConFunction;
  • Анонимная функция

    Optimization.CustomEqConFcn = @(X,U,data,params) myEqConFunction(X,U,data,params);

Ваша функция ограничения равенства должна иметь подпись:

function ceq = myEqConFunction(X,U,data,p1,p2,...)

Для получения дополнительной информации смотрите, Задают Ограничения для Нелинейного MPC.

Пользовательская функция ограничения неравенства, заданная как одно из следующего:

  • Имя функции в текущей рабочей папке или на пути MATLAB, заданном как строка или вектор символов

    Optimization.CustomIneqConFcn = "myIneqConFunction";
  • Обработайте к функции в текущей рабочей папке или на пути MATLAB

    Optimization.CustomIneqConFcn = @myIneqConFunction;
  • Анонимная функция

    Optimization.CustomIneqConFcn = @(X,U,data,params) myIneqConFunction(X,U,data,params);

Ваша функция ограничения равенства должна иметь подпись:

function cineq = myIneqConFunction(X,U,data,params)

Для получения дополнительной информации смотрите, Задают Ограничения для Нелинейного MPC.

Пользовательская функция решателя нелинейного программирования, заданная как строка, вектор символов или указатель на функцию. Если у вас нет программного обеспечения Optimization Toolbox™, необходимо задать собственный решатель нелинейного программирования. Можно задать пользовательскую функцию решателя одним из следующих способов:

  • Имя функции в текущей рабочей папке или на пути MATLAB, заданном как строка или вектор символов

    Optimization.CustomSolverFcn = "myNLPSolver";
  • Обработайте к функции в текущей рабочей папке или на пути MATLAB

    Optimization.CustomSolverFcn = @myNLPSolver;

Для получения дополнительной информации смотрите, Конфигурируют Решатель Оптимизации для Нелинейного MPC.

Опции решателя, заданные как опции, возражают для fmincon или [].

Если у вас есть программное обеспечение Optimization Toolbox, SolverOptions содержит объект опций для fmincon решатель.

Если у вас нет Optimization Toolbox, SolverOptions [].

Для получения дополнительной информации смотрите, Конфигурируют Решатель Оптимизации для Нелинейного MPC.

Отметьте указание, симулировать ли как линейный контроллер, заданный как одно из следующего:

  • "off" — Симулируйте контроллер как нелинейный контроллер с нелинейной моделью прогноза.

  • "Adaptive" — Для каждого интервала управления линейная модель получается из заданных нелинейных и выходных функций состояния при текущей рабочей точке и используется через горизонт прогноза. Чтобы определить, предоставляет ли адаптивный контроллер MPC сопоставимую производительность нелинейному контроллеру, используйте эту опцию. Для получения дополнительной информации об адаптивном MPC смотрите Адаптивный MPC.

  • "TimeVarying" — Для каждого интервала управления p линейные модели получены из заданных нелинейных и выходных функций состояния при рабочих точках p, предсказанных от предыдущего интервала, один для каждого шага горизонта прогноза. Чтобы определить, предоставляет ли линейный изменяющийся во времени контроллер MPC сопоставимую производительность нелинейному контроллеру, используйте эту опцию. Для получения дополнительной информации об изменяющемся во времени MPC смотрите Изменяющийся во времени MPC.

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

Для примера, который симулирует нелинейный контроллер MPC как линейный контроллер, смотрите Оптимизацию и Управление Пакетного ФРС Реактора Используя Нелинейный MPC.

Отметьте указание, приемлемо ли субоптимальное решение, задано как логическое значение. Когда решатель нелинейного программирования достигает максимального количества итераций, не находя решение (выходным флагом является 0), контроллер:

  • Замораживает значения мВ если UseSuboptimalSolution false

  • Применяет субоптимальное решение, найденное решателем после итоговой итерации если UseSuboptimalSolution true

Чтобы задать максимальное количество итераций, используйте Optimization.SolverOptions.MaxIter.

Порядок линейной интерполяции используется перемещениями блока, заданными как одно из следующего:

  • 0 — Используйте кусочные постоянные переменные интервалы, которыми управляют.

  • 1 — Используйте кусочные линейные переменные интервалы, которыми управляют.

Если горизонт управления является скаляром, то контроллер игнорирует MVInterpolationOrder.

Для получения дополнительной информации о переменном блокировании, которым управляют смотрите Переменное Блокирование, которым Управляют.

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

Jacobian структура содержит следующие поля.

Якобиан функционального z состояния от Model.StateFcn, заданный как одно из следующих

  • Имя функции в текущей рабочей папке или на пути MATLAB, заданном как строка или вектор символов

    Model.StateFcn = "myStateJacobian";
  • Обработайте к функции в текущей рабочей папке или на пути MATLAB

    Model.StateFcn = @myStateJacobian;
  • Анонимная функция

    Model.StateFcn = @(x,u,params) myStateJacobian(x,u,params)

Для получения дополнительной информации смотрите, Задают Модель Прогноза для Нелинейного MPC.

Якобиан выходной функции y от Model.OutputFcn, заданный как одно из следующего:

  • Имя функции в текущей рабочей папке или на пути MATLAB, заданном как строка или вектор символов

    Model.StateFcn = "myOutputJacobian";
  • Обработайте к функции в текущей рабочей папке или на пути MATLAB

    Model.StateFcn = @myOutputJacobian;
  • Анонимная функция

    Model.StateFcn = @(x,u,params) myOutputJacobian(x,u,params)

Для получения дополнительной информации смотрите, Задают Модель Прогноза для Нелинейного MPC.

Якобиан пользовательской функции стоимости J от Optimization.CustomCostFcn, заданный как одно из следующего:

  • Имя функции в текущей рабочей папке или на пути MATLAB, заданном как строка или вектор символов

    Jacobian.CustomCostFcn = "myCostJacobian";
  • Обработайте к функции в текущей рабочей папке или на пути MATLAB

    Jacobian.CustomCostFcn = @myCostJacobian;
  • Анонимная функция

    Jacobian.CustomCostFcn = @(X,U,e,data,params) myCostJacobian(X,U,e,data,params)

Ваша Функция Якоби стоимости должна иметь подпись:

function [G,Gmv,Ge] = myCostJacobian(X,U,e,data,params)

Для получения дополнительной информации смотрите, Задают Функцию стоимости для Нелинейного MPC.

Якобиан пользовательских ограничений равенства ceq от Optimization.CustomEqConFcn, заданный как одно из следующего:

  • Имя функции в текущей рабочей папке или на пути MATLAB, заданном как строка или вектор символов

    Jacobian.CustomEqConFcn = "myEqConJacobian";
  • Обработайте к функции в текущей рабочей папке или на пути MATLAB

    Jacobian.CustomEqConFcn = @myEqConJacobian;
  • Анонимная функция

    Jacobian.CustomEqConFcn = @(X,U,data,params) myEqConJacobian(X,U,data,params);

Ваша Функция Якоби ограничения равенства должна иметь подпись:

function [G,Gmv] = myEqConJacobian(X,U,data,params)

Для получения дополнительной информации смотрите, Задают Ограничения для Нелинейного MPC.

Якобиан пользовательских ограничений неравенства c от Optimization.CustomIneqConFcn, заданный как одно из следующего:

  • Имя функции в текущей рабочей папке или на пути MATLAB, заданном как строка или вектор символов

    Jacobian.CustomEqConFcn = "myIneqConJacobian";
  • Обработайте к функции в текущей рабочей папке или на пути MATLAB

    Jacobian.CustomEqConFcn = @myIneqConJacobian;
  • Анонимная функция

    Jacobian.CustomEqConFcn = @(X,U,data,params) myIneqConJacobian(X,U,data,params);

Ваша Функция Якоби ограничения неравенства должна иметь подпись:

function [G,Gmv,Ge] = myIneqConJacobian(X,U,data,params)

Для получения дополнительной информации смотрите, Задают Ограничения для Нелинейного MPC.

Функции объекта

nlmpcmoveВычислите действие оптимального управления для нелинейного контроллера MPC
validateFcnsИсследуйте прогноз и пользовательские функции модели объекта nlmpc для потенциальных проблем
convertToMPCПреобразуйте объект nlmpc в один или несколько объектов mpc
createParameterBusСоздайте шину Simulink, возражают и конфигурируют блок Bus Creator для передачи параметров модели с блоком Nonlinear MPC Controller

Примеры

свернуть все

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

nx = 4;
ny = 2;
nu = 1;
nlobj = nlmpc(nx,ny,nu);
In standard cost function, zero weights are applied by default to one or more OVs because there are fewer MVs than OVs.

Задайте шаг расчета и горизонты контроллера.

Ts = 0.1;
nlobj.Ts = Ts;
nlobj.PredictionHorizon = 10;
nlobj.ControlHorizon = 5;

Задайте функцию состояния для контроллера, который находится в файле pendulumDT0.m. Эта модель дискретного времени интегрирует непрерывную модель времени, заданную в pendulumCT0.m использование многоступенчатого прямого Метода Эйлера.

nlobj.Model.StateFcn = "pendulumDT0";
nlobj.Model.IsContinuousTime = false;

Функция состояния дискретного времени использует дополнительный параметр, шаг расчета Ts, интегрировать модель непрерывного времени. Поэтому необходимо задать количество дополнительных параметров как 1.

nlobj.Model.NumberOfParameters = 1;

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

nlobj.Model.OutputFcn = @(x,u,Ts) [x(1); x(3)];

Подтвердите функции модели прогноза для номинальных состояний x0 и номинал вводит u0. Поскольку модель прогноза использует пользовательский параметр, необходимо передать этот параметр validateFcns.

x0 = [0.1;0.2;-pi/2;0.3];
u0 = 0.4;
validateFcns(nlobj, x0, u0, [], {Ts});
Model.StateFcn is OK.
Model.OutputFcn is OK.
Analysis of user-provided model, cost, and constraint functions complete.

Создайте нелинейный контроллер MPC с тремя состояниями, одним выходом и четырьмя входными параметрами. Первые два входных параметров являются измеренными воздействиями, третий вход является переменной, которой управляют, и четвертый вход является неизмеренным воздействием.

nlobj = nlmpc(3,1,'MV',3,'MD',[1 2],'UD',4);

Чтобы просмотреть состояние контроллера, выведите, и введите размерности и индексы, используйте Dimensions свойство контроллера.

nlobj.Dimensions
ans = struct with fields:
     NumberOfStates: 3
    NumberOfOutputs: 1
     NumberOfInputs: 4
            MVIndex: 3
            MDIndex: [1 2]
            UDIndex: 4

Задайте шаг расчета контроллера и горизонты.

nlobj.Ts = 0.5;
nlobj.PredictionHorizon = 6;
nlobj.ControlHorizon = 3;

Задайте функцию состояния модели прогноза, которая находится в файле exocstrStateFcnCT.m.

nlobj.Model.StateFcn = 'exocstrStateFcnCT';

Задайте выходную функцию модели прогноза, которая находится в файле exocstrOutputFcn.m.

nlobj.Model.OutputFcn = 'exocstrOutputFcn';

Подтвердите функции модели прогноза с помощью начальной рабочей точки в качестве номинального условия для тестирования и установки неизмеренного состояния воздействия, x0(3), к 0. Поскольку модель измерила воздействия, необходимо передать их validateFcns.

x0 = [311.2639; 8.5698; 0];
u0 = [10; 298.15; 298.15];
validateFcns(nlobj,x0,u0(3),u0(1:2)');
Model.StateFcn is OK.
Model.OutputFcn is OK.
Analysis of user-provided model, cost, and constraint functions complete.

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

nx = 6;
ny = 6;
nu = 4;
nlobj = nlmpc(nx,ny,nu);
In standard cost function, zero weights are applied by default to one or more OVs because there are fewer MVs than OVs.

Задайте шаг расчета контроллера и горизонты.

Ts = 0.4;
p = 30;
c = 4;
nlobj.Ts = Ts;
nlobj.PredictionHorizon = p;
nlobj.ControlHorizon = c;

Задайте функцию состояния модели прогноза и якобиан функции состояния. В данном примере используйте модель летающего робота.

nlobj.Model.StateFcn = "FlyingRobotStateFcn";
nlobj.Jacobian.StateFcn = "FlyingRobotStateJacobianFcn";

Задайте пользовательскую функцию стоимости для контроллера, который заменяет стандартную функцию стоимости.

nlobj.Optimization.CustomCostFcn = @(X,U,e,data) Ts*sum(sum(U(1:p,:)));
nlobj.Optimization.ReplaceStandardCost = true;

Задайте пользовательскую ограничительную функцию для контроллера.

nlobj.Optimization.CustomEqConFcn = @(X,U,data) X(end,:)';

Подтвердите модель прогноза и пользовательские функции в начальных состояниях (x0) и начальные входные параметры (u0) из робота.

x0 = [-10;-10;pi/2;0;0;0];
u0 = zeros(nu,1); 
validateFcns(nlobj,x0,u0);
Model.StateFcn is OK.
Jacobian.StateFcn is OK.
No output function specified. Assuming "y = x" in the prediction model.
Optimization.CustomCostFcn is OK.
Optimization.CustomEqConFcn is OK.
Analysis of user-provided model, cost, and constraint functions complete.

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

nlobj = nlmpc(4,1,'MV',1,'MD',2);

Задайте шаг расчета контроллера и горизонты.

nlobj.PredictionHorizon = 10;
nlobj.ControlHorizon = 3;

Задайте функцию состояния модели прогноза.

nlobj.Model.StateFcn = 'oxidationStateFcn';

Задайте выходную функцию модели прогноза и масштабный коэффициент выходной переменной.

nlobj.Model.OutputFcn = @(x,u) x(3);
nlobj.OutputVariables.ScaleFactor = 0.03;

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

nlobj.ManipulatedVariables.Min = 0.0704;
nlobj.ManipulatedVariables.Max = 0.7042;
nlobj.ManipulatedVariables.ScaleFactor = 0.6;

Задайте измеренный масштабный коэффициент воздействия.

nlobj.MeasuredDisturbances.ScaleFactor = 0.5;

Вычислите состояние и введите условия работы для трех линейных контроллеров MPC, использующих fsolve функция.

options = optimoptions('fsolve','Display','none');

uLow = [0.38 0.5];
xLow = fsolve(@(x) oxidationStateFcn(x,uLow),[1 0.3 0.03 1],options);

uMedium = [0.24 0.5];
xMedium = fsolve(@(x) oxidationStateFcn(x,uMedium),[1 0.3 0.03 1],options);

uHigh = [0.15 0.5];
xHigh = fsolve(@(x) oxidationStateFcn(x,uHigh),[1 0.3 0.03 1],options);

Создайте линейные контроллеры MPC для каждого из этих номинальных условий.

mpcobjLow = convertToMPC(nlobj,xLow,uLow);
mpcobjMedium = convertToMPC(nlobj,xMedium,uMedium);
mpcobjHigh = convertToMPC(nlobj,xHigh,uHigh);

Можно также создать несколько контроллеров, использующих массивы номинальных условий. Количество строк в массивах задает контроллеры номера, чтобы создать. Линейные контроллеры возвращены как массив ячеек mpc объекты.

u = [uLow; uMedium; uHigh];
x = [xLow; xMedium; xHigh];
mpcobjs = convertToMPC(nlobj,x,u);

Просмотрите свойства mpcobjLow контроллер.

mpcobjLow
 
MPC object (created on 23-Dec-2019 11:44:04):
---------------------------------------------
Sampling time:      1 (seconds)
Prediction Horizon: 10
Control Horizon:    3

Plant Model:        
                                      --------------
      1  manipulated variable(s)   -->|  4 states  |
                                      |            |-->  1 measured output(s)
      1  measured disturbance(s)   -->|  2 inputs  |
                                      |            |-->  0 unmeasured output(s)
      0  unmeasured disturbance(s) -->|  1 outputs |
                                      --------------
Indices:
  (input vector)    Manipulated variables: [1 ]
                    Measured disturbances: [2 ]
  (output vector)        Measured outputs: [1 ]

Disturbance and Noise Models:
        Output disturbance model: default (type "getoutdist(mpcobjLow)" for details)
         Measurement noise model: default (unity gain after scaling)

Weights:
        ManipulatedVariables: 0
    ManipulatedVariablesRate: 0.1000
             OutputVariables: 1
                         ECR: 100000

State Estimation:  Default Kalman Filter (type "getEstimator(mpcobjLow)" for details)

Constraints:
 0.0704 <= u1 <= 0.7042, u1/rate is unconstrained, y1 is unconstrained

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

nx = 6;
ny = 6;
nu = 4;
nlobj = nlmpc(nx,ny,nu);
In standard cost function, zero weights are applied by default to one or more OVs because there are fewer MVs than OVs.

Задайте шаг расчета контроллера и горизонты.

Ts = 0.4;
p = 30;
c = 4;
nlobj.Ts = Ts;
nlobj.PredictionHorizon = p;
nlobj.ControlHorizon = c;

Задайте функцию состояния модели прогноза и якобиан функции состояния. В данном примере используйте модель летающего робота.

nlobj.Model.StateFcn = "FlyingRobotStateFcn";
nlobj.Jacobian.StateFcn = "FlyingRobotStateJacobianFcn";

Задайте пользовательскую функцию стоимости для контроллера, который заменяет стандартную функцию стоимости.

nlobj.Optimization.CustomCostFcn = @(X,U,e,data) Ts*sum(sum(U(1:p,:)));
nlobj.Optimization.ReplaceStandardCost = true;

Задайте пользовательскую ограничительную функцию для контроллера.

nlobj.Optimization.CustomEqConFcn = @(X,U,data) X(end,:)';

Задайте линейные ограничения на переменные, которыми управляют.

for ct = 1:nu
    nlobj.MV(ct).Min = 0;
    nlobj.MV(ct).Max = 1;
end

Подтвердите модель прогноза и пользовательские функции в начальных состояниях (x0) и начальные входные параметры (u0) из робота.

x0 = [-10;-10;pi/2;0;0;0];
u0 = zeros(nu,1); 
validateFcns(nlobj,x0,u0);
Model.StateFcn is OK.
Jacobian.StateFcn is OK.
No output function specified. Assuming "y = x" in the prediction model.
Optimization.CustomCostFcn is OK.
Optimization.CustomEqConFcn is OK.
Analysis of user-provided model, cost, and constraint functions complete.

Вычислите оптимальное состояние, и управлял переменными траекториями, которые возвращены в info.

[~,~,info] = nlmpcmove(nlobj,x0,u0);
Slack variable unused or zero-weighted in your custom cost function. All constraints will be hard.

Постройте оптимальные траектории.

FlyingRobotPlotPlanning(info)
Optimal fuel consumption =   4.712383

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

nlobj = nlmpc(4,2,1);
In standard cost function, zero weights are applied by default to one or more OVs because there are fewer MVs than OVs.

Задайте шаг расчета и горизонты контроллера.

Ts = 0.1;
nlobj.Ts = Ts;
nlobj.PredictionHorizon = 10;
nlobj.ControlHorizon = 5;

Задайте функцию состояния для контроллера, который находится в файле pendulumDT0.m. Эта модель дискретного времени интегрирует непрерывную модель времени, заданную в pendulumCT0.m использование многоступенчатого прямого Метода Эйлера.

nlobj.Model.StateFcn = "pendulumDT0";
nlobj.Model.IsContinuousTime = false;

Модель прогноза использует дополнительный параметр, Ts, представлять шаг расчета. Задайте количество параметров.

nlobj.Model.NumberOfParameters = 1;

Задайте выходную функцию модели, передав параметр шага расчета как входной параметр.

nlobj.Model.OutputFcn = @(x,u,Ts) [x(1); x(3)];

Задайте стандартные ограничения для контроллера.

nlobj.Weights.OutputVariables = [3 3];
nlobj.Weights.ManipulatedVariablesRate = 0.1;
nlobj.OV(1).Min = -10;
nlobj.OV(1).Max = 10;
nlobj.MV.Min = -100;
nlobj.MV.Max = 100;

Подтвердите функции модели прогноза.

x0 = [0.1;0.2;-pi/2;0.3];
u0 = 0.4;
validateFcns(nlobj, x0, u0, [], {Ts});
Model.StateFcn is OK.
Model.OutputFcn is OK.
Analysis of user-provided model, cost, and constraint functions complete.

Только два из состояний объекта измеримы. Поэтому создайте расширенный Фильтр Калмана для оценки четырех состояний объекта. Его функция изменения состояния задана в pendulumStateFcn.m и его функция измерения задана в pendulumMeasurementFcn.m.

EKF = extendedKalmanFilter(@pendulumStateFcn,@pendulumMeasurementFcn);

Задайте начальные условия для симуляции, инициализируйте расширенное состояние Фильтра Калмана и укажите, что нулевая начальная буква управляла значением переменных.

x = [0;0;-pi;0];
y = [x(1);x(3)];
EKF.State = x;
mv = 0;

Задайте выходное значение ссылки.

yref = [0 0];

Создайте nlmpcmoveopt объект, и задает параметр шага расчета.

nloptions = nlmpcmoveopt;
nloptions.Parameters = {Ts};

Запустите симуляцию для 10 секунды. Во время каждого интервала управления:

  1. Откорректируйте предыдущий прогноз с помощью текущего измерения.

  2. Вычислите перемещения оптимального управления с помощью nlmpcmoveopt. Эта функция возвращает вычисленные оптимальные последовательности в nloptions. Передача обновленных опций возражает против nlmpcmoveopt в следующем управлении интервал обеспечивает исходные предположения для оптимальных последовательностей.

  3. Предскажите состояния модели.

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

  5. Сгенерируйте данные о датчике с белым шумом.

  6. Сохраните состояния объекта.

Duration = 10;
xHistory = x;
for ct = 1:(Duration/Ts)
    % Correct previous prediction
    xk = correct(EKF,y);
    % Compute optimal control moves
    [mv,nloptions] = nlmpcmove(nlobj,xk,mv,yref,[],nloptions);
    % Predict prediction model states for the next iteration
    predict(EKF,[mv; Ts]);
    % Implement first optimal control move
    x = pendulumDT0(x,mv,Ts);
    % Generate sensor data
    y = x([1 3]) + randn(2,1)*0.01;
    % Save plant states
    xHistory = [xHistory x];
end

Постройте получившиеся траектории состояния.

figure
subplot(2,2,1)
plot(0:Ts:Duration,xHistory(1,:))
xlabel('time')
ylabel('z')
title('cart position')
subplot(2,2,2)
plot(0:Ts:Duration,xHistory(2,:))
xlabel('time')
ylabel('zdot')
title('cart velocity')
subplot(2,2,3)
plot(0:Ts:Duration,xHistory(3,:))
xlabel('time')
ylabel('theta')
title('pendulum angle')
subplot(2,2,4)
plot(0:Ts:Duration,xHistory(4,:))
xlabel('time')
ylabel('thetadot')
title('pendulum velocity')

Введенный в R2018b