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.NumberOfStates свойство только для чтения контроллера. Вы не можете изменить количество состояний после создания объекта контроллера.

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

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

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

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

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

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

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

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

Свойства

расширить все

Модель предсказания шага расчета, заданная как положительный конечный скаляр. Контроллер использует модель в дискретном времени со шаг расчета 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 + <reservedrangesplaceholder6> 1-1, второе бесплатное движение применяется со времени k + <reservedrangesplaceholder4> 1 через k + <reservedrangesplaceholder2> 1 + <reservedrangesplaceholder1> 2-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.

Для получения дополнительной информации о том, как манипулированная блокировка переменных работает с различными методами интерполяции, см. «Манипулированная блокировка переменных».

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

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

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

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

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

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

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

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

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

Функция состояния, заданная как строка, вектор символов или указатель на функцию. Для модели предсказания в непрерывном времени, 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.

Если IsContinuousTime является true, StateFcn должен вернуть производную состояния относительно времени, в текущее время. В противном случае StateFcn необходимо вернуть состояние в следующий контрольный интервал.

Количество необязательных параметров модели, используемых моделью предсказания, пользовательской функцией стоимости и пользовательскими функциями ограничения, заданное в виде неотрицательного целого числа. Количество параметров включает все параметры, используемые этими функциями. Для примера, если функция состояния использует только параметр 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, заданный как положительный конечный скаляр. В целом используйте рабочую область значений переменного выхода. Установка правильного масштабного коэффициента может улучшить числовое обусловление для оптимизации.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Примечание

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

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

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

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

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

Чтобы задать цели MV во время исполнения, создайте 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,e,data,params) myIneqConFunction(X,U,e,data,params);

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

function cineq = myIneqConFunction(X,U,e,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.

Для получения дополнительной информации о манипулированных блокировках переменных смотрите Манипулированные блокировки переменных.

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

The 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 или nlmpcMultistage объекты для потенциальных проблем
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-Apr-2021 11:07:17):
---------------------------------------------
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

Figure contains 6 axes. Axes 1 with title x contains an object of type line. Axes 2 with title y contains an object of type line. Axes 3 with title theta contains an object of type line. Axes 4 with title vx contains an object of type line. Axes 5 with title vy contains an object of type line. Axes 6 with title omega contains an object of type line.

Figure contains 4 axes. Axes 1 with title Thrust u(1) contains an object of type stair. Axes 2 with title Thrust u(2) contains an object of type stair. Axes 3 with title Thrust u(3) contains an object of type stair. Axes 4 with title Thrust u(4) contains an object of type stair.

Figure contains an axes. The axes with title Optimal Trajectory contains 62 objects of type patch, line.

Создайте нелинейный контроллер 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. Вычисление оптимального управления перемещается с помощью nlmpcmove. Эта функция возвращает вычисленные оптимальные последовательности в nloptions. Передача обновленного объекта опции в nlmpcmove в следующем контрольном интервале обеспечивают начальные догадки для оптимальных последовательностей.

  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')

Figure contains 4 axes. Axes 1 with title cart position contains an object of type line. Axes 2 with title cart velocity contains an object of type line. Axes 3 with title pendulum angle contains an object of type line. Axes 4 with title pendulum velocity contains an object of type line.

Введенный в R2018b