Вычислите оптимальное действие управления для нелинейного контроллера 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)
Optimal fuel consumption = 4.712383
Создайте нелинейный контроллер 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 в закрытом цикле.
Создайте многоступенчатый контроллер MPC
Создайте многоступенчатый объект mpc с горизонтом 5 шагов, одним состоянием, одной манипулированной переменной.
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
Отображение последнего значения состояния и управляемых переменных.
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 в закрытом цикле.
Создайте многоступенчатый контроллер MPC
Создайте многоступенчатый объект mpc с горизонтом 7 шагов, одним состоянием, одной манипулированной переменной.
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:
StateMin: []
StateMax: []
MVMin: []
MVMax: []
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
Отображение последнего значения состояния и управляемых переменных.
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
- Текущие состояния модели предсказанияТекущие состояния модели предсказания, заданные как вектор длины Nx, где Nx - количество состояний модели предсказания. Поскольку нелинейный контроллер MPC не выполняет оценку состояния, необходимо либо измерить, либо оценить текущие состояния модели предсказания на каждом контрольном интервале. Для получения дополнительной информации о нелинейных моделях прогнозирования MPC, смотрите Задайте Модель Предсказания для нелинейного MPC.
lastmv
- Управляющие сигналы, используемые на объекте в предыдущем контрольном интервалеУправляющие сигналы, используемые в объекте в предыдущем контрольном интервале, задаются как вектор длины Nmv, где Nmv - количество манипулируемых переменных.
Примечание
Задайте lastmv
как управляемые сигналы переменной, примененные к объекту в предыдущем контрольном интервале. Обычно эти сигналы являются значениями, генерируемыми контроллером, хотя это не всегда так. Например, если ваш контроллер работает в автономном режиме и работает в режиме отслеживания; то есть контроллер выход не управляет объектом, затем подает фактический сигнал управления на last_mv
может помочь достичь бесшумной передачи, когда контроллер переключается обратно в оперативном режиме.
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
. The 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
- Значения параметров шаговых функций[]
(по умолчанию) | векторЗначения параметров функций Stage, заданные как вектор с длиной, равной сумме всех значений в 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
- Вектор переменных Stacked slackВектор переменных Stacked slack, используемый в смягчении ограничений. Если все элементы равны нулю, все мягкие ограничения выполняются на всем горизонте предсказания. Если любой элемент больше нуля, то нарушается по крайней мере одно мягкое ограничение.
Вектор переменной 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
- Значения параметров шаговых функций[]
(по умолчанию) | векторЗначения параметров функций Stage, заданные как вектор с длиной, равной сумме всех значений в 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. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.