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