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 является количеством входных параметров модели предсказания.

Свойства

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

Шаг расчета модели 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.

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

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

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

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

Модель Prediction в виде структуры со следующими полями.

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

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

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

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

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

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

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

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

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

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

Примечание

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

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

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

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

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

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

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

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

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

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

Примечание

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Чтобы варьироваться связанное по горизонту предсказания со времени 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.

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

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

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

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

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

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

Чтобы варьироваться связанное по горизонту предсказания со времени 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 является текущим временем. По умолчанию этой нижней границей является -Inf.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Примечание

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Optimization.CustomIneqConFcn = @(X,U,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.

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

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

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 25-Aug-2021 18:44:28):
---------------------------------------------
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,Ts)
Optimal fuel consumption =   1.884953

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

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

Figure contains an axes object. The axes object 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 objects. Axes object 1 with title cart position contains an object of type line. Axes object 2 with title cart velocity contains an object of type line. Axes object 3 with title pendulum angle contains an object of type line. Axes object 4 with title pendulum velocity contains an object of type line.

Введенный в R2018b