nlmpcmove

Вычислите оптимальное действие управления для нелинейного контроллера MPC

Описание

Нелинейный MPC

mv = nlmpcmove(nlmpcobj,x,lastmv) вычисляет оптимальное действие управления для текущего времени. Чтобы симулировать нелинейное MPC управление с обратной связью, вызовите nlmpcmove неоднократно.

пример

mv = nlmpcmove(nlmpcobj,x,lastmv,ref) задает ссылочные значения для выходов объекта управления. Если вы не задаете ссылочные значения, nlmpcmove использует нули по умолчанию.

mv = nlmpcmove(nlmpcobj,x,lastmv,ref,md) задает значения измеренных нарушений порядка во время выполнения. Если ваш контроллер имеет измеренные нарушения порядка, вы должны задать md.

пример

mv = nlmpcmove(nlmpcobj,x,lastmv,ref,md,options) задает дополнительные опции времени выполнения для вычисления оптимальных перемещений управления. Использование optionsможно задать начальные предположения для траекторий состояний и управляемых переменных, обновить веса настройки в ограничениях или изменить параметры модели предсказания.

пример

[mv,opt] = nlmpcmove(___) возвращает nlmpcmoveopt объект, который содержит начальные догадки для состояния и управляемые траектории, которые будут использоваться в следующем контрольном интервале.

пример

[mv,opt,info] = nlmpcmove(___) возвращает дополнительные детали решения, включая окончательное значение функции оптимизации затрат и оптимальные управляемые переменные, состояние и выходные траектории.

Многоступенчатый нелинейный MPC

пример

mv = nlmpcmove(nlmpcMSobj,x,lastmv) вычисляет оптимальное действие управления для текущего времени. Чтобы симулировать нелинейное MPC управление с обратной связью, вызовите nlmpcmove неоднократно.

mv = nlmpcmove(nlmpcobj,x,lastmv,simdata) задает дополнительную simdata структура, которая содержит измеренные нарушения порядка, ограничения во время выполнения, параметры для функций состояния и этапа и начальные предположения для состояний и манипулируемых переменных траекторий. В целом важно вернуть новую simdata (содержащий обновленные начальные предположения) как второй выходной аргумент, используя синтаксис ниже.

[mv,simdata] = nlmpcmove(___) возвращает обновленный simdata структура, которая содержит новые начальные предположения для состояния и управляемые траектории, которые будут использоваться в следующем контрольном интервале. Хорошие начальные догадки важны, поскольку они помогают решателю быстрее сходиться к решению.

[mv,simdata,info] = nlmpcmove(___) возвращает дополнительные детали решения, включая окончательное значение функции оптимизации затрат и оптимальные управляемые переменные, состояние и выходные траектории.

Примеры

свернуть все

Создайте нелинейный контроллер 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

Figure contains 6 axes. Axes 1 with title x contains an object of type line. Axes 2 with title y contains an object of type line. Axes 3 with title theta contains an object of type line. Axes 4 with title vx contains an object of type line. Axes 5 with title vy contains an object of type line. Axes 6 with title omega contains an object of type line.

Figure contains 4 axes. Axes 1 with title Thrust u(1) contains an object of type stair. Axes 2 with title Thrust u(2) contains an object of type stair. Axes 3 with title Thrust u(3) contains an object of type stair. Axes 4 with title Thrust u(4) contains an object of type stair.

Figure contains an axes. The axes with title Optimal Trajectory contains 62 objects of type patch, line.

Создайте нелинейный контроллер 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 секунд. Во время каждого контрольного интервала:

  1. Исправьте предыдущее предсказание с помощью измерения тока.

  2. Вычисление оптимального управления перемещается с помощью nlmpcmove. Эта функция возвращает вычисленные оптимальные последовательности в nloptions. Передача обновленного объекта опции в nlmpcmove в следующем контрольном интервале обеспечивают начальные догадки для оптимальных последовательностей.

  3. Спрогнозируйте состояния модели.

  4. Примените первое вычисленное оптимальное перемещение управления к объекту, обновляя состояния объекта.

  5. Сгенерируйте данные датчика с белым шумом.

  6. Сохраните состояния объекта.

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')

Figure contains 4 axes. Axes 1 with title cart position contains an object of type line. Axes 2 with title cart velocity contains an object of type line. Axes 3 with title pendulum angle contains an object of type line. Axes 4 with title pendulum velocity contains an object of type line.

Этот пример показывает, как создать и симулировать очень простой многоступенчатый контроллер 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

Входные параметры

свернуть все

Нелинейный контроллер MPC, заданный как nlmpc объект.

Текущие состояния модели предсказания, заданные как вектор длины Nx, где Nx - количество состояний модели предсказания. Поскольку нелинейный контроллер MPC не выполняет оценку состояния, необходимо либо измерить, либо оценить текущие состояния модели предсказания на каждом контрольном интервале. Для получения дополнительной информации о нелинейных моделях прогнозирования MPC, смотрите Задайте Модель Предсказания для нелинейного MPC.

Управляющие сигналы, используемые в объекте в предыдущем контрольном интервале, задаются как вектор длины Nmv, где Nmv - количество манипулируемых переменных.

Примечание

Задайте lastmv как управляемые сигналы переменной, примененные к объекту в предыдущем контрольном интервале. Обычно эти сигналы являются значениями, генерируемыми контроллером, хотя это не всегда так. Например, если ваш контроллер работает в автономном режиме и работает в режиме отслеживания; то есть контроллер выход не управляет объектом, затем подает фактический сигнал управления на last_mv может помочь достичь бесшумной передачи, когда контроллер переключается обратно в оперативном режиме.

Объект выходные ссылки значения, заданные как вектор-строка длины Ny или массив с Ny столбцами, где Ny - количество переменных выходов. Если вы не задаете refзначения ссылки по умолчанию равны нулю.

Чтобы использовать те же ссылки значения на горизонте предсказания, задайте вектор-строку.

Чтобы изменить значения ссылок на горизонте предсказания от времени k + 1 до времени k + p, задайте массив с до p строками. Здесь k - текущее время, а p - горизонт предсказания. Каждая строка содержит ссылочные значения для одного шага горизонта предсказания. Если вы задаете меньше p строк, значения в последней строке используются для остальных шагов горизонта предсказания.

Измеренные нарушения порядка значения, заданные как вектор-строка длины Nmd или массив с Nmd столбцами, где Nmd - количество измеренных нарушений порядка. Если ваш контроллер имеет измеренные нарушения порядка, вы должны задать md. Если у вашего контроллера нет измеренных нарушений порядка, задайте md как [].

Чтобы использовать те же нарушения порядка значения на горизонте предсказания, задайте вектор-строку.

Чтобы варьировать значения нарушения порядка по горизонту предсказания от времени k времени k + p, задайте массив с до p + 1 строками. Здесь k - текущее время, а p - горизонт предсказания. Каждая строка содержит значения нарушения порядка для одного шага горизонта предсказания. Если вы задаете меньше p строк, значения в последней строке используются для остальных шагов горизонта предсказания.

Опции во время выполнения, заданные как nlmpcmoveopt объект. Используя эти опции, вы можете:

  • Настройка весов контроллера

  • Обновление линейных ограничений

  • Установите манипулируемые переменные цели

  • Задайте параметры модели предсказания

  • Предоставьте начальные предположения для состояний и управляемых переменных траекторий

Эти опции применяются только к текущему nlmpcmove момент времени.

Чтобы улучшить эффективность решателя, лучшая практика задать начальные догадки для состояния и манипулируемых переменных траекторий.

Многоступенчатый нелинейный контроллер MPC, заданный как nlmpcMultistage объект.

Данные моделирования во время выполнения. Он должен быть первоначально создан getSimulationData, а затем заселен (при необходимости) перед передачей в nlmpcmove как входной параметр. Затем обновленная версия всегда возвращается в качестве второго выходного аргумента nlmpcmove. Обратите внимание, что MVMin, MVMax, StateMin, StateMax, MVRateMin, MVRateMax поля требуются только в том случае, если необходимо изменить эти ограничения во время выполнения. Эти поля существуют в структуре, возвращаемой getSimulationData только если вы включили их явным образом при вызове getSimulationData. The simdata структура имеет следующие поля.

Измеренные нарушения порядка значения, заданные как вектор-строка длины Nmd или массив с Nmd столбцами, где Nmd - количество измеренных нарушений порядка. Если у вашего многоступенчатого объекта MPC задан какой-либо измеренный канал нарушения порядка, необходимо задать MeasuredDisturbance. Если у вашего контроллера нет измеренных нарушений порядка, это поле не существует в структуре, сгенерированной getSimulationData.

Чтобы использовать те же нарушения порядка значения на горизонте предсказания, задайте вектор-строку.

Чтобы варьировать значения нарушения порядка по горизонту предсказания от времени k времени k + p, задайте массив с до p + 1 строками. Здесь k - текущее время, а p - горизонт предсказания. Каждая строка содержит значения нарушения порядка для одного шага горизонта предсказания. Если вы задаете меньше p строк, значения в последней строке используются для остальных шагов горизонта предсказания.

Манипулируемые нижние границы переменной, заданные как вектор-строка длины Nmv или матрица с Nmv столбцами, где Nmv - количество манипулируемых переменных. MVMin(:,i) заменяет ManipulatedVariables(i).Min свойство контроллера во время исполнения.

Чтобы использовать те же границы между горизонтом предсказания, задайте вектор-строку.

Чтобы изменить границы над горизонтом предсказания от времени k времени k + p -1, задайте матрицу с до p строками. Здесь k - текущее время, а p - горизонт предсказания. Каждая строка содержит ограничения для одного шага горизонта предсказания. Если вы задаете меньше p строк, конечные границы используются для остальных шагов горизонта предсказания.

Манипулируемые верхние границы переменной, заданные как вектор-строка длины Nmv или матрица с Nmv столбцами, где Nmv - количество манипулируемых переменных. MVMax(:,i) заменяет ManipulatedVariables(i).Max свойство контроллера во время исполнения.

Чтобы использовать те же границы между горизонтом предсказания, задайте вектор-строку.

Чтобы изменить границы над горизонтом предсказания от времени k времени k + p -1, задайте матрицу с до p строками. Здесь k - текущее время, а p - горизонт предсказания. Каждая строка содержит ограничения для одного шага горизонта предсказания. Если вы задаете меньше p строк, конечные границы используются для остальных шагов горизонта предсказания.

Манипулируемые нижние границы переменной скорости, заданные как вектор-строка длины Nmv или матрица с Nmv столбцами, где Nmv - количество манипулируемых переменных. MVRateMin(:,i) заменяет ManipulatedVariables(i).RateMin свойство контроллера во время исполнения. MVRateMin ограничения должны быть непозитивными.

Чтобы использовать те же границы между горизонтом предсказания, задайте вектор-строку.

Чтобы изменить границы над горизонтом предсказания от времени k времени k + p -1, задайте матрицу с до p строками. Здесь k - текущее время, а p - горизонт предсказания. Каждая строка содержит ограничения для одного шага горизонта предсказания. Если вы задаете меньше p строк, конечные границы используются для остальных шагов горизонта предсказания.

Манипулируемые верхние границы переменной скорости, заданные как вектор-строка длины Nmv или матрица с Nmv столбцами, где Nmv - количество манипулируемых переменных. MVRateMax(:,i) заменяет ManipulatedVariables(i).RateMax свойство контроллера во время исполнения. MVRateMax границы должны быть неотрицательными.

Чтобы использовать те же границы между горизонтом предсказания, задайте вектор-строку.

Чтобы изменить границы над горизонтом предсказания от времени k времени k + p -1, задайте матрицу с до p строками. Здесь k - текущее время, а p - горизонт предсказания. Каждая строка содержит ограничения для одного шага горизонта предсказания. Если вы задаете меньше p строк, конечные границы используются для остальных шагов горизонта предсказания.

Нижние границы состояния, заданные как вектор-строка длины Nx или матрица с Nx столбцами, где Nx - количество состояний. StateMin(:,i) заменяет States(i).Min свойство контроллера во время исполнения.

Чтобы использовать те же границы между горизонтом предсказания, задайте вектор-строку.

Чтобы изменить границы над горизонтом предсказания от времени k + 1 до времени k + p, задайте матрицу с до p строками. Здесь k - текущее время, а p - горизонт предсказания. Каждая строка содержит ограничения для одного шага горизонта предсказания. Если вы задаете меньше p строк, конечные границы используются для остальных шагов горизонта предсказания.

Верхние границы состояния, заданные как вектор-строка длины Nx или матрица с Nx столбцами, где Nx - количество состояний. StateMax(:,i) заменяет States(i).Max свойство контроллера во время исполнения.

Чтобы использовать те же границы между горизонтом предсказания, задайте вектор-строку.

Чтобы изменить границы над горизонтом предсказания от времени k + 1 до времени k + p, задайте матрицу с до p строками. Здесь k - текущее время, а p - горизонт предсказания. Каждая строка содержит ограничения для одного шага горизонта предсказания. Если вы задаете меньше p строк, конечные границы используются для остальных шагов горизонта предсказания.

Значения параметров функции состояния, заданные как вектор с длиной, равной значению Model.ParameterLength свойство объекта многоступенчатого контроллера. Если Model.StateFcn нужен вектор параметра, необходимо указать его значение во время выполнения, используя это поле. Если Model.ParameterLength является 0 это поле не существует в структуре, возвращенной getSimulationData.

Значения параметров функций Stage, заданные как вектор с длиной, равной сумме всех значений в Stages(i).ParameterLength свойства объекта многоступенчатого контроллера. Если какие-либо затраты или ограничительные функции определены в Stages свойству нужен вектор параметра, вы должны предоставить все векторы параметра во время выполнения (сложенные в один столбец), используя это поле. Если ни одна из ваших функций этапа не имеет параметра, это поле не существует в структуре, возвращенной getSimulationData.

Векторы параметров для всех каскадов должны быть сложены в вектор-столбец StateFcnParameters как:

[parameter vector for stage 1;
 parameter vector for stage 2;
 ...
 parameter vector for stage p+1;
]

Конечное состояние, заданная как вектор-столбец с таким количеством элементов, как количество состояний. Это конечное состояние является желаемым состоянием на последнем шаге предсказания. Чтобы задать желаемые конечные состояния во время выполнения через это поле, необходимо задать конечные значения в TerminalState поле Model свойство nlmpcMSobj. Задайте inf для состояний, которые не должны быть ограничены терминальным значением. Во время исполнения, nlmpcmove игнорирует все значения в TerminalState область simdata которые соответствуют inf значения в nlmpcMSobj. Если вы не задаете какое-либо условие терминального значения в nlmpcMSobj, это поле не создается в simdata.

Если нет TerminalState в simdata тогда ограничение конечного состояния (если оно присутствует) не изменяется во время исполнения.

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

Выходные аргументы

свернуть все

Оптимальное манипулируемое действие управления, возвращаемое как вектор-столбец Nmv длины, где Nmv - количество манипулируемых переменных.

Если решатель сходится к локальному оптимальному решению (info.ExitFlag положительно), тогда mv содержит оптимальное решение.

Если решатель достигает максимального количества итераций, не найдя оптимального решения (info.ExitFlag = 0) и:

  • nlmpcobj.Optimization.UseSuboptimalSolution является true, затем mv содержит неоптимальное решение

  • nlmpcobj.Optimization.UseSuboptimalSolution является false, затем mv содержит lastmv

Если решатель отказывает (info.ExitFlag отрицательно), тогда mv содержит lastmv.

Опции времени выполнения с начальными предположениями для состояния и управляемые переменные траектории, которые будут использоваться в следующем контрольном интервале, возвращаются как nlmpcmoveopt объект. Любые опции во время выполнения, которые вы задали используя options, такие как веса, ограничения или параметры, копируются в opt.

Начальные догадки для состояний (opt.X0) и манипулированные переменные (opt.MV0) являются оптимальными траекториями, вычисленными nlmpcmove и соответствуют последней p -1 строкам info.Xopt и info.MVopt, соответственно.

Чтобы использовать эти начальные догадки в следующем контрольном интервале, задайте opt как options входной параметр в nlmpcmove.

Подробные данные решения, возвращенные как структура со следующими полями.

Оптимальная манипулированная последовательность переменных, возвращенная как (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,:).

Оптимальная последовательность состояний модели предсказания, возвращенная как (p + 1) -by - Nx массив, где p - горизонт предсказания, а Nx - количество состояний в модели предсказания.

Xopt(i,:) содержит вычисленные значения состояния во время k+i-1, для i = 2,...,p+1, где k - текущее время. Xopt(1,:) совпадает с текущими состояниями в x.

Оптимальная выходная последовательность переменной, возвращенная как массив (p + 1) -by - Ny, где p - горизонт предсказания, а Ny - количество выходов.

Yopt(i,:) содержит вычисленные выходные значения во времени k+i-1, для i = 2,...,p+1, где k - текущее время. Yopt(1,:) вычисляется на основе текущих состояний в x и измеренные по току нарушения порядка в md, если таковые имеются.

Временная последовательность горизонта предсказания, возвращенная как вектор-столбец длины p + 1, где p - горизонт предсказания. Topt содержит временную последовательность от времени k до времени k + p, где k - текущее время.

Topt(1) = 0 представляет текущее время. Последующие временные шаги Topt(i) являются Ts*(i-1), где Ts - шаг расчета контроллера.

Использование Topt при построении графика MVopt, Xopt, или Yopt последовательности.

Вектор переменных 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
]

Код выхода оптимизации, возвращенный как одно из следующего:

  • Положительное целое число - Найдено оптимальное решение

  • 0 - Допустимое неоптимальное решение, найденное после максимального количества итераций

  • Отрицательное целое число - не найдено возможного решения

Количество итераций, используемых решателем нелинейного программирования, возвращаемое в виде положительного целого числа.

Стоимость целевой функции, возвращенная как неотрицательное скалярное значение. Стоимость определяет степень достижения контроллером своих целей.

Значение стоимости имеет значение только при ExitFlag неотрицательная.

Обновленные данные моделирования во время выполнения, содержащие новые начальные предположения для состояния и управляемые траектории, которые будут использоваться в следующем контрольном интервале. Это структура со следующими полями.

Измеренные нарушения порядка значения, заданные как вектор-строка длины Nmd или массив с Nmd столбцами, где Nmd - количество измеренных нарушений порядка. Если у вашего многоступенчатого объекта MPC задан какой-либо измеренный канал нарушения порядка, необходимо задать MeasuredDisturbance. Если у вашего контроллера нет измеренных нарушений порядка, это поле не существует в структуре, сгенерированной getSimulationData.

Чтобы использовать те же нарушения порядка значения на горизонте предсказания, задайте вектор-строку.

Чтобы варьировать значения нарушения порядка по горизонту предсказания от времени k времени k + p, задайте массив с до p + 1 строками. Здесь k - текущее время, а p - горизонт предсказания. Каждая строка содержит значения нарушения порядка для одного шага горизонта предсказания. Если вы задаете меньше p строк, значения в последней строке используются для остальных шагов горизонта предсказания.

Манипулируемые нижние границы переменной, заданные как вектор-строка длины Nmv или матрица с Nmv столбцами, где Nmv - количество манипулируемых переменных. MVMin(:,i) заменяет ManipulatedVariables(i).Min свойство контроллера во время исполнения.

Чтобы использовать те же границы между горизонтом предсказания, задайте вектор-строку.

Чтобы изменить границы над горизонтом предсказания от времени k времени k + p -1, задайте матрицу с до p строками. Здесь k - текущее время, а p - горизонт предсказания. Каждая строка содержит ограничения для одного шага горизонта предсказания. Если вы задаете меньше p строк, конечные границы используются для остальных шагов горизонта предсказания.

Манипулируемые верхние границы переменной, заданные как вектор-строка длины Nmv или матрица с Nmv столбцами, где Nmv - количество манипулируемых переменных. MVMax(:,i) заменяет ManipulatedVariables(i).Max свойство контроллера во время исполнения.

Чтобы использовать те же границы между горизонтом предсказания, задайте вектор-строку.

Чтобы изменить границы над горизонтом предсказания от времени k времени k + p -1, задайте матрицу с до p строками. Здесь k - текущее время, а p - горизонт предсказания. Каждая строка содержит ограничения для одного шага горизонта предсказания. Если вы задаете меньше p строк, конечные границы используются для остальных шагов горизонта предсказания.

Манипулируемые нижние границы переменной скорости, заданные как вектор-строка длины Nmv или матрица с Nmv столбцами, где Nmv - количество манипулируемых переменных. MVRateMin(:,i) заменяет ManipulatedVariables(i).RateMin свойство контроллера во время исполнения. MVRateMin ограничения должны быть непозитивными.

Чтобы использовать те же границы между горизонтом предсказания, задайте вектор-строку.

Чтобы изменить границы над горизонтом предсказания от времени k времени k + p -1, задайте матрицу с до p строками. Здесь k - текущее время, а p - горизонт предсказания. Каждая строка содержит ограничения для одного шага горизонта предсказания. Если вы задаете меньше p строк, конечные границы используются для остальных шагов горизонта предсказания.

Манипулируемые верхние границы переменной скорости, заданные как вектор-строка длины Nmv или матрица с Nmv столбцами, где Nmv - количество манипулируемых переменных. MVRateMax(:,i) заменяет ManipulatedVariables(i).RateMax свойство контроллера во время исполнения. MVRateMax границы должны быть неотрицательными.

Чтобы использовать те же границы между горизонтом предсказания, задайте вектор-строку.

Чтобы изменить границы над горизонтом предсказания от времени k времени k + p -1, задайте матрицу с до p строками. Здесь k - текущее время, а p - горизонт предсказания. Каждая строка содержит ограничения для одного шага горизонта предсказания. Если вы задаете меньше p строк, конечные границы используются для остальных шагов горизонта предсказания.

Нижние границы состояния, заданные как вектор-строка длины Nx или матрица с Nx столбцами, где Nx - количество состояний. StateMin(:,i) заменяет States(i).Min свойство контроллера во время исполнения.

Чтобы использовать те же границы между горизонтом предсказания, задайте вектор-строку.

Чтобы изменить границы над горизонтом предсказания от времени k + 1 до времени k + p, задайте матрицу с до p строками. Здесь k - текущее время, а p - горизонт предсказания. Каждая строка содержит ограничения для одного шага горизонта предсказания. Если вы задаете меньше p строк, конечные границы используются для остальных шагов горизонта предсказания.

Верхние границы состояния, заданные как вектор-строка длины Nx или матрица с Nx столбцами, где Nx - количество состояний. StateMax(:,i) заменяет States(i).Max свойство контроллера во время исполнения.

Чтобы использовать те же границы между горизонтом предсказания, задайте вектор-строку.

Чтобы изменить границы над горизонтом предсказания от времени k + 1 до времени k + p, задайте матрицу с до p строками. Здесь k - текущее время, а p - горизонт предсказания. Каждая строка содержит ограничения для одного шага горизонта предсказания. Если вы задаете меньше p строк, конечные границы используются для остальных шагов горизонта предсказания.

Значения параметров функции состояния, заданные как вектор с длиной, равной значению Model.ParameterLength свойство объекта многоступенчатого контроллера. Если Model.StateFcn нужен вектор параметра, необходимо указать его значение во время выполнения, используя это поле. Если Model.ParameterLength является 0 это поле не существует в структуре, возвращенной getSimulationData.

Значения параметров функций Stage, заданные как вектор с длиной, равной сумме всех значений в Stages(i).ParameterLength свойства объекта многоступенчатого контроллера. Если какие-либо затраты или ограничительные функции определены в Stages свойству нужен вектор параметра, вы должны предоставить все векторы параметра во время выполнения (сложенные в один столбец), используя это поле. Если ни одна из ваших функций этапа не имеет параметра, это поле не существует в структуре, возвращенной getSimulationData.

Векторы параметров для всех каскадов должны быть сложены в вектор-столбец StateFcnParameters как:

[parameter vector for stage 1;
 parameter vector for stage 2;
 ...
 parameter vector for stage p+1;
]

Конечное состояние, заданная как вектор-столбец с таким количеством элементов, как количество состояний. Это конечное состояние является желаемым состоянием на последнем шаге предсказания. Чтобы задать желаемые конечные состояния во время выполнения через это поле, необходимо задать конечные значения в TerminalState поле Model свойство nlmpcMSobj. Задайте inf для состояний, которые не должны быть ограничены терминальным значением. Во время исполнения, nlmpcmove игнорирует все значения в TerminalState область simdata которые соответствуют inf значения в nlmpcMSobj. Если вы не задаете какое-либо условие терминального значения в nlmpcMSobj, это поле не создается в simdata.

Если нет TerminalState в simdata тогда ограничение конечного состояния (если оно присутствует) не изменяется во время исполнения.

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

Совет

Во время симуляций с обратной связью лучшей практики нагреться, чтобы запустить нелинейный решатель, используя предсказанное состояние и манипулируемые переменные траектории от предыдущего контрольного интервала в качестве начальных предположений для текущего контрольного интервала. Чтобы использовать эти траектории в качестве начальных догадок:

  1. Верните opt выходной аргумент при вызове nlmpcmove. Это nlmpcmoveopt объект содержит все опции выполнения, указанные в предыдущем вызове nlmpcmove, наряду с начальными предположениями о состоянии (opt.X0) и манипулированной переменной (opt.MV0) траектории.

  2. Передайте этот объект как options входной параметр в nlmpcmove для следующего контрольного интервала.

Эти шаги являются наилучшей практикой, даже если вы не задаете никаких других опций во время выполнения.

Введенный в R2018b