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

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

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

  • Максимизируйте доходность

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

Когда вы задаете пользовательскую функцию стоимости для своего нелинейного контроллера MPC, можно принять решение или заменить или увеличить стандартную квадратичную функцию стоимости MPC. По умолчанию контроллер 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Входной параметр

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

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

dataВходной параметр

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

Поле Описание
TsШаг расчета модели Prediction, как задано в свойстве 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,:) — Эта строка является копией предыдущей строки.

  • X1 Эта строка содержит значения текущего состояния.

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

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

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 th индекс мВ в data.MVIndex.

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

GeЯкобиан функции стоимости относительно слабой переменной, 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. Для получения дополнительной информации о якобиане выходной функции смотрите, Задают Модель Прогноза для Нелинейного 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;

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

Смотрите также

Похожие темы