Вычислите действие оптимального управления для нелинейного контроллера MPC
задает дополнительные опции во время выполнения для вычисления перемещений оптимального управления. Используя mv
= nlmpcmove(nlmpcobj
,x
,lastmv
,ref
,md
,options
)options
, вы можете задать исходные предположения для состояния и управляли переменными траекториями, настраивающими весами обновления при ограничениях, или измените параметры модели предсказания.
вычисляет действие оптимального управления в течение текущего времени. Чтобы симулировать нелинейное MPC управление с обратной связью, вызвать mv
= nlmpcmove(nlmpcMSobj
,x
,lastmv
)nlmpcmove
неоднократно.
задает дополнительный mv
= nlmpcmove(nlmpcobj
,x
,lastmv
,simdata
)simdata
структура, которая содержит измеренные воздействия, границы во время выполнения, параметры для состояния и функций этапа и исходных предположений для состояния и управляла переменными траекториями. Во всеобщем употреблении следующий синтаксис, чтобы возвратить новый simdata
(содержащий обновленные исходные предположения) как второй выходной аргумент.
[
возвращает обновленный mv
,simdata
] = nlmpcmove(___)simdata
структура, которая содержит новые исходные предположения для состояния и траекторий, которыми управляют, которые будут использоваться в следующем контрольном интервале. Хорошие исходные предположения важны, поскольку они помогают решателю сходиться к решению быстрее.
Создайте нелинейный контроллер MPC с шестью состояниями, шестью выходными параметрами и четырьмя входными параметрами.
nx = 6; ny = 6; nu = 4; nlobj = nlmpc(nx,ny,nu);
In standard cost function, zero weights are applied by default to one or more OVs because there are fewer MVs than OVs.
Задайте шаг расчета контроллера и горизонты.
Ts = 0.4; p = 30; c = 4; nlobj.Ts = Ts; nlobj.PredictionHorizon = p; nlobj.ControlHorizon = c;
Задайте функцию состояния модели предсказания и якобиан функции состояния. В данном примере используйте модель летающего робота.
nlobj.Model.StateFcn = "FlyingRobotStateFcn"; nlobj.Jacobian.StateFcn = "FlyingRobotStateJacobianFcn";
Задайте пользовательскую функцию стоимости для контроллера, который заменяет стандартную функцию стоимости.
nlobj.Optimization.CustomCostFcn = @(X,U,e,data) Ts*sum(sum(U(1:p,:))); nlobj.Optimization.ReplaceStandardCost = true;
Задайте пользовательскую ограничительную функцию для контроллера.
nlobj.Optimization.CustomEqConFcn = @(X,U,data) X(end,:)';
Задайте линейные ограничения на переменные, которыми управляют.
for ct = 1:nu nlobj.MV(ct).Min = 0; nlobj.MV(ct).Max = 1; end
Подтвердите модель предсказания и пользовательские функции в начальных состояниях (x0
) и начальные входные параметры (u0
) из робота.
x0 = [-10;-10;pi/2;0;0;0]; u0 = zeros(nu,1); validateFcns(nlobj,x0,u0);
Model.StateFcn is OK. Jacobian.StateFcn is OK. No output function specified. Assuming "y = x" in the prediction model. Optimization.CustomCostFcn is OK. Optimization.CustomEqConFcn is OK. Analysis of user-provided model, cost, and constraint functions complete.
Вычислите оптимальное состояние, и управлял переменными траекториями, которые возвращены в info
.
[~,~,info] = nlmpcmove(nlobj,x0,u0);
Slack variable unused or zero-weighted in your custom cost function. All constraints will be hard.
Постройте оптимальные траектории.
FlyingRobotPlotPlanning(info,Ts)
Optimal fuel consumption = 1.884953
Создайте нелинейный контроллер 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;
Задайте выходную функцию модели, передав параметр шага расчета как входной параметр.
nlobj.Model.OutputFcn = @(x,u,Ts) [x(1); x(3)];
Задайте стандартные ограничения для контроллера.
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, [], {Ts});
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);
Задайте начальные условия для симуляции, инициализируйте расширенное состояние Фильтра Калмана и укажите, что нулевая начальная буква управляла значением переменных.
x = [0;0;-pi;0]; y = [x(1);x(3)]; EKF.State = x; mv = 0;
Задайте выходное значение ссылки.
yref = [0 0];
Создайте nlmpcmoveopt
объект, и задает параметр шага расчета.
nloptions = nlmpcmoveopt; nloptions.Parameters = {Ts};
Запустите симуляцию для 10
секунды. Во время каждого контрольного интервала:
Откорректируйте предыдущее предсказание с помощью текущего измерения.
Вычислите перемещения оптимального управления с помощью nlmpcmove
. Эта функция возвращает вычисленные оптимальные последовательности в nloptions
. Передача обновленных опций возражает против nlmpcmove
в следующем контрольном интервале обеспечивает исходные предположения для оптимальных последовательностей.
Предскажите состояния модели.
Примените первое вычисленное перемещение оптимального управления к объекту, обновив состояния объекта.
Сгенерируйте данные о датчике с белым шумом.
Сохраните состояния объекта.
Duration = 10; xHistory = x; for ct = 1:(Duration/Ts) % Correct previous prediction xk = correct(EKF,y); % Compute optimal control moves [mv,nloptions] = nlmpcmove(nlobj,xk,mv,yref,[],nloptions); % 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
Постройте получившиеся траектории состояния.
figure subplot(2,2,1) plot(0:Ts:Duration,xHistory(1,:)) xlabel('time') ylabel('z') title('cart position') subplot(2,2,2) plot(0:Ts:Duration,xHistory(2,:)) xlabel('time') ylabel('zdot') title('cart velocity') subplot(2,2,3) plot(0:Ts:Duration,xHistory(3,:)) xlabel('time') ylabel('theta') title('pendulum angle') subplot(2,2,4) plot(0:Ts:Duration,xHistory(4,:)) xlabel('time') ylabel('thetadot') title('pendulum velocity')
В этом примере показано, как создать и симулировать простой многоступенчатый контроллер MPC в замкнутом цикле, не используя исходные предположения, с функцией MATLAB® nlmpcmove
.
Создайте многоступенчатый контроллер MPC
Создайте многоступенчатый нелинейный объект MPC с горизонтом с пятью шагами, одним состоянием и одной переменной, которой управляют.
nlmsobj = nlmpcMultistage(5,1,1);
Задайте функцию изменения состояния для модели предсказания (mystatefcn
задан в конце этого примера).
nlmsobj.Model.StateFcn = @mystatefcn;
Задайте функции стоимости для последних трех этапов (mycostfcn
задан в конце файла).
for i=3:6 nlmsobj.Stages(6).CostFcn = @mycostfcn; end
Симулируйте контроллер в замкнутом цикле
Инициализируйте состояние объекта и введите.
x=3; mv=0;
Подтвердите функции.
validateFcns(nlmsobj,x,mv);
Model.StateFcn is OK. "CostFcn" of the following stages 6 are OK. Analysis of user-provided model, cost, and constraint functions complete.
Симулируйте цикл управления для 10 шагов, не обновляя исходное предположение.
for k=1:10 mv = nlmpcmove(nlmsobj, x, mv); % calculate move (without initial guess) x = x + (mv-sqrt(x))*1; % update x: x(t+1)=x(t)+xdot*Ts end
Обратите внимание на то, что, потому что исходные предположения не предоставляются как входной параметр, nlmpcmove
потребности повторно вычислить их на каждом временном шаге, который негативно влияет на эффективность. Не предоставление исходных предположений может быть приемлемой начальной точкой, но в целом не предлагается. Как лучшая практика, используйте обновленные исходные предположения на каждом временном шаге, как показано в Симулируют Многоступенчатый Нелинейный Контроллер MPC Используя Исходные предположения, так, чтобы nlmpcmove
не должен повторно вычислять их на каждом временном шаге.
Отобразите окончательные значения состояния и переменных, которыми управляют.
disp(['Final value of x =' num2str(x)])
Final value of x =0.57118
disp(['Final value of mv =' num2str(mv)])
Final value of mv =0.75571
Функции поддержки
Функция изменения состояния.
function xdot = mystatefcn(x,u) xdot = u-sqrt(x); end
Подготовьте функции стоимости.
function j = mycostfcn(s,x,u) j = abs(u)/s+s*x^2; end
В этом примере показано, как создать и симулировать простой многоступенчатый контроллер MPC в замкнутом цикле с помощью исходных предположений с функцией MATLAB® nlmpcmove
.
Создайте многоступенчатый контроллер MPC
Создайте многоступенчатый объект MPC с горизонтом с семью шагами, одним состоянием и одной переменной, которой управляют.
nlmsobj = nlmpcMultistage(7,1,1);
Задайте функцию изменения состояния для модели предсказания (mystatefcn
задан в конце этого примера).
nlmsobj.Model.StateFcn = @mystatefcn;
Как лучшая практика, используйте Якобианы каждый раз, когда они доступны, в противном случае решатель должен вычислить ее численно.
Задайте якобиан функции изменения состояния (mystatejacobian
задан в конце файла).
nlmsobj.Model.StateJacFcn = @mystatejac;
Задайте функции стоимости для всех этапов кроме первых двух (mycostfcn
задан в конце файла).
for i=3:8 nlmsobj.Stages(6).CostFcn = @mycostfcn; end
Задайте начальные условия, создайте структуру данных и подтвердите функции
Инициализируйте состояние объекта и введите.
x=3; mv=0;
Создайте начальную структуру данных моделирования.
simdata = getSimulationData(nlmsobj)
simdata = struct with fields:
InitialGuess: []
Подтвердите функции и структуру данных.
validateFcns(nlmsobj,x,mv,simdata);
Model.StateFcn is OK. Model.StateJacFcn is OK. "CostFcn" of the following stages 6 are OK. Analysis of user-provided model, cost, and constraint functions complete.
Симулируйте контроллер в замкнутом цикле
Симулируйте цикл управления для 10 шагов.
for k=1:10 [mv,simdata] = nlmpcmove(nlmsobj, x, mv, simdata); % calculate move x = x + (mv-sqrt(x))*1; % update x: x(t+1)=x(t)+xdot*Ts end
Поскольку обновленные исходные предположения предоставляются как входной параметр в simdata
структура, nlmpcmove
не должен повторно вычислять их на каждом временном шаге, который сохраняет время вычисления и улучшает производительность. Обновление исходных предположений на каждом временном шаге является лучшей практикой.
Отобразите последние значения состояния и переменных, которыми управляют.
disp(['Final value of x =' num2str(x)])
Final value of x =1.6556
disp(['Final value of mv =' num2str(mv)])
Final value of mv =1.2816
Функции поддержки
Функция изменения состояния.
function xdot = mystatefcn(x,u) xdot = u-sqrt(x); end
Якобиан функции изменения состояния.
function [A,B] = mystatejac(x,~) A = -1/(2*x^(1/2)); B = 1; end
Подготовьте функции стоимости.
function j = mycostfcn(s,x,u) j = abs(u)/s+s*x^2; end
nlmpcobj
— Нелинейный контроллер MPCnlmpc
объектНелинейный контроллер MPC в виде nlmpc
объект.
x
— Текущие состояния модели предсказанияТекущая модель предсказания утверждает в виде вектора из lengthNx, где Nx является количеством состояний модели предсказания. Поскольку нелинейный контроллер MPC не выполняет оценку состояния, необходимо или измерить или оценить текущие состояния модели предсказания в каждом контрольном интервале. Для получения дополнительной информации о нелинейных моделях предсказания MPC смотрите, Задают Модель Предсказания для Нелинейного MPC.
lastmv
— Управляющие сигналы используются на объекте в предыдущем контрольном интервалеУправляющие сигналы использовали на объекте в предыдущем контрольном интервале в виде вектора из lengthNmv, где Nmv является количеством переменных, которыми управляют.
Примечание
Задайте lastmv
когда переменные сигналы, которыми управляют, применились к объекту в предыдущем контрольном интервале. Как правило, эти сигналы являются значениями, сгенерированными контроллером, хотя это не всегда имеет место. Например, если ваш контроллер является оффлайновым и рабочим в режиме отслеживания; то есть, контроллер выход не управляет объектом, затем кормя фактическим управляющим сигналом last_mv
может помочь достигнуть передачи bumpless, когда контроллер переключается назад онлайн.
ref
— Объект выходные значения ссылки[]
(значение по умолчанию) | вектор-строка | массивВыходные значения ссылки объекта в виде вектора-строки из длины Ny или массив со столбцами Ny, где Ny является количеством выходных переменных. Если вы не задаете ref
, ссылочные значения по умолчанию являются нулем.
Чтобы использовать те же ссылочные значения через горизонт предсказания, задайте вектор-строку.
Чтобы варьироваться ссылочные значения по горизонту предсказания со времени k +1 ко времени k +p, задайте массив с до строк p. Здесь, k является текущим временем, и p является горизонтом предсказания. Каждая строка содержит ссылочные значения для одного шага горизонта предсказания. Если вы задаете меньше, чем строки p, значения в итоговой строке используются для остающихся шагов горизонта предсказания.
md
— Измеренные значения воздействия[]
(значение по умолчанию) | вектор-строка | массивИзмеренные значения воздействия в виде вектора-строки из длины Nmd или массив со столбцами Nmd, где Nmd является количеством измеренных воздействий. Если ваш контроллер измерил воздействия, необходимо задать md
. Если у вашего контроллера нет измеренных воздействий, задайте md
как []
.
Чтобы использовать те же значения воздействия через горизонт предсказания, задайте вектор-строку.
Чтобы варьироваться значения воздействия по горизонту предсказания со времени k ко времени k +p, задайте массив с до p +1 строка. Здесь, k является текущим временем, и p является горизонтом предсказания. Каждая строка содержит значения воздействия для одного шага горизонта предсказания. Если вы задаете меньше, чем строки p, значения в итоговой строке используются для остающихся шагов горизонта предсказания.
options
— Опции во время выполненияnlmpcmoveopt
объектОпции во время выполнения в виде nlmpcmoveopt
объект. Используя эти опции, вы можете:
Настройте веса контроллера
Обновите линейные ограничения
Поставьте переменные цели, которыми управляют,
Задайте параметры модели предсказания
Обеспечьте исходные предположения для состояния, и управлял переменными траекториями
Эти опции применяются только к току nlmpcmove
момент времени.
Чтобы повысить эффективность решателя, это - лучшая практика, чтобы задать исходные предположения для состояния и управляло переменными траекториями.
nlmpcMSobj
— Нелинейный Многоступенчатый контроллер MPCnlmpcMultistage
объектМногоступенчатый нелинейный контроллер MPC в виде nlmpcMultistage
объект.
simdata
— Данные моделирования во время выполненияДанные моделирования во время выполнения в виде структуры. Это должно быть первоначально создано getSimulationData
, и затем заполненный (в случае необходимости) прежде чем быть переданным nlmpcmove
как входной параметр. Обновленная версия затем всегда возвращается как второй выходной аргумент nlmpcmove
. Обратите внимание на то, что MVMin
, MVMax
, StateMin
, StateMax
, MVRateMin
, MVRateMax
поля необходимы, только если вы хотите изменить эти границы во время выполнения. Эти поля существуют в структуре, возвращенной getSimulationData
только если вы включаете им явным образом при вызове getSimulationData
. simdata
структура имеет следующие поля.
MeasuredDisturbance
— Измеренные значения воздействия[]
(значение по умолчанию) | вектор-строка | массивИзмеренные значения воздействия в виде вектора-строки из длины Nmd или массив со столбцами Nmd, где Nmd является количеством измеренных воздействий. Если ваш многоступенчатый объект MPC имеет какой-либо измеренный заданный канал воздействия, необходимо задать MeasuredDisturbance
. Если у вашего контроллера нет измеренных воздействий, это поле не существует в структуре, сгенерированной getSimulationData
.
Чтобы использовать те же значения воздействия через горизонт предсказания, задайте вектор-строку.
Чтобы варьироваться значения воздействия по горизонту предсказания со времени k ко времени k +p, задайте массив с до p +1 строка. Здесь, k является текущим временем, и p является горизонтом предсказания. Каждая строка содержит значения воздействия для одного шага горизонта предсказания. Если вы задаете меньше, чем строки p, значения в итоговой строке используются для остающихся шагов горизонта предсказания.
MVMin
— Переменные нижние границы, которыми управляют,[]
(значение по умолчанию) | вектор-строка | матрицаПеременные нижние границы, которыми управляют, в виде вектора-строки из длины Nmv или матрица со столбцами Nmv, где Nmv является количеством переменных, которыми управляют. MVMin(:,i)
заменяет ManipulatedVariables(i).Min
свойство контроллера во время выполнения.
Чтобы использовать те же границы через горизонт предсказания, задайте вектор-строку.
Чтобы варьироваться границы по горизонту предсказания со времени k ко времени k +p-1, задайте матрицу с до строк p. Здесь, k является текущим временем, и p является горизонтом предсказания. Каждая строка содержит границы для одного шага горизонта предсказания. Если вы задаете меньше, чем строки p, итоговые границы используются для остающихся шагов горизонта предсказания.
MVMax
— Переменные верхние границы, которыми управляют,[]
(значение по умолчанию) | вектор-строка | матрицаПеременные верхние границы, которыми управляют, в виде вектора-строки из длины Nmv или матрица со столбцами Nmv, где Nmv является количеством переменных, которыми управляют. MVMax(:,i)
заменяет ManipulatedVariables(i).Max
свойство контроллера во время выполнения.
Чтобы использовать те же границы через горизонт предсказания, задайте вектор-строку.
Чтобы варьироваться границы по горизонту предсказания со времени k ко времени k +p-1, задайте матрицу с до строк p. Здесь, k является текущим временем, и p является горизонтом предсказания. Каждая строка содержит границы для одного шага горизонта предсказания. Если вы задаете меньше, чем строки p, итоговые границы используются для остающихся шагов горизонта предсказания.
MVRateMin
— Нижние границы с плавающей ставкой, которыми управляют,[]
(значение по умолчанию) | вектор-строка | матрицаНижние границы с плавающей ставкой, которыми управляют, в виде вектора-строки из длины Nmv или матрица со столбцами Nmv, где Nmv является количеством переменных, которыми управляют. MVRateMin(:,i)
заменяет ManipulatedVariables(i).RateMin
свойство контроллера во время выполнения. MVRateMin
границы должны быть неположительными.
Чтобы использовать те же границы через горизонт предсказания, задайте вектор-строку.
Чтобы варьироваться границы по горизонту предсказания со времени k ко времени k +p-1, задайте матрицу с до строк p. Здесь, k является текущим временем, и p является горизонтом предсказания. Каждая строка содержит границы для одного шага горизонта предсказания. Если вы задаете меньше, чем строки p, итоговые границы используются для остающихся шагов горизонта предсказания.
MVRateMax
— Верхние границы с плавающей ставкой, которыми управляют,[]
(значение по умолчанию) | вектор-строка | матрицаВерхние границы с плавающей ставкой, которыми управляют, в виде вектора-строки из длины Nmv или матрица со столбцами Nmv, где Nmv является количеством переменных, которыми управляют. MVRateMax(:,i)
заменяет ManipulatedVariables(i).RateMax
свойство контроллера во время выполнения. MVRateMax
границы должны быть неотрицательными.
Чтобы использовать те же границы через горизонт предсказания, задайте вектор-строку.
Чтобы варьироваться границы по горизонту предсказания со времени k ко времени k +p-1, задайте матрицу с до строк p. Здесь, k является текущим временем, и p является горизонтом предсказания. Каждая строка содержит границы для одного шага горизонта предсказания. Если вы задаете меньше, чем строки p, итоговые границы используются для остающихся шагов горизонта предсказания.
StateMin
— Нижние границы состояния[]
(значение по умолчанию) | вектор-строка | матрицаНижние границы состояния в виде вектора-строки из длины Nx или матрица со столбцами Nx, где Nx является количеством состояний. StateMin(:,i)
заменяет States(i).Min
свойство контроллера во время выполнения.
Чтобы использовать те же границы через горизонт предсказания, задайте вектор-строку.
Чтобы варьироваться границы по горизонту предсказания со времени k +1 ко времени k +p, задайте матрицу с до строк p. Здесь, k является текущим временем, и p является горизонтом предсказания. Каждая строка содержит границы для одного шага горизонта предсказания. Если вы задаете меньше, чем строки p, итоговые границы используются для остающихся шагов горизонта предсказания.
StateMax
— Верхние границы состояния[]
(значение по умолчанию) | вектор-строка | матрицаВерхние границы состояния в виде вектора-строки из длины Nx или матрица со столбцами Nx, где Nx является количеством состояний. StateMax(:,i)
заменяет States(i).Max
свойство контроллера во время выполнения.
Чтобы использовать те же границы через горизонт предсказания, задайте вектор-строку.
Чтобы варьироваться границы по горизонту предсказания со времени k +1 ко времени k +p, задайте матрицу с до строк p. Здесь, k является текущим временем, и p является горизонтом предсказания. Каждая строка содержит границы для одного шага горизонта предсказания. Если вы задаете меньше, чем строки p, итоговые границы используются для остающихся шагов горизонта предсказания.
StateFcnParameters
— Значения параметра функции состояния[]
(значение по умолчанию) | векторЗначения параметра функции состояния в виде вектора с длиной равняются значению Model.ParameterLength
свойство многоступенчатого объекта контроллера. Если Model.StateFcn
нуждается в векторе параметра, необходимо ввести его значение во времени выполнения с помощью этого поля. Если Model.ParameterLength
0
это поле не существует в структуре, возвращенной getSimulationData
.
StageFcnParameters
— Подготовьте значения параметра функции[]
(значение по умолчанию) | векторПодготовьте значения параметров функций в виде вектора с длиной, равной сумме всех значений в Stages(i).ParameterLength
свойства многоступенчатого объекта контроллера. Если любая стоимость или ограничительная функция, определяемая в Stages
свойству нужен вектор параметра, необходимо обеспечить все векторы параметра во времени выполнения (сложенный в отдельном столбце) использующий это поле. Если ни одна из ваших функций этапа не имеет параметры, это поле не существует в структуре, возвращенной getSimulationData
.
Необходимо сложить векторы параметра для всех этапов в вектор-столбце StateFcnParameters
можно следующим образом.
[parameter vector for stage 1; parameter vector for stage 2; ... parameter vector for stage p+1; ]
TerminalState
— Конечное состояние[]
(значение по умолчанию) | векторКонечное состояние в виде вектор-столбца со столькими же элементов сколько количество состояний. Конечное состояние является требуемым состоянием на последнем шаге предсказания. Чтобы задать желаемые конечные состояния во времени выполнения через это поле, необходимо задать конечные значения в TerminalState
поле Model
свойство nlmpcMSobj
. Задайте inf
для состояний, которые не должны быть ограничены к конечной стоимости. Во время выполнения, nlmpcmove
игнорирует любые значения в TerminalState
поле simdata
это соответствует inf
значения в nlmpcMSobj
. Если вы не задаете условия конечной стоимости в nlmpcMSobj
, это поле не создается в simdata
.
Если нет никакого TerminalState
в simdata
затем ограничение конечного состояния (если есть) не изменяется во время выполнения.
InitialGuess
— Исходные предположения для переменных решения[]
(значение по умолчанию) | векторИсходные предположения для переменных решения в виде вектор-столбца длины равняются сумме длин всех векторов переменной решения для каждого этапа. Хорошие исходные предположения важны, поскольку они помогают решателю сходиться к решению быстрее. Поэтому при симуляции цикла управления путем вызова nlmpcmove
неоднократно в цикле, передайте simdata
как входной параметр (таким образом, исходные предположения могут использоваться), и в то же время возвратите обновленную версию simdata
(с новыми исходными предположениями для следующего контрольного интервала) как выходной аргумент.
Необходимо быть стеком исходные предположения для всех этапов в вектор-столбце InitialGuess
можно следующим образом.
[state vector guess for stage 1; manipulated variable vector guess for stage 1; manipulated variable vector rate guess for stage 1; % if used slack variable vector guess for stage 1; % if used state vector guess for stage 2; manipulated variable vector guess for stage 2; manipulated variable vector rate guess for stage 2; % if used slack variable vector guess for stage 2; % if used ... state vector guess for stage p; manipulated variable vector guess for stage p; manipulated variable vector rate guess for stage p; % if used slack variable vector guess for stage p; % if used state vector guess for stage p+1; slack variable vector guess for stage p+1; % if used ]
Если InitialGuess
[]
, исходные предположения по умолчанию вычисляются от x
и lastmv
аргументы передали nlmpcmove
.
В общем случае во время симуляции с обратной связью, вы не задаете InitialGuess
самостоятельно. Вместо этого при вызове nlmpcmove
, возвратите simdata
выходной аргумент, который содержит расчетные исходные предположения для следующего контрольного интервала. Можно затем передать simdata
как входной параметр к nlmpcmove
для следующего контрольного интервала. Эти шаги являются лучшей практикой, даже если вы не задаете никакие другие опции во время выполнения.
mv
— Оптимальное действие управления переменными, которым управляют,Оптимальное действие управления переменными, которым управляют, возвращенное как вектор-столбец длины Nmv, где Nmv является количеством переменных, которыми управляют.
Если решатель сходится к решению для локального оптимума (info.ExitFlag
положительно), затем mv
содержит оптимальное решение.
Если решатель достигает максимального количества итераций, не находя оптимальное решение (info.ExitFlag = 0
) и:
nlmpcobj.Optimization.UseSuboptimalSolution
true
, затем mv
содержит субоптимальное решение
nlmpcobj.Optimization.UseSuboptimalSolution
false
, затем mv
содержит lastmv
Если решатель перестал работать (info.ExitFlag
отрицательно), затем mv
содержит lastmv
.
opt
— Опции во время выполнения с исходными предположениямиnlmpcmoveopt
объектОпции во время выполнения с исходными предположениями для состояния и переменных траекторий, которыми управляют, которые будут использоваться в следующем контрольном интервале, возвращенном как nlmpcmoveopt
объект. Любые опции во время выполнения, что вы задали использование options
, такой как веса, ограничения или параметры, копируются в opt
.
Исходные предположения для состояний (opt.X0
) и переменные, которыми управляют (opt.MV0
) оптимальные траектории, вычисленные nlmpcmove
и соответствуйте последнему p-1 строка info.Xopt
и info.MVopt
, соответственно.
Чтобы использовать эти исходные предположения в следующем контрольном интервале, задайте opt
как options
входной параметр к nlmpcmove
.
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
— Сложенный слабый вектор переменныхСложенный слабый вектор переменных, используемый в ограничительном смягчении. Если всеми элементами является нуль, то всем мягким ограничениям удовлетворяют по целому горизонту предсказания. Если какой-либо элемент больше нуля, то по крайней мере одно мягкое ограничение нарушено.
Слабый переменный вектор для всех этапов сложен как:
[slack variable vector for stage 1; % if used slack variable vector for stage 2; % if used ... slack variable vector for stage p+1; % if used ]
ExitFlag
— Код выхода оптимизацииКод выхода оптимизации, возвращенный как одно из следующего:
Положительное Целое число — Оптимальное решение найдено
0 — Выполнимое субоптимальное решение, найденное после максимального количества итераций
Отрицательное целое число — Никакое возможное решение не найдено
Iterations
— Количество итерацийКоличество итераций используется решателем нелинейного программирования, возвращенным как положительное целое число.
Cost
— Целевая функция стоитсяСтоимость целевой функции, возвращенная как неотрицательное скалярное значение. Стоимость определяет количество степени, до которой контроллер достиг ее целей.
Величина затрат только значима когда ExitFlag
является неотрицательным.
simdata
— Структура данных моделирования во время выполненияОбновленные данные моделирования во время выполнения, возвращенные как структура, содержа новые исходные предположения для состояния и траекторий, которыми управляют, которые будут использоваться в следующем контрольном интервале. Это - структура со следующими полями.
MeasuredDisturbance
— Измеренные значения воздействия[]
(значение по умолчанию) | вектор-строка | массивИзмеренные значения воздействия в виде вектора-строки из длины Nmd или массив со столбцами Nmd, где Nmd является количеством измеренных воздействий. Если ваш многоступенчатый объект MPC имеет какой-либо измеренный заданный канал воздействия, необходимо задать MeasuredDisturbance
. Если у вашего контроллера нет измеренных воздействий, это поле не существует в структуре, сгенерированной getSimulationData
.
Чтобы использовать те же значения воздействия через горизонт предсказания, задайте вектор-строку.
Чтобы варьироваться значения воздействия по горизонту предсказания со времени k ко времени k +p, задайте массив с до p +1 строка. Здесь, k является текущим временем, и p является горизонтом предсказания. Каждая строка содержит значения воздействия для одного шага горизонта предсказания. Если вы задаете меньше, чем строки p, значения в итоговой строке используются для остающихся шагов горизонта предсказания.
MVMin
— Переменные нижние границы, которыми управляют,[]
(значение по умолчанию) | вектор-строка | матрицаПеременные нижние границы, которыми управляют, в виде вектора-строки из длины Nmv или матрица со столбцами Nmv, где Nmv является количеством переменных, которыми управляют. MVMin(:,i)
заменяет ManipulatedVariables(i).Min
свойство контроллера во время выполнения.
Чтобы использовать те же границы через горизонт предсказания, задайте вектор-строку.
Чтобы варьироваться границы по горизонту предсказания со времени k ко времени k +p-1, задайте матрицу с до строк p. Здесь, k является текущим временем, и p является горизонтом предсказания. Каждая строка содержит границы для одного шага горизонта предсказания. Если вы задаете меньше, чем строки p, итоговые границы используются для остающихся шагов горизонта предсказания.
MVMax
— Переменные верхние границы, которыми управляют,[]
(значение по умолчанию) | вектор-строка | матрицаПеременные верхние границы, которыми управляют, в виде вектора-строки из длины Nmv или матрица со столбцами Nmv, где Nmv является количеством переменных, которыми управляют. MVMax(:,i)
заменяет ManipulatedVariables(i).Max
свойство контроллера во время выполнения.
Чтобы использовать те же границы через горизонт предсказания, задайте вектор-строку.
Чтобы варьироваться границы по горизонту предсказания со времени k ко времени k +p-1, задайте матрицу с до строк p. Здесь, k является текущим временем, и p является горизонтом предсказания. Каждая строка содержит границы для одного шага горизонта предсказания. Если вы задаете меньше, чем строки p, итоговые границы используются для остающихся шагов горизонта предсказания.
MVRateMin
— Нижние границы с плавающей ставкой, которыми управляют,[]
(значение по умолчанию) | вектор-строка | матрицаНижние границы с плавающей ставкой, которыми управляют, в виде вектора-строки из длины Nmv или матрица со столбцами Nmv, где Nmv является количеством переменных, которыми управляют. MVRateMin(:,i)
заменяет ManipulatedVariables(i).RateMin
свойство контроллера во время выполнения. MVRateMin
границы должны быть неположительными.
Чтобы использовать те же границы через горизонт предсказания, задайте вектор-строку.
Чтобы варьироваться границы по горизонту предсказания со времени k ко времени k +p-1, задайте матрицу с до строк p. Здесь, k является текущим временем, и p является горизонтом предсказания. Каждая строка содержит границы для одного шага горизонта предсказания. Если вы задаете меньше, чем строки p, итоговые границы используются для остающихся шагов горизонта предсказания.
MVRateMax
— Верхние границы с плавающей ставкой, которыми управляют,[]
(значение по умолчанию) | вектор-строка | матрицаВерхние границы с плавающей ставкой, которыми управляют, в виде вектора-строки из длины Nmv или матрица со столбцами Nmv, где Nmv является количеством переменных, которыми управляют. MVRateMax(:,i)
заменяет ManipulatedVariables(i).RateMax
свойство контроллера во время выполнения. MVRateMax
границы должны быть неотрицательными.
Чтобы использовать те же границы через горизонт предсказания, задайте вектор-строку.
Чтобы варьироваться границы по горизонту предсказания со времени k ко времени k +p-1, задайте матрицу с до строк p. Здесь, k является текущим временем, и p является горизонтом предсказания. Каждая строка содержит границы для одного шага горизонта предсказания. Если вы задаете меньше, чем строки p, итоговые границы используются для остающихся шагов горизонта предсказания.
StateMin
— Нижние границы состояния[]
(значение по умолчанию) | вектор-строка | матрицаНижние границы состояния в виде вектора-строки из длины Nx или матрица со столбцами Nx, где Nx является количеством состояний. StateMin(:,i)
заменяет States(i).Min
свойство контроллера во время выполнения.
Чтобы использовать те же границы через горизонт предсказания, задайте вектор-строку.
Чтобы варьироваться границы по горизонту предсказания со времени k +1 ко времени k +p, задайте матрицу с до строк p. Здесь, k является текущим временем, и p является горизонтом предсказания. Каждая строка содержит границы для одного шага горизонта предсказания. Если вы задаете меньше, чем строки p, итоговые границы используются для остающихся шагов горизонта предсказания.
StateMax
— Верхние границы состояния[]
(значение по умолчанию) | вектор-строка | матрицаВерхние границы состояния в виде вектора-строки из длины Nx или матрица со столбцами Nx, где Nx является количеством состояний. StateMax(:,i)
заменяет States(i).Max
свойство контроллера во время выполнения.
Чтобы использовать те же границы через горизонт предсказания, задайте вектор-строку.
Чтобы варьироваться границы по горизонту предсказания со времени k +1 ко времени k +p, задайте матрицу с до строк p. Здесь, k является текущим временем, и p является горизонтом предсказания. Каждая строка содержит границы для одного шага горизонта предсказания. Если вы задаете меньше, чем строки p, итоговые границы используются для остающихся шагов горизонта предсказания.
StateFcnParameters
— Значения параметра функции состояния[]
(значение по умолчанию) | векторЗначения параметра функции состояния в виде вектора с длиной равняются значению Model.ParameterLength
свойство многоступенчатого объекта контроллера. Если Model.StateFcn
нуждается в векторе параметра, необходимо ввести его значение во времени выполнения с помощью этого поля. Если Model.ParameterLength
0
это поле не существует в структуре, возвращенной getSimulationData
.
StageFcnParameters
— Подготовьте значения параметра функции[]
(значение по умолчанию) | векторПодготовьте значения параметров функций в виде вектора с длиной, равной сумме всех значений в Stages(i).ParameterLength
свойства многоступенчатого объекта контроллера. Если любая стоимость или ограничительная функция, определяемая в Stages
свойству нужен вектор параметра, необходимо обеспечить все векторы параметра во времени выполнения (сложенный в отдельном столбце) использующий это поле. Если ни одна из ваших функций этапа не имеет параметры, это поле не существует в структуре, возвращенной getSimulationData
.
Необходимо сложить векторы параметра для всех этапов в вектор-столбце StateFcnParameters
можно следующим образом.
[parameter vector for stage 1; parameter vector for stage 2; ... parameter vector for stage p+1; ]
TerminalState
— Конечное состояние[]
(значение по умолчанию) | векторКонечное состояние в виде вектор-столбца со столькими же элементов сколько количество состояний. Конечное состояние является требуемым состоянием на последнем шаге предсказания. Чтобы задать желаемые конечные состояния во времени выполнения через это поле, необходимо задать конечные значения в TerminalState
поле Model
свойство nlmpcMSobj
. Задайте inf
для состояний, которые не должны быть ограничены к конечной стоимости. Во время выполнения, nlmpcmove
игнорирует любые значения в TerminalState
поле simdata
это соответствует inf
значения в nlmpcMSobj
. Если вы не задаете условия конечной стоимости в nlmpcMSobj
, это поле не создается в simdata
.
Если нет никакого TerminalState
в simdata
затем ограничение конечного состояния (если есть) не изменяется во время выполнения.
InitialGuess
— Исходные предположения для переменных решения[]
(значение по умолчанию) | векторИсходные предположения для переменных решения в виде вектор-столбца длины равняются сумме длин всех векторов переменной решения для каждого этапа. Хорошие исходные предположения важны, поскольку они помогают решателю сходиться к решению быстрее. Поэтому при симуляции цикла управления путем вызова nlmpcmove
неоднократно в цикле, передайте simdata
как входной параметр (таким образом, исходные предположения могут использоваться), и в то же время возвратите обновленную версию simdata
(с новыми исходными предположениями для следующего контрольного интервала) как выходной аргумент.
Необходимо быть стеком исходные предположения для всех этапов в вектор-столбце InitialGuess
можно следующим образом.
[state vector guess for stage 1; manipulated variable vector guess for stage 1; manipulated variable vector rate guess for stage 1; % if used slack variable vector guess for stage 1; % if used state vector guess for stage 2; manipulated variable vector guess for stage 2; manipulated variable vector rate guess for stage 2; % if used slack variable vector guess for stage 2; % if used ... state vector guess for stage p; manipulated variable vector guess for stage p; manipulated variable vector rate guess for stage p; % if used slack variable vector guess for stage p; % if used state vector guess for stage p+1; slack variable vector guess for stage p+1; % if used ]
Если InitialGuess
[]
, исходные предположения по умолчанию вычисляются от x
и lastmv
аргументы передали nlmpcmove
.
В общем случае во время симуляции с обратной связью, вы не задаете InitialGuess
самостоятельно. Вместо этого при вызове nlmpcmove
, возвратите simdata
выходной аргумент, который содержит расчетные исходные предположения для следующего контрольного интервала. Можно затем передать simdata
как входной параметр к nlmpcmove
для следующего контрольного интервала. Эти шаги являются лучшей практикой, даже если вы не задаете никакие другие опции во время выполнения.
Во время симуляций с обратной связью это - лучшая практика к горячему запуску нелинейный решатель при помощи предсказанного состояния и управляло переменными траекториями от предыдущего контрольного интервала как исходные предположения для текущего контрольного интервала. Использовать эти траектории в качестве исходных предположений:
Возвратите opt
выходной аргумент при вызове nlmpcmove
. Это nlmpcmoveopt
объект содержит любые опции во время выполнения, которых вы задали в предыдущем вызове nlmpcmove
, наряду с исходными предположениями для состояния (opt.X0
) и переменная, которой управляют (opt.MV0
) траектории.
Передайте этот объект в как options
входной параметр к nlmpcmove
для следующего контрольного интервала.
Эти шаги являются лучшей практикой, даже если вы не задаете никакие другие опции во время выполнения.
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.