Задайте функцию стоимости для нелинейного 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Вывод Вычисленная стоимость, возвращенная как скаляр

Ваша пользовательская функция стоимости должна:

  • Будьте непрерывной, конечной функцией UX, и 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.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.

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

Похожие темы

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