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