mpcmoveCodeGeneration

Вычислите перемещения оптимального управления с поддержкой генерации кода

Синтаксис

[mv,newStateData] = mpcmoveCodeGeneration(configData,stateData,onlineData)
[___,info] = mpcmoveCodeGeneration(___)

Описание

пример

[mv,newStateData] = mpcmoveCodeGeneration(configData,stateData,onlineData) вычисляет оптимальные перемещения MPC управления и поддерживает генерацию кода для развертывания на целях в реальном времени. Структуры входных данных, сгенерированное использование getCodeGenerationData, задают контроллер MPC, чтобы моделировать.

mpcmoveCodeGeneration не проверяет входные параметры на правильные размерности и типы данных.

[___,info] = mpcmoveCodeGeneration(___) возвращает дополнительную информацию о результате оптимизации, включая количество итераций и стоимости целевой функции.

Примеры

свернуть все

Создайте соответствующую модель объекта управления.

plant = rss(3,1,1);
plant.D = 0;

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

Ts = 0.1;

Создайте контроллер MPC.

mpcObj = mpc(plant,Ts);
-->The "PredictionHorizon" property of "mpc" object is empty. Trying PredictionHorizon = 10.
-->The "ControlHorizon" property of the "mpc" object is empty. Assuming 2.
-->The "Weights.ManipulatedVariables" property of "mpc" object is empty. Assuming default 0.00000.
-->The "Weights.ManipulatedVariablesRate" property of "mpc" object is empty. Assuming default 0.10000.
-->The "Weights.OutputVariables" property of "mpc" object is empty. Assuming default 1.00000.

Создайте структуры данных генерации кода.

[configData,stateData,onlineData] = getCodeGenerationData(mpcObj);
-->Converting model to discrete time.
-->Assuming output disturbance added to measured output channel #1 is integrated white noise.
-->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.
-->Converting model to discrete time.
-->Assuming output disturbance added to measured output channel #1 is integrated white noise.
-->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.

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

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

x = zeros(size(plant.B,1),1); % Initialize plant states to zero (|mpcObj| default).
Tsim = 20;
for i = 1:round(Tsim/Ts)+1
    % Update plant output.
    y = plant.C*x;
    % Update measured output in online data.
    onlineData.signals.ym = y;
    % Update reference signal in online data.
    onlineData.signals.ref = 1;
    % Compute control actions.
    [u,statedata] = mpcmoveCodeGeneration(configData,stateData,onlineData);
    % Update plant state.
    x = plant.A*x + plant.B*u;
end

Сгенерируйте MEX-функцию с MATLAB® Coder™, задав configData как константу.

func = 'mpcmoveCodeGeneration';
funcOutput = 'mpcmoveMEX';
Cfg = coder.config('mex');
Cfg.DynamicMemoryAllocation = 'off';
codegen('-config',Cfg,func,'-o',funcOutput,'-args',...
    {coder.Constant(configData),stateData,onlineData});

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

свернуть все

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

Примечание

При использовании codegen configData должен быть задан как coder.Constant.

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

Если пользовательская оценка состояния включена, необходимо вручную обновить структуру stateData во время каждого интервала управления. Для получения дополнительной информации смотрите Используя Пользовательскую Оценку состояния.

stateData имеет следующие поля:

Оценки состояния модели объекта управления, заданные как вектор-столбец длины nxp, где nxp является количеством состояний модели объекта управления.

Примечание

Если пользовательская оценка состояния включена, обновление Plant в каждом интервале управления. В противном случае не изменяйте это поле. Вместо этого используйте значения, возвращенные или getCodeGenerationData или mpcmoveCodeGeneration.

Неизмеренные оценки состояния возмущения, заданные как вектор-столбец длины nxd, где nxd является количеством неизмеренных состояний возмущения. Disturbance содержит входные состояния возмущения, сопровождаемые выходными состояниями возмущения.

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

Примечание

Если пользовательская оценка состояния включена, обновление Disturbance в каждом интервале управления. В противном случае не изменяйте это поле. Вместо этого используйте значения, возвращенные или getCodeGenerationData или mpcmoveCodeGeneration.

Выведите оценки состояния модели шума измерения, заданные как вектор-столбец длины nxn, где nxn является количеством шумовых образцовых состояний.

Примечание

Если пользовательская оценка состояния включена, обновление Noise в каждом интервале управления. В противном случае не изменяйте это поле. Вместо этого используйте значения, возвращенные или getCodeGenerationData или mpcmoveCodeGeneration.

Управление переменными, которым управляют, перемещается от предыдущего интервала управления, заданного как вектор-столбец длины nmv, где nmv является количеством переменных, которыми управляют.

Примечание

Не изменяйте значение LastMove. Всегда используйте значения, возвращенные или getCodeGenerationData или mpcmoveCodeGeneration.

Ковариационная матрица для контроллера утверждает оценки, заданные как симметричный n-by-n массив, где n является количеством расширенных состояний контроллера; то есть, сумма nxp, nxd и nxn.

Если диспетчер использует пользовательскую оценку состояния, Covariance пуст.

Примечание

Не изменяйте значение Covariance. Всегда используйте значения, возвращенные или getCodeGenerationData или mpcmoveCodeGeneration.

Активные ограничения неравенства, где равным фрагментом неравенства является true, заданный как логический вектор длины m. Если iA (i) является true, то i th неравенство активен для последнего решения для решателя QP.

Примечание

Не изменяйте значение iA. Всегда используйте значения, возвращенные или getCodeGenerationData или mpcmoveCodeGeneration.

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

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

Измеренные выходные параметры, заданные как вектор длины Nym, где Nym является количеством измеренных выходных параметров.

По умолчанию getCodeGenerationData устанавливает ym на измеренные выходные значения номинала от диспетчера.

Выведите ссылки, заданные как одно из следующего:

  • Вектор - строка из длины Ny, где Ny является количеством выходных параметров.

  • Если вы используете ссылочный предварительный просмотр сигнала с неявным или адаптивным MPC, задаете p-by-Ny массив, где p является горизонтом прогноза.

По умолчанию getCodeGenerationData устанавливает ref на номинальные выходные значения от диспетчера.

Измеренные воздействия, заданные как:

  • Вектор - строка из длины Nmd, где Nmd является количеством измеренных воздействий.

  • Если вы используете предварительный просмотр сигнала с неявным или адаптивным MPC, задаете p-by-Nmd массив.

По умолчанию, если ваш контроллер измерил воздействия, getCodeGenerationData устанавливает md на измеренные значения воздействия номинала от диспетчера. В противном случае это поле пусто и проигнорировано mpcmoveCodeGeneration.

Цели для переменных, которыми управляют, которые заменяют цели, заданные в configData.uTarget, заданном как одно из следующего:

  • Вектор длины Nmv, где Nmv является количеством переменных, которыми управляют,

  • [], чтобы использовать цели по умолчанию, заданные в configData.uTarget

Это поле проигнорировано при использовании явного контроллера MPC.

Переменные, которыми управляют, внешне применились к объекту, заданному как:

  • Вектор длины Nmv.

  • [], чтобы применить перемещения оптимального управления к объекту.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Нижние границы выходной переменной, заданные как вектор-столбец длины Ny. ymin(i) заменяет ограничение OutputVariables(i).Min от исходного диспетчера. Если свойство OutputVariables(i).Min контроллера задано как вектор, ymin(i) заменяет первую конечную запись в этом векторе и остающийся сдвиг значений, чтобы сохранить тот же ограничительный профиль.

Если ymin пуст, [], границы по умолчанию, заданные в исходном контроллере MPC, используются.

Верхние границы выходной переменной, заданные как вектор-столбец длины Ny. ymax(i) заменяет ограничение OutputVariables(i).Max от исходного диспетчера. Если свойство OutputVariables(i).Max контроллера задано как вектор, ymax(i) заменяет первую конечную запись в этом векторе и остающийся сдвиг значений, чтобы сохранить тот же ограничительный профиль.

Если ymax пуст, [], границы по умолчанию, заданные в исходном контроллере MPC, используются.

Переменные нижние границы, которыми управляют, заданные как вектор-столбец длины Nmv. umin(i) заменяет ограничение ManipulatedVariables(i).Min от исходного диспетчера. Если свойство ManipulatedVariables(i).Min контроллера задано как вектор, umin(i) заменяет первую конечную запись в этом векторе и остающийся сдвиг значений, чтобы сохранить тот же ограничительный профиль.

Если umin пуст, [], границы по умолчанию, заданные в исходном контроллере MPC, используются.

Переменные верхние границы, которыми управляют, заданные как вектор-столбец длины Nmv. umax(i) заменяет ограничение ManipulatedVariables(i).Max от исходного диспетчера. Если свойство ManipulatedVariables(i).Max контроллера задано как вектор, umax(i) заменяет первую конечную запись в этом векторе и остающийся сдвиг значений, чтобы сохранить тот же ограничительный профиль.

Если umax пуст, [], границы по умолчанию, заданные в исходном контроллере MPC, используются.

Обновленные пользовательские смешанные ограничения ввода/вывода, заданные как структура. Это поле проигнорировано при использовании явного контроллера MPC.

Эта структура имеет следующие поля:

Переменное ограничение, которым управляют, постоянное, заданное как Nc-by-Nmv массив, где Nc является количеством ограничений и Nmv, является количеством переменных, которыми управляют.

Если E пуст, [], соответствующее ограничение, заданное в исходном контроллере MPC, используются.

Управляемое выходное ограничение, постоянное, заданное как Nc-by-Ny массив, где Ny является количеством управляемых выходных параметров (измеренный и неизмеренный).

Смешанное ограничение ввода/вывода, постоянное, заданное как вектор-столбец длины Nc.

Измеренное ограничение воздействия, постоянное, заданное как Nc-by-Nmd массив, где Nmd является количеством измеренных воздействий.

Обновленные горизонты контроллера, заданные как структура. Чтобы отличаться горизонты во время выполнения, сначала создайте свои структуры данных с помощью установки getCodeGenerationData пара "имя-значение" UseVariableHorizon для true. Когда вы отличаетесь горизонты, необходимо задать и горизонт прогноза и горизонт управления. Для получения дополнительной информации смотрите, Настраивают Горизонты во Время выполнения.

Это поле проигнорировано при использовании явного контроллера MPC.

Эта структура имеет следующие поля:

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

Определение p изменяется:

  • Количество строк в оптимальных последовательностях, возвращенных в info

  • Максимальные размерности полей в model, когда configData.IsLTV является true

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

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

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

Обновленный объект и номинальная стоимость для адаптивного MPC и изменяющегося во времени MPC, заданного как структура. model только доступен, если вы задаете isAdaptive или isLTV как true при создании структур данных генерации кода.

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

Матрица состояния модели объекта управления пространства состояний дискретного времени, заданной как:

  • Nx-by-Nx массив при использовании адаптивного MPC,

  • Nx-by-Nx-by-(p +1) массив при использовании изменяющегося во времени MPC,

где Nx является количеством состояний объекта.

Матрица входа к состоянию модели объекта управления пространства состояний дискретного времени, заданной как:

  • Nx-by-Nu массив при использовании адаптивного MPC,

  • Nx-by-Nu-by-(p +1) массив при использовании изменяющегося во времени MPC,

где Nu является количеством входных параметров объекта.

Состояние к выходной матрице модели объекта управления пространства состояний дискретного времени, заданной как:

  • Ny-by-Nx массив при использовании адаптивного MPC.

  • Ny-by-Nx-by-(p +1) массив при использовании изменяющегося во времени MPC.

Проходная матрица модели объекта управления пространства состояний дискретного времени, заданной как:

  • Ny-by-Nu массив при использовании адаптивного MPC.

  • Ny-by-Nu-by-(p +1) массив при использовании изменяющегося во времени MPC.

Поскольку контроллеры MPC не поддерживают объекты с прямым сквозным соединением, задают D как массив нулей.

Номинальные состояния объекта, заданные как:

  • Вектор-столбец длины Nx при использовании адаптивного MPC.

  • Nx - 1 на (p +1) массив при использовании изменяющегося во времени MPC.

Номинальные входные параметры объекта, заданные как:

  • Вектор-столбец длины Nu при использовании адаптивного MPC.

  • Nu - 1 на (p +1) массив при использовании изменяющегося во времени MPC.

Номинальный объект выходные параметры, заданные как:

  • Вектор-столбец длины Ny при использовании адаптивного MPC.

  • Ny - 1 на (p +1) массив при использовании изменяющегося во времени MPC.

Номинальные производные состояния объекта, заданные как:

  • Вектор-столбец длины Nx при использовании адаптивного MPC.

  • Nx - 1 на (p +1) массив при использовании изменяющегося во времени MPC.

Выходные аргументы

свернуть все

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

Если контроллер обнаруживает неосуществимую задачу оптимизации или сталкивается с числовыми трудностями при решении плохо обусловленной задачи оптимизации, mv остается в своем новом успешном решении, x.LastMove.

В противном случае, если задача оптимизации выполнима, и решатель достигает заданного максимального количества итераций, не находя оптимальное решение, mv:

  • Остается в его новом успешном решении, если свойством Optimizer.UseSuboptimalSolution контроллера является false.

  • Субоптимальное решение, достигнутое после итоговой итерации, если свойством Optimizer.UseSuboptimalSolution контроллера является true. Для получения дополнительной информации смотрите Субоптимальное Решение QP.

Обновленное состояние контроллера, возвращенное как структура. Для последующих интервалов управления передайте newStateData mpcmoveCodeGeneration как stateData.

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

Информация об оптимизации контроллера, возвращенная как структура.

Если вы используете неявный или адаптивный MPC, info содержит следующие поля:

Поле Описание
IterationsКоличество итераций решателя QP
QPCodeКод статуса решателя QP
CostЦелевая функция стоится
UoptОптимальные переменные корректировки, которыми управляют,
YoptОптимальная предсказанная последовательность выходной переменной
XoptОптимальная предсказанная последовательность переменной состояния
ToptИнтервалы периода времени
SlackОслабьте переменную, используемую в ограничительном смягчении

Если configData.OnlyComputeCost является true, оптимальная информация о последовательности, Uopt, Yopt, Xopt, Topt и Slack, не доступны:

Для получения дополнительной информации смотрите mpcmove и mpcmoveAdaptive.

Если вы используете явный MPC, info содержит следующие поля:

Поле Описание
RegionОбласть, в которой было найдено оптимальное решение
ExitCodeКод статуса решения

Для получения дополнительной информации смотрите mpcmoveExplicit.

Введенный в R2016a

Для просмотра документации необходимо авторизоваться на сайте