Вычислите перемещения оптимального управления с поддержкой генерации кода
[
вычисляет оптимальные перемещения 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-функцию с 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});
configData
— Параметры конфигурации MPCПараметры конфигурации MPC, которые являются постоянными во время выполнения в виде структуры, сгенерированной с помощью getCodeGenerationData
.
При использовании codegen
, configData
должен быть задан как coder.Constant
.
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
isempty.
Не изменяйте значение Covariance
. Всегда используйте значения, возвращенные любым getCodeGenerationData
или mpcmoveCodeGeneration
.
iA
— Активные ограничения неравенстваАктивные ограничения неравенства, где равным фрагментом неравенства является true
В виде логического вектора длины M. Если iA
(i) является true
, затем i th неравенство активен для последнего решения для решателя 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
isempty
, веса по умолчанию, заданные в исходном контроллере MPC, используются.
u
— Переменные настраивающие веса, которыми управляют,[]
(значение по умолчанию) | вектор-строка | массивПеременные настраивающие веса, которыми управляют, которые заменяют исходный контроллер, управляли переменными весами во время выполнения в виде вектора-строки или массива неотрицательных значений.
Чтобы использовать те же веса через горизонт предсказания, задайте вектор-строку из длины Nmv, где Nmv является количеством переменных, которыми управляют.
Чтобы варьироваться настраивающиеся веса по горизонту предсказания со времени k ко времени k +p-1, задайте массив со столбцами Nmv и до строк p. Здесь, k является текущим временем, и p является горизонтом предсказания. Каждая строка содержит переменные настраивающие веса, которыми управляют, для одного шага горизонта предсказания. Если вы задаете меньше, чем строки p, веса в итоговой строке используются в остающихся шагах горизонта предсказания.
Если u
isempty
, веса по умолчанию, заданные в исходном контроллере MPC, используются.
du
— Настраивающие веса с плавающей ставкой, которыми управляют,[]
(значение по умолчанию) | вектор-строка | массивНастраивающие веса с плавающей ставкой, которыми управляют, которые заменяют исходный контроллер, управляли весами с плавающей ставкой во время выполнения в виде вектора-строки или массива неотрицательных значений.
Чтобы использовать те же веса через горизонт предсказания, задайте вектор-строку из длины Nmv, где Nmv является количеством переменных, которыми управляют.
Чтобы варьироваться настраивающиеся веса по горизонту предсказания со времени k ко времени k +p-1, задайте массив со столбцами Nmv и до строк p. Здесь, k является текущим временем, и p является горизонтом предсказания. Каждая строка содержит настраивающие веса с плавающей ставкой, которыми управляют, для одного шага горизонта предсказания. Если вы задаете меньше, чем строки p, веса в итоговой строке используются в остающихся шагах горизонта предсказания.
Если du
isempty
, веса по умолчанию, заданные в исходном контроллере MPC, используются.
ecr
— Вес на слабой переменной используется в ограничительном смягчении[]
(значение по умолчанию) | неотрицательный скалярВес на слабой переменной используется в ограничении, смягчающемся в виде неотрицательного скаляра.
Если ecr
isempty
, вес по умолчанию, заданный в исходном контроллере MPC, используется.
limits
— Обновленные ограничения ввода и выводаОбновленные ограничения ввода и вывода в виде структуры. Если вы не ожидаете, что ограничения изменятся во время выполнения, проигнорируйте limits
. Это поле проигнорировано при использовании явного контроллера MPC.
Эта структура содержит следующие поля:
ymin
— Нижние границы выходной переменной[]
(значение по умолчанию) | вектор-столбецНижние границы выходной переменной в виде вектор-столбца длины Ny. ymin(i)
заменяет OutputVariables(i).Min
ограничение от исходного диспетчера. Если OutputVariables(i).Min
свойство контроллера задано как вектор, ymin(i)
заменяет первую конечную запись в этом векторе и остающийся сдвиг значений, чтобы сохранить тот же ограничительный профиль.
Если ymin
isempty
, границы по умолчанию, заданные в исходном контроллере MPC, используются.
ymax
— Верхние границы выходной переменной[]
(значение по умолчанию) | вектор-столбецВерхние границы выходной переменной в виде вектор-столбца длины Ny. ymax(i)
заменяет OutputVariables(i).Max
ограничение от исходного диспетчера. Если OutputVariables(i).Max
свойство контроллера задано как вектор, ymax(i)
заменяет первую конечную запись в этом векторе и остающийся сдвиг значений, чтобы сохранить тот же ограничительный профиль.
Если ymax
isempty
, границы по умолчанию, заданные в исходном контроллере MPC, используются.
umin
— Переменные нижние границы, которыми управляют,[]
(значение по умолчанию) | вектор-столбецПеременные нижние границы, которыми управляют, в виде вектор-столбца длины Nmv. umin(i)
заменяет ManipulatedVariables(i).Min
ограничение от исходного диспетчера. Если ManipulatedVariables(i).Min
свойство контроллера задано как вектор, umin(i)
заменяет первую конечную запись в этом векторе и остающийся сдвиг значений, чтобы сохранить тот же ограничительный профиль.
Если umin
isempty
, границы по умолчанию, заданные в исходном контроллере MPC, используются.
umax
— Переменные верхние границы, которыми управляют,[]
(значение по умолчанию) | вектор-столбецПеременные верхние границы, которыми управляют, в виде вектор-столбца длины Nmv. umax(i)
заменяет ManipulatedVariables(i).Max
ограничение от исходного диспетчера. Если ManipulatedVariables(i).Max
свойство контроллера задано как вектор, umax(i)
заменяет первую конечную запись в этом векторе и остающийся сдвиг значений, чтобы сохранить тот же ограничительный профиль.
Если umax
isempty
, границы по умолчанию, заданные в исходном контроллере MPC, используются.
customconstraints
— Обновленные пользовательские смешанные ограничения ввода/выводаОбновленные пользовательские смешанные ограничения ввода/вывода в виде структуры. Это поле проигнорировано при использовании явного контроллера MPC.
Эта структура имеет следующие поля:
E
— Переменное, постоянное ограничение, которым управляют[]
(значение по умолчанию) | Nc-by-Nmv массивПеременное ограничение, которым управляют, постоянное в виде Nc-by-Nmv массив, где Nc является количеством ограничений и Nmv, является количеством переменных, которыми управляют.
Если E
isempty
, соответствующее ограничение, заданное в исходном контроллере 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
— Горизонт предсказания[]
(значение по умолчанию) | положительное целое числоГоризонт предсказания, который заменяет значение configData.p
во время выполнения в виде положительного целого числа.
Определение p
изменяется:
Количество строк в оптимальных последовательностях, возвращенных в info
Максимальные размерности полей в model
когда configData.IsLTV
true
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 +m1-1, второе свободное перемещение применяется со времени k +m1 через k +m1+m2-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
— Номинальные состояния объектаНоминальный объект утверждает в виде:
Вектор-столбец длины Nx при использовании адаптивного MPC.
Nx - 1 на (p +1) массив при использовании изменяющегося во времени MPC.
U
— Номинальные входные параметры объектаНоминальный объект вводит в виде:
Вектор-столбец длины Nu при использовании адаптивного MPC.
Nu - 1 на (p +1) массив при использовании изменяющегося во времени MPC.
Y
— Номинальный объект выходные параметрыНоминальный объект выходные параметры в виде:
Вектор-столбец длины Ny при использовании адаптивного MPC.
Ny - 1 на (p +1) массив при использовании изменяющегося во времени MPC.
DX
— Номинальные производные состояния объектаНоминальные производные состояния объекта в виде:
Вектор-столбец длины Nx при использовании адаптивного MPC.
Nx - 1 на (p +1) массив при использовании изменяющегося во времени MPC.
mv
— Оптимальные переменные перемещения, которыми управляют,Оптимальные переменные перемещения, которыми управляют, возвращенные как вектор-столбец длины Nmv, где Nmv является количеством переменных, которыми управляют.
Если контроллер обнаруживает неосуществимую задачу оптимизации или сталкивается с числовыми трудностями при решении плохо обусловленной задачи оптимизации, mv
остается в его новом успешном решении, x.LastMove
.
В противном случае, если задача оптимизации выполнима, и решатель достигает заданного максимального количества итераций, не находя оптимальное решение, mv
:
Остается в его новом успешном решении если Optimizer.UseSuboptimalSolution
свойством контроллера является false
.
Субоптимальное решение, достигнутое после итоговой итерации если Optimizer.UseSuboptimalSolution
свойством контроллера является true
. Для получения дополнительной информации смотрите Субоптимальное Решение QP.
newStateData
— Обновленное состояние контроллераОбновленное состояние контроллера, возвращенное как структура. Для последующих контрольных интервалов передайте newStateData
к mpcmoveCodeGeneration
как stateData
.
Если пользовательская оценка состояния включена, используйте newStateData
вручную обновить структуру состояния перед следующим контрольным интервалом. Для получения дополнительной информации смотрите Пользовательскую Оценку состояния.
info
— Информация об оптимизации контроллераИнформация об оптимизации контроллера, возвращенная как структура.
Если вы используете неявный или адаптивный 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
.
Указания и ограничения по применению:
Можно сгенерировать код и для неявных и для явных контроллеров MPC.
Сгенерировать код для вычисления оптимальных перемещений MPC управления:
Сгенерируйте структуры данных от диспетчера MPC или явного контроллера MPC, использующего getCodeGenerationData
.
Чтобы проверить, что ваш контроллер приводит к ожидаемым результатам с обратной связью, симулируйте его с помощью mpcmoveCodeGeneration
вместо mpcmove
.
Сгенерируйте код для mpcmoveCodeGeneration
использование codegen
. Этот шаг требует программного обеспечения MATLAB® Coder™.
codegen
| getCodeGenerationData
| mpcmove
| mpcmoveAdaptive
| mpcmoveExplicit
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.