exponenta event banner

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});
Code generation successful.

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

свернуть все

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

Примечание

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

Состояние контроллера во время выполнения, указанное как структура. Создание структуры начального состояния с помощью 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-на-N, где N - число расширенных состояний контроллера; то есть сумма Nxp, Nxd и Nxn.

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

Примечание

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

Активные ограничения неравенства, где равная часть неравенства true, заданный как логический вектор длины М. Если 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.

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

Если 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.

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

Обновленные заводские и номинальные значения для адаптивных ПДК и изменяющихся во времени ПДК, указанные как структура. 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.

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

Номинальные состояния установки, указанные как:

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

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

Номинальные заводские вводы, указанные как:

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

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

Номинальные выходы установки, указанные как:

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

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

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

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

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

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

свернуть все

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

Если контроллер обнаруживает невыполнимую задачу оптимизации или сталкивается с численными трудностями в решении плохо обусловленной задачи оптимизации, mv остается на своем последнем успешном решении, xc.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