Вычислите нелинейные перемещения MPC управления с поддержкой генерации кода
[
вычисляет оптимальные нелинейные перемещения MPC управления и поддерживает генерацию кода для развертывания на целях в реальном времени. Перемещения управления вычисляются с помощью текущих состояний модели предсказания (mv
,newOnlineData
]
= nlmpcmoveCodeGeneration(coreData
,x
,lastMV
,onlineData
)x
), управление перемещается от предыдущего контрольного интервала (lastMV
), и структуры входных данных (coreData
и nlOnlineData
) сгенерированное использование getCodeGenerationData
.
nlmpcmoveCodeGeneration
не проверяет входные параметры на правильные размерности и типы данных.
[___,
возвращает дополнительную информацию о результате оптимизации, включая количество итераций и стоимости целевой функции.info
] = nlmpcmoveCodeGeneration(___)
Этот пример использует:
Создайте нелинейный контроллер MPC с четырьмя состояниями, двумя выходными параметрами и одним входом.
nlobj = nlmpc(4,2,1);
In standard cost function, zero weights are applied by default to one or more OVs because there are fewer MVs than OVs.
Задайте шаг расчета и горизонты контроллера.
Ts = 0.1; nlobj.Ts = Ts; nlobj.PredictionHorizon = 10; nlobj.ControlHorizon = 5;
Задайте функцию состояния для контроллера, который находится в файле pendulumDT0.m
. Эта модель дискретного времени интегрирует непрерывную модель времени, заданную в pendulumCT0.m
использование многоступенчатого прямого Метода Эйлера.
nlobj.Model.StateFcn = "pendulumDT0";
nlobj.Model.IsContinuousTime = false;
Модель предсказания использует дополнительный параметр, Ts
, представлять шаг расчета. Задайте количество параметров и создайте вектор параметра.
nlobj.Model.NumberOfParameters = 1; params = {Ts};
Задайте выходную функцию модели, передав параметр шага расчета как входной параметр.
nlobj.Model.OutputFcn = "pendulumOutputFcn";
Задайте стандартные ограничения для контроллера.
nlobj.Weights.OutputVariables = [3 3]; nlobj.Weights.ManipulatedVariablesRate = 0.1; nlobj.OV(1).Min = -10; nlobj.OV(1).Max = 10; nlobj.MV.Min = -100; nlobj.MV.Max = 100;
Подтвердите функции модели предсказания.
x0 = [0.1;0.2;-pi/2;0.3]; u0 = 0.4; validateFcns(nlobj,x0,u0,[],params);
Model.StateFcn is OK. Model.OutputFcn is OK. Analysis of user-provided model, cost, and constraint functions complete.
Только два из состояний объекта измеримы. Поэтому создайте расширенный Фильтр Калмана для оценки четырех состояний объекта. Его функция изменения состояния задана в pendulumStateFcn.m
и его функция измерения задана в pendulumMeasurementFcn.m
.
EKF = extendedKalmanFilter(@pendulumStateFcn,@pendulumMeasurementFcn);
Задайте начальные условия для симуляции, инициализируйте расширенное состояние Фильтра Калмана и укажите, что нулевая начальная буква управляла значением переменных.
x0 = [0;0;-pi;0]; y0 = [x0(1);x0(3)]; EKF.State = x0; mv0 = 0;
Создайте структуры данных генерации кода для контроллера, задав начальные условия и параметры.
[coreData,onlineData] = getCodeGenerationData(nlobj,x0,mv0,params);
Задайте выходное значение ссылки в онлайновой структуре данных.
onlineData.ref = [0 0];
Чтобы проверить работу контроллера, запустите симуляцию для 10
секунды. Во время каждого контрольного интервала:
Откорректируйте предыдущее предсказание с помощью текущего измерения.
Вычислите перемещения оптимального управления с помощью nlmpcmoveCodeGeneration
. Эта функция возвращает вычисленные оптимальные последовательности в onlineData
. Передача обновленной структуры данных к nlmpcmoveCodeGeneration
в следующем контрольном интервале обеспечивает исходные предположения для оптимальных последовательностей.
Предскажите состояния модели.
Примените первое вычисленное перемещение оптимального управления к объекту, обновив состояния объекта.
Сгенерируйте данные о датчике с белым шумом.
Сохраните состояния объекта.
mv = mv0; y = y0; x = x0; Duration = 10; xHistory = x0; for ct = 1:(Duration/Ts) % Correct previous prediction xk = correct(EKF,y); % Compute optimal control move [mv,onlineData] = nlmpcmoveCodeGeneration(coreData,xk,mv,onlineData); % Predict prediction model states for the next iteration predict(EKF,[mv; Ts]); % Implement first optimal control move x = pendulumDT0(x,mv,Ts); % Generate sensor data y = x([1 3]) + randn(2,1)*0.01; % Save plant states xHistory = [xHistory x]; end
Сгенерируйте MEX-функцию с MATLAB® Coder™, задав coreData
как константа.
func = 'nlmpcmoveCodeGeneration'; funcOutput = 'nlmpcmoveMEX'; Cfg = coder.config('mex'); Cfg.DynamicMemoryAllocation = 'off'; codegen('-config',Cfg,func,'-o',funcOutput,'-args',... {coder.Constant(coreData),xk,mv,onlineData});
Code generation successful.
coreData
— Нелинейные параметры конфигурации MPCНелинейные параметры конфигурации MPC, которые являются постоянными во время выполнения в виде структуры, сгенерированной с помощью getCodeGenerationData
.
Примечание
При использовании codegen
(MATLAB Coder), coreData
должен быть задан как coder.Constant
(MATLAB Coder).
x
— Текущие состояния модели предсказанияТекущая модель предсказания утверждает в виде вектора из lengthNx, где Nx является количеством состояний модели предсказания. Функция состояния модели предсказания задана в nlobj.Model.StateFcn
.
Поскольку нелинейный контроллер MPC не выполняет оценку состояния, необходимо или измерить или оценить текущие состояния модели предсказания в каждом контрольном интервале. Для получения дополнительной информации о нелинейных моделях предсказания MPC смотрите, Задают Модель Предсказания для Нелинейного MPC.
lastMV
— Управляющие сигналы используются на объекте в предыдущем контрольном интервалеУправляющие сигналы использовали на объекте в предыдущем контрольном интервале в виде вектор-столбца lengthNmv, где Nmv является количеством переменных, которыми управляют.
Примечание
Задайте lastMV
когда переменные сигналы, которыми управляют, применились к объекту в предыдущем контрольном интервале. Как правило, эти сигналы являются значениями, сгенерированными контроллером (mv
). Однако это не всегда имеет место. Например, если ваш контроллер является оффлайновым и рабочим в режиме отслеживания; то есть, контроллер выход не управляет объектом, затем кормя фактическим управляющим сигналом last_mv
может помочь достигнуть передачи bumpless, когда контроллер переключается назад онлайн.
onlineData
— Онлайновые данные контроллераОнлайновые данные контроллера, которые необходимо обновить во время выполнения в виде структуры со следующими полями. Сгенерируйте начальное использование структуры getCodeGenerationData
. Некоторые поля структуры не требуются, в зависимости от настройки контроллера и какие веса или ограничения варьируются во время выполнения.
ref
— Выведите ссылочные значенияВыходные значения ссылки объекта в виде вектора-строки из длины Ny или массив со столбцами Ny, где Ny является количеством выходных переменных.
Чтобы использовать те же ссылочные значения через горизонт предсказания, задайте вектор-строку.
Чтобы варьироваться ссылочные значения по горизонту предсказания со времени k +1 ко времени k +p, задайте массив с до строк p. Здесь, k является текущим временем, и p является горизонтом предсказания. Каждая строка содержит ссылочные значения для одного шага горизонта предсказания. Если вы задаете меньше, чем строки p, значения в итоговой строке используются для остающихся шагов горизонта предсказания.
Если ваша функция стоимости контроллера не использует ref
, оставьте ref
в его значении по умолчанию.
mvTarget
— Переменные цели, которыми управляют,Переменная, которой управляют, предназначается в виде вектора-строки из длины для Nmv или массива со столбцами Nmv, где Nmv является количеством переменных, которыми управляют.
Чтобы использовать те же переменные цели, которыми управляют, через горизонт предсказания, задайте вектор-строку.
Чтобы варьироваться цели по горизонту предсказания (предварительный просмотр) со времени k ко времени k +p-1, задайте массив с до строк p. Здесь, k является текущим временем, и p является горизонтом предсказания. Каждая строка содержит цели для одного шага горизонта предсказания. Если вы задаете меньше, чем строки p, итоговые цели используются для остающихся шагов горизонта предсказания.
Если ваша функция стоимости контроллера не использует mvTarget
, оставьте mvTarget
в его значении по умолчанию.
X0
— Исходные предположения для оптимальных решений состоянияИсходные предположения для оптимальных решений состояния в виде вектора-строки из длины Nx или массив со столбцами Nx, где Nx является количеством состояний.
Чтобы использовать те же исходные предположения через горизонт предсказания, задайте вектор-строку.
Чтобы варьироваться исходные предположения по горизонту предсказания со времени k +1 ко времени k +p, задайте массив с до строк p. Здесь, k является текущим временем, и p является горизонтом предсказания. Каждая строка содержит исходные предположения для одного шага горизонта предсказания. Если вы задаете меньше, чем строки p, итоговые предположения используются для остающихся шагов горизонта предсказания.
В общем случае во время симуляции с обратной связью, вы не задаете X0
самостоятельно. Вместо этого при вызове nlmpcmoveCodeGeneration
, возвратите newOnlineData
выходной аргумент, который содержит обновленный X0
оценки. Можно затем передать newOnlineData
в как onlineData
входной параметр к nlmpcmoveCodeGeneration
для следующего контрольного интервала.
MV0
— Исходные предположения для оптимальных переменных решений, которыми управляют,Исходные предположения для оптимальных переменных решений, которыми управляют, в виде вектора-строки из длины Nmv или массив со столбцами Nmv, где Nmv является количеством переменных, которыми управляют.
Чтобы использовать те же исходные предположения через горизонт предсказания, задайте вектор-строку.
Чтобы варьироваться исходные предположения по горизонту предсказания со времени k ко времени k +p-1, задайте массив с до строк p. Здесь, k является текущим временем, и p является горизонтом предсказания. Каждая строка содержит исходные предположения для одного шага горизонта предсказания. Если вы задаете меньше, чем строки p, итоговые предположения используются для остающихся шагов горизонта предсказания.
В общем случае во время симуляции с обратной связью, вы не задаете MV0
самостоятельно. Вместо этого при вызове nlmpcmoveCodeGeneration
, возвратите newOnlineData
выходной аргумент, который содержит обновленный MV0
оценки. Можно затем передать newOnlineData
в как onlineData
входной параметр к nlmpcmoveCodeGeneration
для следующего контрольного интервала.
Slack0
— Исходное предположение для слабой переменной в решенииИсходное предположение для слабой переменной в решении в виде неотрицательного скаляра.
В общем случае во время симуляции с обратной связью, вы не задаете Slack0
самостоятельно. Вместо этого при вызове nlmpcmoveCodeGeneration
, возвратите newOnlineData
выходной аргумент, который содержит обновленный Slack0
оценки. Можно затем передать newOnlineData
в как onlineData
входной параметр к nlmpcmoveCodeGeneration
для следующего контрольного интервала.
md
— Измеренные значения воздействияИзмеренные значения воздействия в виде вектора-строки из длины Nmd или массив со столбцами Nmd, где Nmd является количеством измеренных воздействий. Если ваш контроллер измерил воздействия, необходимо задать md
. Если у вашего контроллера нет измеренных воздействий, то getCodeGenerationData
не использует это поле.
Чтобы использовать те же значения воздействия через горизонт предсказания, задайте вектор-строку.
Чтобы варьироваться значения воздействия по горизонту предсказания со времени k ко времени k +p, задайте массив с до p +1 строка. Здесь, k является текущим временем, и p является горизонтом предсказания. Каждая строка содержит значения воздействия для одного шага горизонта предсказания. Если вы задаете меньше, чем строки p, значения в итоговой строке используются для остающихся шагов горизонта предсказания.
Parameters
— Значения параметровЗначения параметров, используемые моделью предсказания, пользовательской функцией стоимости и пользовательскими ограничениями в виде вектора ячейки с длиной, равняются Model.NumberOfParameters
свойство контроллера. Если у контроллера нет параметров, то getCodeGenerationData
не использует это поле.
Порядок параметров должен совпадать с порядком, заданным для модели предсказания, пользовательской функции стоимости и пользовательских ограничений.
OutputWeights
— Настраивающие веса выходной переменнойНастраивающие веса выходной переменной, которые заменяют настраивающие веса значения по умолчанию во время выполнения в виде вектора-строки из длины Ny или массив со столбцами Ny, где Ny является количеством выходных переменных. Если вы ожидаете, что ваши веса выходной переменной будут варьироваться во время выполнения, необходимо добавить это поле в онлайновую структуру данных, когда вы вызываете getCodeGenerationData
.
Чтобы использовать те же веса через горизонт предсказания, задайте вектор-строку.
Чтобы варьироваться веса по горизонту предсказания со времени k +1 ко времени k +p, задайте массив с до строк p. Здесь, k является текущим временем, и p является горизонтом предсказания. Каждая строка содержит веса для одного шага горизонта предсказания. Если вы задаете меньше, чем строки p, итоговые веса используются для остающихся шагов горизонта предсказания.
MVWeights
— Переменные настраивающие веса, которыми управляют,Переменные настраивающие веса, которыми управляют, которые заменяют настраивающие веса значения по умолчанию во время выполнения в виде вектора-строки из длины Nmv или массив со столбцами Nmv, где Nmv является количеством переменных, которыми управляют. Если вы ожидаете, что ваши переменные веса, которыми управляют, будут варьироваться во время выполнения, необходимо добавить это поле в онлайновую структуру данных, когда вы вызываете getCodeGenerationData
.
Чтобы использовать те же веса через горизонт предсказания, задайте вектор-строку.
Чтобы варьироваться веса по горизонту предсказания со времени k +1 ко времени k +p, задайте массив с до строк p. Здесь, k является текущим временем, и p является горизонтом предсказания. Каждая строка содержит веса для одного шага горизонта предсказания. Если вы задаете меньше, чем строки p, итоговые веса используются для остающихся шагов горизонта предсказания.
MVRateWeights
— Настраивающие веса с плавающей ставкой, которыми управляют,Настраивающие веса с плавающей ставкой, которыми управляют, которые заменяют настраивающие веса значения по умолчанию во время выполнения в виде вектора-строки из длины Nmv или массив со столбцами Nmv, где Nmv является количеством переменных, которыми управляют. Если вы ожидаете, что ваши веса с плавающей ставкой, которыми управляют, будут варьироваться во время выполнения, необходимо добавить это поле в онлайновую структуру данных, когда вы вызываете getCodeGenerationData
.
Чтобы использовать те же веса через горизонт предсказания, задайте вектор-строку.
Чтобы варьироваться веса по горизонту предсказания со времени k +1 ко времени k +p, задайте массив с до строк p. Здесь, k является текущим временем, и p является горизонтом предсказания. Каждая строка содержит веса для одного шага горизонта предсказания. Если вы задаете меньше, чем строки p, итоговые веса используются для остающихся шагов горизонта предсказания.
ECRWeight
— Ослабьте переменный настраивающий весСлабый настраивающий вес с плавающей ставкой, который заменяет настраивающий вес значения по умолчанию во время выполнения в виде положительной скалярной величины. Если вы ожидаете, что ваш слабый переменный вес будет варьироваться во время выполнения, необходимо добавить это поле в онлайновую структуру данных, когда вы вызываете getCodeGenerationData
.
OutputMin
— Нижние границы выходной переменнойНижние границы выходной переменной, которые заменяют нижние границы по умолчанию во время выполнения в виде вектора-строки из длины Ny или массив со столбцами Ny, где Ny является количеством выходных переменных. Если вы ожидаете, что ваши нижние границы выходной переменной будут варьироваться во время выполнения, необходимо добавить это поле в онлайновую структуру данных, когда вы вызываете getCodeGenerationData
.
Чтобы использовать те же границы через горизонт предсказания, задайте вектор-строку.
Чтобы варьироваться границы по горизонту предсказания со времени k +1 ко времени k +p, задайте массив с до строк p. Здесь, k является текущим временем, и p является горизонтом предсказания. Каждая строка содержит границы для одного шага горизонта предсказания. Если вы задаете меньше, чем строки p, итоговые границы используются для остающихся шагов горизонта предсказания.
OutputMax
— Верхние границы выходной переменнойВерхние границы выходной переменной, которые заменяют верхние границы по умолчанию во время выполнения в виде вектора-строки из длины Ny или массив со столбцами Ny, где Ny является количеством выходных переменных. Если вы ожидаете, что ваши верхние границы выходной переменной будут варьироваться во время выполнения, необходимо добавить это поле в онлайновую структуру данных, когда вы вызываете getCodeGenerationData
.
Чтобы использовать те же границы через горизонт предсказания, задайте вектор-строку.
Чтобы варьироваться границы по горизонту предсказания со времени k +1 ко времени k +p, задайте массив с до строк p. Здесь, k является текущим временем, и p является горизонтом предсказания. Каждая строка содержит границы для одного шага горизонта предсказания. Если вы задаете меньше, чем строки p, итоговые границы используются для остающихся шагов горизонта предсказания.
StateMin
— Нижние границы состоянияНижние границы состояния, которые заменяют нижние границы по умолчанию во время выполнения в виде вектора-строки из длины Nx или массив со столбцами Nx, где Nx является количеством состояний. Если вы ожидаете, что ваши нижние границы состояния будут варьироваться во время выполнения, необходимо добавить это поле в онлайновую структуру данных, когда вы вызываете getCodeGenerationData
.
Чтобы использовать те же границы через горизонт предсказания, задайте вектор-строку.
Чтобы варьироваться границы по горизонту предсказания со времени k +1 ко времени k +p, задайте массив с до строк p. Здесь, k является текущим временем, и p является горизонтом предсказания. Каждая строка содержит границы для одного шага горизонта предсказания. Если вы задаете меньше, чем строки p, итоговые границы используются для остающихся шагов горизонта предсказания.
StateMax
— Верхние границы состоянияВерхние границы состояния, которые заменяют верхние границы по умолчанию во время выполнения в виде вектора-строки из длины Nx или массив со столбцами Nx, где Nx является количеством состояний. Если вы ожидаете, что ваши верхние границы состояния будут варьироваться во время выполнения, необходимо добавить это поле в онлайновую структуру данных, когда вы вызываете getCodeGenerationData
.
Чтобы использовать те же границы через горизонт предсказания, задайте вектор-строку.
Чтобы варьироваться границы по горизонту предсказания со времени k +1 ко времени k +p, задайте массив с до строк p. Здесь, k является текущим временем, и p является горизонтом предсказания. Каждая строка содержит границы для одного шага горизонта предсказания. Если вы задаете меньше, чем строки p, итоговые границы используются для остающихся шагов горизонта предсказания.
MVMin
— Переменные нижние границы, которыми управляют,Переменные нижние границы, которыми управляют, которые заменяют нижние границы по умолчанию во время выполнения в виде вектора-строки из длины Nmv или массив со столбцами Nmv, где Nmv является количеством переменных, которыми управляют. Если вы ожидаете, что ваши переменные нижние границы, которыми управляют, будут варьироваться во время выполнения, необходимо добавить это поле в онлайновую структуру данных, когда вы вызываете getCodeGenerationData
.
Чтобы использовать те же границы через горизонт предсказания, задайте вектор-строку.
Чтобы варьироваться границы по горизонту предсказания со времени k +1 ко времени k +p, задайте массив с до строк p. Здесь, k является текущим временем, и p является горизонтом предсказания. Каждая строка содержит границы для одного шага горизонта предсказания. Если вы задаете меньше, чем строки p, итоговые границы используются для остающихся шагов горизонта предсказания.
MVMax
— Переменные верхние границы, которыми управляют,Переменные верхние границы, которыми управляют, которые заменяют верхние границы по умолчанию во время выполнения в виде вектора-строки из длины Nmv или массив со столбцами Nmv, где Nmv является количеством переменных, которыми управляют. Если вы ожидаете, что ваши переменные верхние границы, которыми управляют, будут варьироваться во время выполнения, необходимо добавить это поле в онлайновую структуру данных, когда вы вызываете getCodeGenerationData
.
Чтобы использовать те же границы через горизонт предсказания, задайте вектор-строку.
Чтобы варьироваться границы по горизонту предсказания со времени k +1 ко времени k +p, задайте массив с до строк p. Здесь, k является текущим временем, и p является горизонтом предсказания. Каждая строка содержит границы для одного шага горизонта предсказания. Если вы задаете меньше, чем строки p, итоговые границы используются для остающихся шагов горизонта предсказания.
MVRateMin
— Нижние границы с плавающей ставкой, которыми управляют,Нижние границы с плавающей ставкой, которыми управляют, которые заменяют нижние границы по умолчанию во время выполнения в виде вектора-строки из длины Nmv или массив со столбцами Nmv, где Nmv является количеством переменных, которыми управляют. Если вы ожидаете, что ваши нижние границы с плавающей ставкой, которыми управляют, будут варьироваться во время выполнения, необходимо добавить это поле в онлайновую структуру данных, когда вы вызываете getCodeGenerationData
.
Чтобы использовать те же границы через горизонт предсказания, задайте вектор-строку.
Чтобы варьироваться границы по горизонту предсказания со времени k +1 ко времени k +p, задайте массив с до строк p. Здесь, k является текущим временем, и p является горизонтом предсказания. Каждая строка содержит границы для одного шага горизонта предсказания. Если вы задаете меньше, чем строки p, итоговые границы используются для остающихся шагов горизонта предсказания.
MVRateMax
— Верхние границы с плавающей ставкой, которыми управляют,Верхние границы с плавающей ставкой, которыми управляют, которые заменяют верхние границы по умолчанию во время выполнения в виде вектора-строки из длины Nmv или массив со столбцами Nmv, где Nmv является количеством переменных, которыми управляют. Если вы ожидаете, что ваши верхние границы с плавающей ставкой, которыми управляют, будут варьироваться во время выполнения, необходимо добавить это поле в онлайновую структуру данных, когда вы вызываете getCodeGenerationData
.
Чтобы использовать те же границы через горизонт предсказания, задайте вектор-строку.
Чтобы варьироваться границы по горизонту предсказания со времени k +1 ко времени k +p, задайте массив с до строк p. Здесь, k является текущим временем, и p является горизонтом предсказания. Каждая строка содержит границы для одного шага горизонта предсказания. Если вы задаете меньше, чем строки p, итоговые границы используются для остающихся шагов горизонта предсказания.
mv
— Оптимальное действие управления переменными, которым управляют,Оптимальное действие управления переменными, которым управляют, возвращенное как вектор-столбец длины Nmv, где Nmv является количеством переменных, которыми управляют.
Если решатель сходится к решению для локального оптимума (info.ExitFlag
положительно), затем mv
содержит оптимальное решение.
Если решатель достигает максимального количества итераций, находит выполнимое субоптимальное решение (info.ExitFlag = 0
) и:
coredata.usesuboptimalsolution
true
, затем mv
содержит субоптимальное решение
coredata.usesuboptimalsolution
false
, затем mv
содержит lastMV
Если решателю не удается найти возможное решение (info.ExitFlag
отрицательно), затем mv
содержит lastMV
.
newOnlineData
— Обновленные онлайновые данные контроллераОбновленные онлайновые данные контроллера, возвращенные как структура. Эта структура совпадает с onlineData
, за исключением того, что исходные предположения переменной решения (X0
, MV0
, и Slack0
) обновляются.
Для последующих контрольных интервалов, горячий запуск решатель путем изменения онлайновых данных в newOnlineData
и передача обновленной структуры к nlmpcmoveCodeGeneration
как onlineData
. Выполнение так позволяет решателю использовать исходные предположения переменной решения в качестве начальной точки для ее решения.
info
— Детали решенияДетали решения, возвращенные как структура со следующими полями.
MVopt
— Оптимальная переменная последовательность, которой управляют,Оптимальная переменная последовательность, которой управляют, возвращенная как (p +1)-by-Nmv массив, где p является горизонтом предсказания и Nmv, является количеством переменных, которыми управляют.
MVopt(i,:)
содержит расчетные оптимальные значения переменных, которыми управляют, во время k+i-1
, для i = 1,...,p
, где k
текущее время. MVopt(1,:)
содержит те же значения переменных, которыми управляют, как выходной аргумент mv
. Поскольку контроллер не вычисляет перемещения оптимального управления во время k+p
, MVopt(p+1,:)
равно MVopt(p,:)
.
Xopt
— Оптимальная модель предсказания утверждает последовательностьОптимальная модель предсказания утверждает последовательность, возвращенную как (p +1)-by-Nx массив, где p является горизонтом предсказания, и Nx является количеством состояний в модели предсказания.
Xopt(i,:)
содержит расчетные значения состояния во время k+i-1
, для i = 2,...,p+1
, где k
текущее время. Xopt(1,:)
совпадает с текущими состояниями в x
.
Yopt
— Оптимальная последовательность выходной переменнойОптимальная последовательность выходной переменной, возвращенная как (p +1)-by-Ny массив, где p является горизонтом предсказания и Ny, является количеством выходных параметров.
Yopt(i,:)
содержит расчетные выходные значения во время k+i-1
, для i = 2,...,p+1
, где k
текущее время. Yopt(1,:)
вычисляется на основе текущих состояний в x
и текущие измеренные воздействия в md
,если таковые имеются.
Topt
— Последовательность времени горизонта предсказанияПоследовательность времени горизонта предсказания, возвращенная как вектор-столбец длины p +1, где p является горизонтом предсказания. Topt
содержит последовательность времени со времени k ко времени k +p, где k является текущим временем.
Topt(1)
= 0 представляет текущее время. Последующие временные шаги Topt(i)
Ts*(i-1)
, где Ts
шаг расчета контроллера.
Используйте Topt
при графическом выводе MVopt
, Xopt
, или Yopt
последовательности.
Slack
— Ослабьте переменную в оптимумеОслабьте переменную в оптимуме, ε, используемый в ограничительном смягчении, возвращенном как неотрицательное скалярное значение.
ε = 0 — Всем мягким ограничениям удовлетворяют по целому горизонту предсказания.
ε> 0 — По крайней мере одно мягкое ограничение нарушено. Когда больше чем одно ограничение нарушено, ε представляет худший случай мягкое нарушение ограничений (масштабируемый вашими значениями ECR для каждого ограничения).
ExitFlag
— Код выхода оптимизацииКод выхода оптимизации, возвращенный как одно из следующего:
Положительное Целое число — Оптимальное решение найдено
0 — Выполнимое субоптимальное решение, найденное после максимального количества итераций
Отрицательное целое число — Никакое возможное решение не найдено
Iterations
— Количество итерацийКоличество итераций используется решателем, возвращенным как положительное целое число.
Cost
— Целевая функция стоитсяСтоимость целевой функции, возвращенная как неотрицательное скалярное значение. Стоимость определяет количество степени, до которой контроллер достиг ее целей.
Величина затрат только значима когда ExitFlag
является неотрицательным.
Указания и ограничения по применению:
nlmpcmoveCodeGeneration
поддержки, генерирующие код только для нелинейных контроллеров MPC, которые используют значение по умолчанию fmincon
решатель с алгоритмом SQP. Однако можно симулировать контроллеры, использующие другой fmincon
алгоритмы.
Когда используется для генерации кода, нелинейные контроллеры MPC не поддерживают анонимные функции для модели предсказания, пользовательской функции стоимости или пользовательских ограничительных функций. Однако nlmpcmoveCodeGeneration
может все еще симулировать контроллеры то использование анонимные функции.
Ваши пользовательские функции должны быть на пути MATLAB® и совместимы с MATLAB Coder™. Для получения дополнительной информации о проверке совместимости смотрите Проверку кода при помощи Инструмента Готовности Генерации кода (MATLAB Coder).
Генерация кода для нелинейных контроллеров MPC поддерживает только данные с двойной точностью.
Сгенерировать код для вычисления оптимального управления перемещается для нелинейного контроллера MPC:
Сгенерируйте структуры данных от нелинейного диспетчера MPC, использующего getCodeGenerationData
.
Чтобы проверить, что ваш контроллер приводит к ожидаемым результатам с обратной связью, симулируйте его использование nlmpcmoveCodeGeneration
вместо nlmpcmove
.
Сгенерируйте код для nlmpcmoveCodeGeneration
использование codegen
(MATLAB Coder). Этот шаг требует программного обеспечения MATLAB Coder.
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.