为非线性MPC指定成本函数
而传统的线性MPC控制器优化控制行动,减少二次成本函数,非线性MPC控制器支持通用的定制成本函数。金宝app例如,您可以指定你作为一个组合的成本函数的线性或非线性系统的状态和输入的函数。为了提高计算效率,您还可以指定您的自定义代价函数的雅可比矩阵分析。
使用一个定制的成本函数,您可以,例如:
盈利能力最大化
减少能源消耗
当你指定一个自定义代价函数非线性MPC控制器,你可以选择更换或增加货币政策委员会二次成本函数的标准。默认情况下,一个nlmpc
控制器取代了标准成本函数与定制成本函数。在这种情况下,控制器忽略的标准调整权重权重
财产。
使用一个目标函数是标准成本和定制成本之和,设置Optimization.ReplaceStandardCost
你的属性nlmpc
对象假
。在这种情况下,标准中指定的调优权重权重
控制器为成本函数的性质。然而,您可以消除任何标准的成本函数通过设置相应的处罚条款重量为零。标准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);
您的自定义代价函数必须有以下签名。
如果你的控制器不使用可选参数:
函数J = myCostFunction (X, U, e,数据)
如果您的控制器使用参数。在这里,
参数个数
是一个以逗号分隔的参数:函数J = myCostFunction (X, U, e,数据,参数)
此表描述了这个函数的输入和输出,地点:
Nx是州的数量等于
Dimensions.NumberOfStates
控制器的属性。Nu是输入的数量,包括所有操纵变量,测量干扰,和无边无际的干扰,等于
Dimensions.NumberOfInputs
控制器的属性。p是预测地平线。
k是当前时间。
论点 | 输入/输出 | 描述 | ||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
X |
输入 | 状态轨迹的时间k时间k+p指定为一个(p+ 1)——-Nx数组中。第一行的X 包含当前状态值,这意味着解决者不使用的值X (1:) 作为决策变量在优化。 |
||||||||||||||||||||||||||
U |
输入 | 输入轨迹从时间k时间k+p指定为一个(p+ 1)——-Nu数组中。的最后一行U 总是重复前面的行;也就是说,U(最终,:) =U (end-1:) 。因此,在最后一行的值U 并不是独立的决策变量在优化。 |
||||||||||||||||||||||||||
e |
输入 | 松弛变量的约束软化,指定为负的标量。 如果你有非线性软约束不等式约束函数中定义( |
||||||||||||||||||||||||||
数据 |
输入 | 额外的信号,指定为一个结构有以下字段:
|
||||||||||||||||||||||||||
参数个数 |
输入 | 可选参数,指定为一个以逗号分隔(例如 如果你的模型使用可选参数,您必须指定使用的参数的数量 |
||||||||||||||||||||||||||
J |
输出 | 计算成本,作为一个标量返回 |
你的自定义代价函数必须:
是一个连续的,有限的功能
U
,X
,e
有限的一阶导数增加松弛变量
e
增加或独立
使用在你的成本函数输出变量值,您必须首先获得他们从国家和使用预测模型的输出函数输入参数,如中指定Model.OutputFcn
控制器的属性。例如,计算输出轨迹Y
从时间k时间k+p使用:
p = data.PredictionHorizon;为i = 1: p + 1 Y(我:)= myOutputFunction (X(我:),U(我,:),params) ';结束
对预测模型的输出功能的更多信息,参见为非线性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 (U1。^ 2)) + 5 *金额(金额(X2。^ 3) +总和(sum (X1));
一般来说,成本函数,不使用以下值,因为它们是不使用的决策变量解算器的一部分:
U(最终,:)
——这一行是重复的行。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)
你的成本可比矩阵函数必须有一个下面的签名。
如果你的控制器不使用可选参数:
函数(G, Gmv,通用电气)= myCostJacobian (X, U, e,数据)
如果您的控制器使用参数。在这里,
参数个数
是一个以逗号分隔的参数:函数(G, Gmv,通用电气)= myCostJacobian (X, U, e,数据、参数)
雅可比矩阵成本函数的输入参数是一样的自定义代价函数的输入。此表描述了雅可比矩阵的输出函数,地点:
Nx是州的数量等于
Dimensions.NumberOfStates
控制器的属性。Nmv是操纵变量的数量。
p是预测地平线。
论点 | 描述 |
---|---|
G |
雅可比矩阵的成本函数的状态轨迹,作为一个返回p——- - - - - -Nx数组,
。计算G 基于X 从第二行,行p+ 1,忽略第一行。 |
Gmv |
雅可比矩阵成本函数对被控变量的轨迹,作为一个返回p——- - - - - -Nmv数组,
和MV(j)是jth MV指数 由于控制器的力量 |
通用电气 |
雅可比矩阵的成本函数对松弛变量,e ,作为一个标量返回
。 |
使用雅可比矩阵输出变量值和雅克比在你的成本函数,首先必须获得他们的状态和输入参数。为此,使用预测模型的输出函数的雅可比矩阵,作为中指定Jacobian.OutputFcn
控制器的属性。例如,计算输出变量Y
和他们的雅克比Yjacob
从时间k时间k+p使用:
p = data.PredictionHorizon;为i = 1: p + 1 Y(我:)= myOutputFunction (X(我:),U(我,:),params) ';结束为i = 1: p + 1 Yjacob(我:)= myOutputJacobian (X(我:),U(我,:),params) ';结束
因为预测模型的输出函数不支持直接从输入到输出引线,雅可比矩阵包含输出函数偏导数只有美国金宝appX
。雅可比矩阵输出函数的更多信息,请参阅为非线性MPC指定预测模型。
找到雅克比,计算成本函数的偏导数的状态轨迹,被控变量轨迹,松弛变量。例如,假设你的成本函数如下u1是第一个被控变量。
计算雅可比矩阵的状态轨迹,使用以下。回想一下,你计算G
基于X
从第二行,行p+ 1,忽略第一行。
p = data.PredictionHorizon;Nx = data.NumOfStates;U1 = U (1: p, data.MVIndex (1));X2 = X (2: p + 1, 2);G = 0 (p, Nx);G (1: p, 1) = 1;G (1: p, 2) = 15 * X2。^ 2;
计算雅可比矩阵的操纵变量轨迹,使用:
Nmv =长度(data.MVIndex);Gmv = 0 (p, Nmv);Gmv (1: p, 1) = 20 * U1;
在这种情况下,松弛变量的导数通用电气(Ge) = 0
。