Вычисление оптимальных перемещений управления с поддержкой генерации кода
[ вычисляет оптимальные перемещения MPC управления и поддерживает генерацию кода для развертывания к целям в реальном времени. Структуры входных данных, сгенерированные с помощью mv,newStateData]
= mpcmoveCodeGeneration(configData,stateData,onlineData)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.
configData - параметры конфигурации MPCПараметры конфигурации MPC, которые являются постоянными во время исполнения, заданные как структура, сгенерированная с помощью getCodeGenerationData.
Примечание
При использовании codegen (MATLAB Coder), configData должно быть определено как coder.Constant (MATLAB Coder).
stateData - Состояние контроллераСостояние контроллера во время исполнения, заданное как структура. Сгенерируйте начальную структуру состояния, используя getCodeGenerationData. Для последующих контрольных интервалов используйте обновленное состояние контроллера с предыдущего интервала. В целом используйте newStateData структура непосредственно.
Если пользовательская оценка состояния включена, необходимо вручную обновить stateData структура в течение каждого контрольного интервала. Для получения дополнительной информации смотрите Пользовательская оценка состояния.
stateData имеет следующие поля:
Plant - Оценки состояния модели объекта управленияMPCobj номинальные состояния объекта (по умолчанию) | вектор-столбец длины nxpОценки состояния модели объекта управления, заданные как вектор-столбец длины Nxp, где Nxp - количество состояний модели объекта.
Примечание
Если оценка пользовательского состояния включена, обновите Plant на каждом контрольном интервале. В противном случае не изменяйте это поле. Вместо этого используйте значения, возвращенные либо getCodeGenerationData или mpcmoveCodeGeneration.
Disturbance - Оценки состояния неизмеренной модели возмущения[] (по умолчанию) | вектор-столбецНеизмеренные оценки состояния модели возмущения, заданные как вектор-столбец Nxd длины, где Nxd - количество неизмеренных состояний модели возмущения. Disturbance содержит вход состояния модели возмущения, за которыми следуют выходы состояния модели возмущения.
Чтобы просмотреть вход и выходные модели возмущения, используйте getindist и getoutdist соответственно.
Примечание
Если оценка пользовательского состояния включена, обновите Disturbance на каждом контрольном интервале. В противном случае не изменяйте это поле. Вместо этого используйте значения, возвращенные либо getCodeGenerationData или mpcmoveCodeGeneration.
Noise - Оценка состояния модели шума выходного измерения[] (по умолчанию) | вектор-столбецВыходы оценки модели шума измерения, заданные как вектор-столбец Nxn длины, где Nxn - количество состояний модели шума.
Примечание
Если оценка пользовательского состояния включена, обновите Noise на каждом контрольном интервале. В противном случае не изменяйте это поле. Вместо этого используйте значения, возвращенные либо getCodeGenerationData или mpcmoveCodeGeneration.
LastMove - Управляемое управление переходит с предыдущего контрольного интервалаMPCobj номинальные значения СН (по умолчанию) | вектор-столбецУправляемая переменная перемещается от предыдущих контрольных интервалов, заданных как вектор-столбец длины Nmv, где Nmv - количество манипулируемых переменных.
Примечание
Не изменяйте значение LastMove. Всегда используйте значения, возвращенные либо getCodeGenerationData или mpcmoveCodeGeneration.
Covariance - Ковариационная матрица для оценок состояния контроллераКовариационная матрица для оценок состояния контроллера, заданная как симметричный N -by- N массив, где N - количество расширенных состояний контроллера; то есть сумма Nxp, Nxd и Nxn.
Если контроллер использует пользовательскую оценку состояния, Covariance пуст.
Примечание
Не изменяйте значение Covariance. Всегда используйте значения, возвращенные либо getCodeGenerationData или mpcmoveCodeGeneration.
iA - Ограничения активного неравенстваОграничения активного неравенства, где равный фрагмент неравенства true, заданный как логический вектор длины M. Если iA(i) true, тогда i-е неравенство активно для последнего решения решателя QP.
Примечание
Не изменяйте значение iA. Всегда используйте значения, возвращенные либо getCodeGenerationData или mpcmoveCodeGeneration.
onlineData - Оперативные данные контроллераДанные сетевого контроллера, которые необходимо обновить во время выполнения, заданные как структура со следующими полями. Сгенерируйте начальную структуру используя getCodeGenerationData.
signals - Обновленные входные и выходные сигналыОбновленные входные и выходные сигналы, заданные как структура со следующими полями:
ym - Измеренные выходыИзмеренные выходы, заданные как вектор Nym длины, где Nym - количество измеренных выходов.
По умолчанию, getCodeGenerationData устанавливает ym к номинальным измеренным выходным значениям от контроллера.
ref - Выходные ссылкиВыходные ссылки, заданные как одно из следующих:
Вектор-строка длины Ny, где Ny количество выходов.
Если вы используете предварительный просмотр опорного сигнала с неявным или адаптивным MPC, задайте p массив -by- Ny, где p является горизонтом предсказания.
По умолчанию,getCodeGenerationData устанавливает ref к номинальным выходным значениям от контроллера.
md - Измеренные нарушения порядкаИзмеренные нарушения порядка, указанные как:
Вектор-строка длины Nmd, где Nmd - количество измеренных нарушений порядка.
Если вы используете предварительный просмотр сигнала с неявным или адаптивным MPC, задайте p массив -by Nmd.
По умолчанию, если ваш контроллер измерил нарушения порядка,getCodeGenerationData устанавливает md к номинальным измеренным значениям нарушения порядка от контроллера. В противном случае это поле пустое и проигнорировано mpcmoveCodeGeneration.
mvTarget - Цели для манипулируемых переменных[] (по умолчанию) | векторЦели для манипулируемых переменных, которые заменяют цели, определенные в configData.uTarget, указанный как одно из следующего:
Вектор длины Nmv, где Nmv - количество манипулируемых переменных
[] использовать целевые объекты по умолчанию, определенные в configData.uTarget
Это поле игнорируется при использовании явного контроллера MPC.
externalMV - Манипулируемые переменные, внешне применяемые к объекту[] (по умолчанию) | векторМанипулируемые переменные, внешне применяемые к объекту, заданные как:
Вектор длины Nmv.
[] для применения оптимальных движений управления к объекту.
weights - Обновленные веса оптимизации QPОбновленные веса оптимизации QP, заданные как структура. Если вы не ожидаете, что веса настройки изменятся во время исполнения, игнорируйте weights. Это поле игнорируется при использовании явного контроллера MPC.
Эта структура содержит следующие поля:
y - Выходные переменные веса настройки[] (по умолчанию) | вектор-строку | массивВыходы веса настройки переменных, которые заменяют исходные выходные веса контроллера во время исполнения во время исполнения, заданные как вектор-строка или массив неотрицательных значений.
Чтобы использовать те же веса на горизонте предсказания, задайте вектор-строку Ny длины, где Ny количество переменных выходов.
Чтобы изменить веса настройки над горизонтом предсказания от времени k + 1 до времени k + p, задайте массив с Ny столбцами и до p строками. Здесь k - текущее время, а p - горизонт предсказания. Каждая строка содержит выходные переменные веса настройки для одного шага горизонта предсказания. Если вы задаете меньше p строк, веса в последней строке используются для остальных шагов горизонта предсказания.
Если y пуст, []используются веса по умолчанию, заданные в исходном контроллере MPC.
u - Манипулируемые переменные веса настройки[] (по умолчанию) | вектор-строку | массивМанипулируемые веса настройки переменных, которые заменяют исходный контроллер, манипулируют весами переменных во время выполнения, заданными как вектор-строка или массив неотрицательных значений.
Чтобы использовать те же веса на горизонте предсказания, задайте вектор-строку длины Nmv, где Nmv количество манипулируемых переменных.
Чтобы варьировать веса настройки по горизонту предсказания от времени k времени k + p -1, задайте массив с Nmv столбцами и до p строками. Здесь k - текущее время, а p - горизонт предсказания. Каждая строка содержит манипулированные переменные веса настройки для одного шага горизонта предсказания. Если вы задаете меньше p строк, веса в последней строке используются для остальных шагов горизонта предсказания.
Если u пуст, []используются веса по умолчанию, заданные в исходном контроллере MPC.
du - Манипулируемые веса настройки переменной скорости[] (по умолчанию) | вектор-строку | массивМанипулируемые веса настройки переменной скорости, которые заменяют исходный контроллер, манипулируют весами переменной скорости во время выполнения, заданными как вектор-строка или массив неотрицательных значений.
Чтобы использовать те же веса на горизонте предсказания, задайте вектор-строку длины Nmv, где Nmv количество манипулируемых переменных.
Чтобы варьировать веса настройки по горизонту предсказания от времени k времени k + p -1, задайте массив с Nmv столбцами и до p строками. Здесь k - текущее время, а p - горизонт предсказания. Каждая строка содержит управляемые веса настройки переменной скорости для одного шага горизонта предсказания. Если вы задаете меньше p строк, веса в последней строке используются для остальных шагов горизонта предсказания.
Если du пуст, []используются веса по умолчанию, заданные в исходном контроллере MPC.
ecr - Вес на переменную slack, используемую для смягчения ограничений[] (по умолчанию) | неотрицательной скаляромВес на переменную slack, используемую для смягчения ограничений, задается как неотрицательный скаляр.
Если ecr пуст, []Используется вес по умолчанию, заданный в исходном контроллере MPC.
limits - Обновленные входные и выходные ограниченияОбновленные входные и выходные ограничения, заданные как структура. Если вы не ожидаете изменения ограничений во время исполнения, игнорируйте limits. Это поле игнорируется при использовании явного контроллера MPC.
Эта структура содержит следующие поля:
ymin - Выходные переменные нижние границы[] (по умолчанию) | вектор-столбецВыход переменные нижние границы, заданные как вектор-столбец длины Ny. ymin(i) заменяет OutputVariables(i).Min ограничение от исходного контроллера. Если на OutputVariables(i).Min свойство контроллера задается как вектор, ymin(i) заменяет первый конечный элемент в этом векторе, а оставшиеся значения смещаются, чтобы сохранить тот же профиль ограничений.
Если ymin пуст, []используются ограничения по умолчанию, заданные в исходном контроллере MPC.
ymax - Выходные верхние границы переменной[] (по умолчанию) | вектор-столбецВыход переменные верхние границы, заданные как вектор-столбец длины Ny. ymax(i) заменяет OutputVariables(i).Max ограничение от исходного контроллера. Если на OutputVariables(i).Max свойство контроллера задается как вектор, ymax(i) заменяет первый конечный элемент в этом векторе, а оставшиеся значения смещаются, чтобы сохранить тот же профиль ограничений.
Если ymax пуст, []используются ограничения по умолчанию, заданные в исходном контроллере MPC.
umin - Манипулирование нижними границами переменной[] (по умолчанию) | вектор-столбецМанипулируемые нижние границы переменной, заданные как вектор-столбец Nmv длины. umin(i) заменяет ManipulatedVariables(i).Min ограничение от исходного контроллера. Если на ManipulatedVariables(i).Min свойство контроллера задается как вектор, umin(i) заменяет первый конечный элемент в этом векторе, а оставшиеся значения смещаются, чтобы сохранить тот же профиль ограничений.
Если umin пуст, []используются ограничения по умолчанию, заданные в исходном контроллере MPC.
umax - Манипулируемые верхние границы переменной[] (по умолчанию) | вектор-столбецМанипулируемые верхние границы переменной, заданные как вектор-столбец Nmv длины. umax(i) заменяет ManipulatedVariables(i).Max ограничение от исходного контроллера. Если на ManipulatedVariables(i).Max свойство контроллера задается как вектор, umax(i) заменяет первый конечный элемент в этом векторе, а оставшиеся значения смещаются, чтобы сохранить тот же профиль ограничений.
Если umax пуст, []используются ограничения по умолчанию, заданные в исходном контроллере MPC.
customconstraints - Обновлены пользовательские смешанные ограничения ввода/выводаОбновлены пользовательские смешанные ограничения ввода/вывода, заданные как структура. Это поле игнорируется при использовании явного контроллера MPC.
Эта структура имеет следующие поля:
E - Манипулируемая переменная константа ограничения[] (по умолчанию) | Nc -by - Nmv массивМанипулируемая константа ограничения, заданная как Nc -by - Nmv массив, где Nc - количество ограничений, а Nmv - количество манипулируемых переменных.
Если E пуст, []используются соответствующие ограничения, заданные в исходном контроллере MPC.
F - Управляемая выходная константа ограничения[] (по умолчанию) | Nc -by - Ny массивУправляемая выходная константа ограничения, заданная как Nc -by - Ny массив, где Ny - количество управляемых выходов (измеренных и не измеренных).
G - Смешанная константа входного/выходного ограничения[] (по умолчанию) | вектор-столбец длины NcСмешанная константа входного/выходного ограничения, заданная как вектор-столбец длины Nc.
S - Измеренная константа возмущения[] (по умолчанию) | Nc -by - Nv массивИзмеренная константа возмущения, заданная как Nc -by - Nmd массив, где Nmd - количество измеренных нарушений порядка.
horizons - Обновленные горизонты контроллераОбновленные горизонты контроллера, заданные как структура. Чтобы варьировать горизонты во время исполнения, сначала создайте свои структуры данных с помощью getCodeGenerationData установка UseVariableHorizon Пара "имя-значение" с true. При изменении горизонтов необходимо задать и горизонт предсказания, и горизонт управления. Для получения дополнительной информации смотрите Настроить горизонты во время выполнения.
Это поле игнорируется при использовании явного контроллера MPC.
Эта структура имеет следующие поля:
p - Горизонт предсказания[] (по умолчанию) | положительное целое числоm - Горизонт управления[] (по умолчанию) | положительное целое число | вектор положительных целых чиселУправляйте горизонтом, который заменяет значение 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 и так далее. Использование шагов блоков может улучшить робастность вашего контроллера по сравнению с случаем по умолчанию.
model - Обновление объекта и номинальных значенийОбновленный объект и номинальные значения для адаптивного MPC и изменяющегося во времени MPC, заданные как структура. model доступен только, если вы задаете isAdaptive или isLTV как true при создании структур данных генерации кода.
Эта структура содержит следующие поля:
A - Матрица состояний модели объекта управления в дискретном времениМатрица состояний модели объекта управления в дискретном времени, заданная как:
Nx -by - Nx массив при использовании адаптивного MPC,
Nx массив -by- Nx -by- (p + 1) при использовании изменяющегося во времени MPC,
где Nx - количество состояний объекта.
B - Матрица «вход-состояние» модели объекта управления в дискретном времениМатрица «вход-состояние» модели объекта управления в дискретном времени, заданная как:
Nx -by - Nu массив при использовании адаптивного MPC,
Nx массив -by- Nu -by- (p + 1) при использовании изменяющегося во времени MPC,
где Nu - количество входов объекта управления.
C - Матрица состояние-выход модели объекта управления в дискретном времениМатрица состояние-выход модели объекта управления в дискретном времени, заданная как:
Ny -by - Nx массив при использовании адаптивного MPC.
Ny массив -by- Nx -by- (p + 1) при использовании изменяющегося во времени MPC.
D - Исходная матрица модели объекта управления в дискретном времениИсходная матрица модели объекта управления в дискретном времени, заданная как:
Ny -by - Nu массив при использовании адаптивного MPC.
Ny массив -by- Nu -by- (p + 1) при использовании изменяющегося во времени MPC.
Поскольку контроллеры MPC не поддерживают объектов с прямым сквозным соединением, задайте D как массив нулей.
X - Номинальные состояния объектаНоминальные состояния объекта, заданные как:
При использовании адаптивного MPC вектора-столбца Nx длины.
Массив Nx -by-1-by- (p + 1) при использовании изменяющегося во времени MPC.
U - Номинальные входы объекта управленияНоминальные входы объекта управления, заданные как:
При использовании адаптивного MPC вектора-столбца Nu длины.
Массив Nu -by-1-by- (p + 1) при использовании изменяющегося во времени MPC.
Y - Номинальные выходы объектаНоминальные выходные параметры объекта выходов, заданные как:
Вектор длины столбца Ny при использовании адаптивного MPC.
Массив Ny -by-1-by- (p + 1) при использовании изменяющегося во времени MPC.
DX - Номинальные производные по состоянию объектаНоминальные производные по состоянию объекта, заданные как:
При использовании адаптивного MPC вектора-столбца Nx длины.
Массив Nx -by-1-by- (p + 1) при использовании изменяющегося во времени MPC.
mv - Оптимальные манипулируемые переменные ходыОптимальная манипулируемая переменная перемещается, возвращается как вектор-столбец длины Nmv, где Nmv - количество манипулируемых переменных.
Если контроллер обнаруживает недопустимую задачу оптимизации или сталкивается с числовыми трудностями в решении плохо обусловленной задачи оптимизации, mv остается на своем последнем успешном решении, xc.LastMove.
В противном случае, если задача оптимизации является допустимой, и решатель достигает заданного максимального количества итераций, не найдя оптимального решения, mv:
Остается на своем последнем успешном решении, если Optimizer.UseSuboptimalSolution свойство контроллера false.
Является ли неоптимальное решение, достигнутое после окончательной итерации, если Optimizer.UseSuboptimalSolution свойство контроллера true. Для получения дополнительной информации см. Suboptimal QP Solution.
newStateData - Обновленное состояние контроллераОбновленное состояние контроллера, возвращенное как структура. Для последующих контрольных интервалов передайте newStateData кому mpcmoveCodeGeneration как stateData.
Если оценка пользовательского состояния включена, используйте newStateData чтобы вручную обновить структуру состояния перед следующим контрольным интервалом. Для получения дополнительной информации смотрите Пользовательская оценка состояния.
info - Информация об оптимизации контроллераИнформация об оптимизации контроллера, возвращенная как структура.
Если вы используете неявный или адаптивный 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.
Указания и ограничения по применению:
Можно сгенерировать код как для неявных, так и для явных контроллеров MPC.
Чтобы сгенерировать код для вычисления оптимальных ходов MPC управления:
Сгенерируйте структуры данных из контроллера MPC или явного контроллера MPC, используя getCodeGenerationData.
Чтобы убедиться, что ваш контроллер производит ожидаемые результаты замкнутой системы, симулируйте его с помощью mpcmoveCodeGeneration вместо mpcmove.
Сгенерируйте код для mpcmoveCodeGeneration использование codegen (MATLAB Coder). Этот шаг требует MATLAB® Coder™ программное обеспечение.
getCodeGenerationData | mpcmove | mpcmoveAdaptive | mpcmoveExplicit | codegen (MATLAB CODER)
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.