nlmpc

Нелинейный образцовый прогнозирующий контроллер

Описание

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

Создание

Синтаксис

nlobj = nlmpc(nx,ny,nu)
nlobj = nlmpc(nx,ny,'MV',mvIndex,'MD',mdIndex)
nlobj = nlmpc(nx,ny,'MV',mvIndex,'UD',udIndex)
nlobj = nlmpc(nx,ny,'MV',mvIndex,'MD',mdIndex,'UD',udIndex)

Описание

пример

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.

  • ложь Модель прогноза дискретного времени. В этом случае 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 контроллера проигнорировано.

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

Если вы не задаете пользовательскую функцию стоимости с помощью 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 22-Feb-2019 01:45:42):
---------------------------------------------
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