虽然传统的线性MPC控制器优化控制动作以最小化二次成本函数,但非线性MPC控制器支持通用定制成本函数。金宝app例如,您可以将成本函数指定为系统状态和输入的线性或非线性功能的组合。为提高计算效率,您还可以为自定义成本函数指定分析雅加诺。
例如,使用自定义成本函数,例如:
盈利能力最大化
最大限度地减少能源消耗量
当您为非线性MPC控制器指定自定义成本函数时,您可以选择替换或增加标准的二次MPC成本函数。默认情况下,一个nlmpc
控制器用您的定制成本函数代替标准成本函数。在这种情况下,控制器忽略其中的标准调优权值重量
财产。
要使用标准成本和定制成本之和的目标函数,请设置优化。ReplaceStandardCost
你的属性nlmpc
对象假
.中指定的标准调优权重重量
控制器的属性决定了成本函数。但是,您可以通过将相应的惩罚权重设置为零来消除任何标准成本函数条款。有关标准MPC成本函数的更多信息,请参阅标准成本职能.
在模拟控制器之前,最好的做法是验证自定义函数,包括成本函数及其雅可比矩阵,使用validateFcns
命令。
要配置您的非线性MPC控制器使用自定义成本函数,请设置它优化。CustomCostFcn
属性为以下之一。
当前工作文件夹或MATLAB上的函数的名称®路径,指定为字符串或字符向量
优化.customcostfcn =“mycostfunction”;
处理当前工作文件夹或MATLAB路径上的函数
优化.customcostfcn = @mycostfunction;
匿名函数
优化.customcostfcn = @(x,u,e,data,params)mycostfunction(x,u,e,数据,params);
您的自定义成本函数必须具有下列签名之一。
如果控制器不使用可选参数:
函数J = myCostFunction (X, U, e,数据)
如果控制器使用参数。在这里,参数个数
是一个以逗号分隔的参数列表:
函数J = myCostFunction (X, U, e,数据,参数)
此表介绍了此功能的输入和输出,其中:
NX是州的数量,等于尺寸.Numberofstates.
属性。
N你输入的数量,包括所有操纵变量,测量扰动和未测量扰动,是否等于维度。N你mberOfInputs
属性。
P.是预测的地平线。
K.为当前时间。
论点 | 输入输出 | 描述 | ||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
X |
输入 | 时间状态轨迹K.时间K.+P.,指定为P.+ 1)——-NX数组中。第一行X 包含当前状态值,这意味着求解器不使用值X (1:) 作为优化过程中的决策变量。 |
||||||||||||||||||||||||||
你 |
输入 | 时间输入轨迹K.时间K.+P.,指定为P.+ 1)——-N你数组中。最后一行你 总是前面一行的副本;也就是说,U(最终,:) =U (end-1:) .因此,最终行中的值你 在优化期间不是独立的决策变量。 |
||||||||||||||||||||||||||
E. |
输入 | 用于约束软化的松弛变量,指定为非负标量。 如果不等式约束函数中定义了非线性软约束( |
||||||||||||||||||||||||||
数据 |
输入 | 附加信号,指定为具有以下字段的结构:
|
||||||||||||||||||||||||||
参数个数 |
输入 | 可选参数,以逗号分隔的列表指定(例如 如果模型使用可选参数,则必须使用 |
||||||||||||||||||||||||||
j |
输出 | 作为标量返回的计算成本 |
您的定制成本函数必须:
是一个连续的,有限的功能你
那X
,E.
一阶导数是有限的
随着Slack变量增加E.
增加或独立于它
要在成本函数中使用输出变量值,必须首先使用预测模型输出函数从状态和输入参数导出它们,如图所示模型。OutputFcn
属性。例如,计算输出轨迹y
从时间K.时间K.+P., 采用:
p = data.predictionhorizon;为i = 1:p + 1 y(i,:) = 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(sum(u1. ^ 2))+ 5 * sum(sum(x2。^ 3)+ sum(sum(x1));
通常,对于成本函数,不要使用以下值,因为它们不是求解器使用的决策变量的一部分:
U(最终,:)
—这一行是前一行的副本。
X (1:)
- 此行包含当前状态值。
由于示例cost函数相对简单,您可以使用匿名函数句柄来指定它。
对于相对简单的成本,可以使用匿名函数句柄指定成本函数。例如,要指定只实现前面cost函数的第一项的匿名函数,请使用:
优化.customcostfcn =@(X,U,data) 10*sum(sum((U(1:end-1,data.MVIndex(1)).^2));
为了提高计算效率,最好的做法是为您的定制成本函数指定分析Jacobian。如果您未指定雅可比,则控制器使用数值扰动计算Jacobian。为您的成本函数指定Jacobian,请设置雅可比矩阵。CustomCostFcn
控制器的属性到以下选项之一。
当前工作文件夹或MATLAB路径上的函数名,指定为字符串或字符向量
雅可比矩阵。CustomCostFcn =“myCostJacobian”;
处理当前工作文件夹或MATLAB路径上的函数
雅可比矩阵。CustomCostFcn = @myCostJacobian;
匿名函数
雅可比矩阵。CustomCostFcn = @(X,U,e,data,params)
代价雅可比函数必须具有下列特征之一。
如果控制器不使用可选参数:
函数(G, Gmv,通用电气)= myCostJacobian (X, U, e,数据)
如果控制器使用参数。在这里,参数个数
是一个以逗号分隔的参数列表:
函数(G, Gmv,通用电气)= myCostJacobian (X, U, e,数据、参数)
成本Jacobian函数的输入参数与定制成本函数的输入相同。此表介绍了Jacobian函数的输出,其中:
NX是州的数量,等于尺寸.Numberofstates.
属性。
Nmv为被操纵变量的个数。
P.是预测的地平线。
论点 | 描述 |
---|---|
G |
代价函数关于状态轨迹的雅可比矩阵,返回为aP.——- - - - - -NX阵列,其中
.计算G 基于X 从第二排到行P.+1,忽略第一行。 |
GMV. |
关于操纵变量轨迹的代价函数的雅可比矩阵,返回为aP.——- - - - - -Nmv阵列,其中
和MV(j)是j第th MV指数 因为控制器的力 |
通用电气 |
代价函数关于松弛变量的雅可比矩阵,E. ,作为标量返回,其中
. |
要使用输出变量值和其雅各比人在您的成本jacobian函数中,必须首先从状态和输入参数中导出它们。为此,请使用预测模型输出函数的Jacobian,如下所示雅可比矩阵。OutputFcn
属性。例如,计算输出变量y
和他们的雅克比Yjacob
从时间K.时间K.+P., 采用:
p = data.predictionhorizon;为i = 1:p + 1 y(i,:) = myoutputfunction(x(我,:)',u(我,:)',params)';结束为i = 1: p + 1 Yjacob(我:)= myOutputJacobian (X(我:),U(我,:),params) ';结束
由于预测模型输出函数不支持从输入到输出的直接馈通,输出函数雅可比矩阵只包含对状态的偏导数金宝appX
.有关输出函数雅可比矩阵的更多信息,请参见为非线性MPC指定预测模型.
为了找到雅可比矩阵,计算代价函数对状态轨迹、操纵变量轨迹和松弛变量的偏导数。例如,假设你的成本函数如下所示你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 =零(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.
.