В то время как традиционные линейные контроллеры 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 для смягчения ограничений, заданная как неотрицательный скаляр. Если у вас есть нелинейные мягкие ограничения, заданные в вашей функции ограничения неравенства ( | ||||||||||||||||||||||||||
data | Вход | Дополнительные сигналы, заданные как структура со следующими полями:
| ||||||||||||||||||||||||||
params | Вход | Необязательные параметры, заданные как разделенный запятыми список (для примера Если ваша модель использует необязательные параметры, необходимо задать количество параметров, используя | ||||||||||||||||||||||||||
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.
Обычно вы оптимизируете действия управления, чтобы минимизировать функцию затрат через горизонт предсказания. Поскольку значение функции затрат должно быть скаляром, вы вычисляете функцию затрат на каждом шаге горизонта предсказания и добавляете результаты вместе. Например, предположим, что функция стоимости этапа:
То есть вы хотите минимизировать различие между первым выходом и его опорным значением, и продуктом первой манипулированной переменной и второго состояния. Чтобы вычислить функцию общей стоимости для горизонта предсказания, используйте:
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 на основе X от второй строки до строки p + 1, игнорируя первую строку. |
Gmv | Якобиан функции стоимости относительно манипулируемых переменных траекторий, возвращенный как p -by - Nmv массив, где и MV (j) является j-м индексом MV Поскольку контроллер усиливает |
Ge | Якобиан функции стоимости относительно переменной slack, 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 является первой манипулированной переменной.
Чтобы вычислить якобиан относительно траекторий состояний, используйте следующее. Напомним, что вы вычисляете 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
.