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

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

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

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

  • Минимизируйте потребление энергии

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

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

Перед симуляцией контроллера лучшей практики подтвердить свои пользовательские функции, включая функцию затрат и ее якобиан, используя 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) -by - Nx массив. Первая строка X содержит значения текущего состояния, что означает, что решатель не использует значения в X(1,:) как переменные принятия решений во время оптимизации.
UВходВход траекторию от времени k времени k + p, заданную как (p + 1) -by - Nu массив. Последняя строка U всегда является дубликатом предыдущей строки; то есть U(end,:) = U(end-1,:). Поэтому значения в последней строке U не являются независимыми переменными принятия решений во время оптимизации.
eВход

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

  • Увеличьте как переменную slack 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.CustomCostFcn свойство контроллера одному из следующих.

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

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

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

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

Ваша стоимость якобианской функции должна иметь одну из следующих сигнатур.

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

    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Якобиан функции стоимости относительно переменной slack, e, возвращается в виде скаляра, где Ge=J/e.

Чтобы использовать выходные значения переменных и их якобианы в вашей якобианской функции затрат, необходимо сначала вывести их из состояния и входных параметров. Для этого используйте Якобиан выходной функции модели предсказания, как задано в 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

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

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

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;

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

См. также

Похожие темы