exponenta event banner

Определение функции затрат для нелинейного MPC

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

Используя пользовательскую функцию затрат, можно, например:

  • Максимизация рентабельности

  • Минимизация энергопотребления

При указании пользовательской функции затрат для нелинейного контроллера MPC можно выбрать замену или увеличение стандартной квадратичной функции затрат MPC. По умолчанию - nlmpc контроллер заменяет стандартную функцию затрат на пользовательскую функцию затрат. В этом случае контроллер игнорирует стандартные веса настройки в своем Weights собственность.

Чтобы использовать целевую функцию, которая является суммой стандартных затрат и пользовательских затрат, установите Optimization.ReplaceStandardCost собственность вашего nlmpc объект в false. В этом случае стандартные веса настройки, указанные в Weights свойство контроллера вносит вклад в функцию затрат. Однако можно исключить любой из терминов функции стандартных затрат, установив соответствующий вес штрафа равным нулю. Дополнительные сведения о стандартной функции затрат MPC см. в разделе Функция стандартных затрат.

Перед моделированием контроллера рекомендуется проверить пользовательские функции, включая функцию затрат и ее Jacobian, с помощью validateFcns команда.

Пользовательская функция затрат

Чтобы настроить нелинейный контроллер MPC на использование пользовательской функции затрат, установите его Optimization.CustomCostFcn одному из следующих свойств.

  • Имя функции в текущей рабочей папке или в пути MATLAB ®, указанное как вектор строки или символа

    Optimization.CustomCostFcn = "myCostFunction";
  • Обращаться к функции в текущей рабочей папке или по пути MATLAB

    Optimization.CustomCostFcn = @myCostFunction;
  • Анонимная функция

    Optimization.CustomCostFcn = @(X,U,e,data,params) myCostFunction(X,U,e,data,params);

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

  • Если контроллер не использует дополнительные параметры:

    function J = myCostFunction(X,U,e,data)
  • Если контроллер использует параметры. Здесь, params представляет собой список параметров, разделенных запятыми:

    function J = myCostFunction(X,U,e,data,params)

В этой таблице описываются входы и выходы этой функции, где:

  • Nx - число состояний, равное Dimensions.NumberOfStates свойства контроллера.

  • Nu - количество входов, включая все манипулируемые переменные, измеренные возмущения и неизмеренные возмущения, и равно Dimensions.NumberOfInputs свойства контроллера.

  • p - горизонт прогнозирования.

  • k - текущее время.

АргументВвод/выводОписание
XВходТраектория состояния от времени k до времени k + p, заданная как массив (p + 1) -byNx. Первая строкаX содержит значения текущего состояния, что означает, что решатель не использует значения в X(1,:) в качестве переменных принятия решения во время оптимизации.
UВходВходная траектория от времени k до времени k + p, заданная как массив (p + 1) -by-Nu. Последняя строкаU всегда является дубликатом предыдущей строки; то есть U(end,:) = U(end-1,:). Поэтому значения в последней строке U не являются независимыми переменными принятия решений во время оптимизации.
eВход

Переменная ослабления для смягчения ограничения, заданная как неотрицательный скаляр. e равно нулю, если в контроллере нет мягких ограничений.

Если в функции ограничения неравенства определены нелинейные мягкие ограничения (Model.CustomIneqConFcn), используйте положительный штрафной вес на e и сделать их частью функции затрат.

dataВход

Дополнительные сигналы, указанные как структура со следующими полями:

ОбластьОписание
TsВремя выборки модели прогнозирования, как определено в Ts свойство контроллера
CurrentStatesТекущие состояния модели прогнозирования, как указано в x входной аргумент nlmpcmove
LastMVПеремещения СН, использованные в предыдущем интервале управления, как указано в lastmv входной аргумент nlmpcmove
ReferencesСсылочные значения для выходов установки, как указано в ref входной аргумент nlmpcmove
MVTargetУправляемые переменные цели, как указано в MVTarget свойство nlmpcmoveopt объект
PredictionHorizonГоризонт прогнозирования, как определено в PredictionHorizon свойство контроллера
NumOfStatesКоличество состояний, как определено в Dimensions.NumberOfStates свойство контроллера
NumOfOutputsКоличество выходов, как определено в Dimensions.NumberOfOutputs свойство контроллера
NumOfInputsКоличество входов, как определено в Dimensions.NumberOfInputs свойство контроллера
MVIndexИндексы манипулируемых переменных, как определено в Dimensions.MVIndex свойство контроллера
MDIndexИзмеренные показатели возмущений, определенные в Dimensions.MDIndex свойство контроллера
UDIndexНеизмеренные индексы возмущений, как определено в Dimensions.UDIndex свойство контроллера
paramsВход

Дополнительные параметры, указанные как список, разделенный запятыми (например, p1,p2,p3). Те же параметры передаются в модель прогнозирования, пользовательскую функцию затрат и пользовательские функции ограничений контроллера. Например, если функция состояния использует только параметр p1, функции ограничения используют только параметр p2, и функция затрат использует только параметр p3, то все три параметра передаются всем этим функциям.

Если в модели используются дополнительные параметры, необходимо указать количество параметров с помощью Model.NumberOfParameters свойства контроллера.

JПродукцияВычисленная стоимость, возвращенная как скаляр

Пользовательская функция затрат должна:

  • Быть непрерывной, конечной функцией U, X, и e и имеют конечные первые производные

  • Увеличить как переменную ослабления e увеличивает или быть независимым от него

Чтобы использовать значения выходных переменных в функции затрат, необходимо сначала вывести их из состояния и входных аргументов с помощью функции вывода модели прогнозирования, как указано в Model.OutputFcn свойства контроллера. Например, для вычисления выходной траектории Y время от времени k до времени k + p, используйте:

p = data.PredictionHorizon;
for i=1:p+1
    Y(i,:) = myOutputFunction(X(i,:)',U(i,:)',params)';
end

Дополнительные сведения о функции вывода модели прогнозирования см. в разделе Указание модели прогнозирования для нелинейного MPC.

Как правило, операции управления оптимизируются для минимизации функции затрат по всему горизонту прогнозирования. Поскольку значение функции затрат должно быть скаляром, вычисляется функция затрат на каждом шаге горизонта прогнозирования и добавляются результаты вместе. Например, предположим, что функция затрат на этап:

J = 10u12 + 5x23 + x1

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

p = data.PredictionHorizon;
U1 = U(1:p,data.MVIndex(1));
X1 = X(2:p+1,1);
X2 = X(2:p+1,2);
J = 10*sum(sum(U1.^2)) + 5*sum(sum(X2.^3) + sum(sum(X1));

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

  • U(end,:) - Эта строка является дубликатом предыдущей строки.

  • X(1,:) - Эта строка содержит значения текущего состояния.

Поскольку эта примерная функция затрат является относительно простой, ее можно указать с помощью анонимного дескриптора функции.

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

Optimization.CustomCostFcn = @(X,U,data) 10*sum(sum((U(1:end-1,data.MVIndex(1)).^2));

Функция затрат Jacobian

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

  • Имя функции в текущей рабочей папке или в пути MATLAB, указанное как вектор строки или символа

    Jacobian.CustomCostFcn = "myCostJacobian";
  • Обращаться к функции в текущей рабочей папке или по пути MATLAB

    Jacobian.CustomCostFcn = @myCostJacobian;
  • Анонимная функция

    Jacobian.CustomCostFcn = @(X,U,e,data,params) myCostJacobian(X,U,e,data,params)

Функция Jacobian должна иметь одну из следующих подписей.

  • Если контроллер не использует дополнительные параметры:

    function [G,Gmv,Ge] = myCostJacobian(X,U,e,data)
  • Если контроллер использует параметры. Здесь, params представляет собой список параметров, разделенных запятыми:

    function [G,Gmv,Ge] = myCostJacobian(X,U,e,data,params)

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

  • Nx - число состояний, равное Dimensions.NumberOfStates свойства контроллера.

  • Nmv - количество манипулируемых переменных.

  • p - горизонт прогнозирования.

АргументОписание
GЯкобиан функции затрат относительно траекторий состояния, возвращаемый как массив p-by-Nx, где G (i, j) =∂J/∂X (i + 1, j). ВычислитьG на основе X из второй строки в строку p + 1, игнорируя первую строку.
Gmv

Якобиан функции затрат по отношению к управляемым переменным траекториям, возвращаемый как массив p-by-Nmv, где Gmv (i, j) =∂J/∂U (i, MV (j)) и MV (j) является j-м индексом MV вdata.MVIndex.

Так как контроллер заставляет U(p+1,:) равняться U(p,:), если используется функция затрат U(p+1,:), необходимо включить влияние обоих U(p,:) и U(p+1,:) в якобиане для U(p,:).

GeЯкобиан функции затрат относительно переменной слабости, e, возвращено как скаляр, где Ge=∂J/∂e.

Чтобы использовать значения выходных переменных и их якобианы в функции якобиана затрат, необходимо сначала вывести их из состояния и входных аргументов. Для этого используйте Jacobian функции вывода модели прогнозирования, как указано в Jacobian.OutputFcn свойства контроллера. Например, для вычисления выходных переменных Y и их якобинцы Yjacob время от времени k до времени k + p, используйте:

p = data.PredictionHorizon;
for i=1:p+1
    Y(i,:) = myOutputFunction(X(i,:)',U(i,:)',params)';
end
for i=1:p+1
    Yjacob(i,:) = myOutputJacobian(X(i,:)',U(i,:)',params)';
end

Поскольку функции вывода модели прогнозирования не поддерживают прямой проход от входов к выходам, функция Jacobian вывода содержит частные производные относительно только состояний в X. Дополнительные сведения о функции вывода Jacobian см. в разделе Указание модели прогнозирования для нелинейного MPC.

Чтобы найти якобинцев, вычислите частные производные функции затрат по отношению к траекториям состояния, управляемым траекториям переменных и переменной ослабления. Например, предположим, что функция затрат выглядит следующим образом, где u1 - первая управляемая переменная.

J = 10u12 + 5x23 + x1

Для вычисления якобиана относительно траекторий состояния используйте следующее. Напомним, что вы вычисляете G на основе X из второй строки в строку p + 1, игнорируя первую строку.

p = data.PredictionHorizon;
Nx = data.NumOfStates;
U1 = U(1:p,data.MVIndex(1));
X2 = X(2:p+1,2);

G = zeros(p,Nx);
G(1:p,1) = 1;
G(1:p,2) = 15*X2.^2;

Для вычисления якобиана относительно изменяемых траекторий используйте:

Nmv = length(data.MVIndex);

Gmv = zeros(p,Nmv);
Gmv(1:p,1) = 20*U1;

В этом случае производной по отношению к переменной слабости является Ge = 0.

См. также

Связанные темы