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-функцию с помощью Coder™ MATLAB ®, определяя configData как константа.

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

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

свернуть все

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

Примечание

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

Состояние контроллера во время исполнения, заданное как структура. Сгенерируйте начальную структуру состояния, используя 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-е неравенство активно для последнего решения решателя QP.

Примечание

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

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

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

Измеренные выходы, заданные как вектор 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.

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

Если 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 + <reservedrangesplaceholder5> 1-1, второе бесплатное движение применяется со времени k + <reservedrangesplaceholder3> 1 через k + <reservedrangesplaceholder1> 1 + <reservedrangesplaceholder0> 2-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 как массив нулей.

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

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

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

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

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

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

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

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

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

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

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

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

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

свернуть все

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Расширенные возможности

.
Введенный в R2016a