为非线性MPC指定成本函数

虽然传统的线性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. 输入

用于约束软化的松弛变量,指定为非负标量。E.如果控制器中没有软限制,则为零。

如果不等式约束函数中定义了非线性软约束(模型。CustomIneqConFcn),使用积极的罚款重量E.让它们成为成本函数的一部分。

数据 输入

附加信号,指定为具有以下字段的结构:

描述
TS. 预测模型的样本时间,定义在TS.控制器属性
现状后 中指定的当前预测模型状态X输入参数的nlmpcmove.
LastMV 上一控制区间中使用的MV移动,如lastmv输入参数的nlmpcmove.
参考文献 植物输出的参考值,如下所述裁判输入参数的nlmpcmove.
mvtarget. 操纵可变目标,如下所述mvtarget.财产的nlmpcmoveopt.目的
PredictionHorizon 预测视界,定义在PredictionHorizon控制器属性
NumOfStates 状态的数量,如所定义的尺寸.Numberofstates.控制器属性
NumOfOutputs 中定义的输出数量维度。N你mberOfOutputs控制器属性
NumOfInputs 输入中的输入数量维度。N你mberOfInputs控制器属性
mvindex. 中定义的操纵变量指标维度。mvindex.控制器属性
MDIndex 测量的扰动指数,如所定义的维度。MDIndex控制器属性
UDIndex 中定义的未测扰动指数维度。UDIndex控制器属性
参数个数 输入

可选参数,以逗号分隔的列表指定(例如p1, p2, p3).将相同的参数传递给预测模型、自定义代价函数和控制器自定义约束函数。例如,如果状态函数只使用参数p1,约束函数仅使用参数p2,且代价函数仅使用参数p3,然后将所有三个参数传递给所有这些函数。

如果模型使用可选参数,则必须使用模型。N你mberOfParameters属性。

j 输出 作为标量返回的计算成本

您的定制成本函数必须:

  • 是一个连续的,有限的功能X,E.一阶导数是有限的

  • 随着Slack变量增加E.增加或独立于它

要在成本函数中使用输出变量值,必须首先使用预测模型输出函数从状态和输入参数导出它们,如图所示模型。OutputFcn属性。例如,计算输出轨迹y从时间K.时间K.+P., 采用:

p = data.predictionhorizo​​n;i = 1:p + 1 y(i,:) = myoutputfunction(x(我,:)',u(我,:)',params)';结束

有关预测模型输出功能的更多信息,请参阅为非线性MPC指定预测模型

通常,您优化控制操作以最小化跨预测地平线的成本函数。由于成本函数值必须是标量,因此将成本函数计算在每个预测地平线上的成本函数,并将结果添加在一起。例如,假设阶段成本函数是:

j = 10. 1 2 + 5. X 2 3. + X 1

也就是说,您希望最小化第一个输出与其参考值之间的差值,以及第一个操纵变量与第二个状态之间的差值。要计算整个预测范围内的总成本函数,使用:

p = data.predictionhorizo​​n;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 一世 j = j / X 一世 + 1 j .计算G基于X从第二排到行P.+1,忽略第一行。
GMV.

关于操纵变量轨迹的代价函数的雅可比矩阵,返回为aP.——- - - - - -Nmv阵列,其中 GMV. 一世 j = j / 一世 m V. j MVj)是j第th MV指数数据。MVIndex

因为控制器的力U (p + 1,:)等于U (p,:),如果您的成本函数使用U (p + 1,:),你必须包括两者的影响U (p,:)U (p + 1,:)在雅各比亚人的U (p,:)

通用电气 代价函数关于松弛变量的雅可比矩阵,E.,作为标量返回,其中 通用电气 = j / E.

要使用输出变量值和其雅各比人在您的成本jacobian函数中,必须首先从状态和输入参数中导出它们。为此,请使用预测模型输出函数的Jacobian,如下所示雅可比矩阵。OutputFcn属性。例如,计算输出变量y和他们的雅克比Yjacob从时间K.时间K.+P., 采用:

p = data.predictionhorizo​​n;i = 1:p + 1 y(i,:) = myoutputfunction(x(我,:)',u(我,:)',params)';结束i = 1: p + 1 Yjacob(我:)= myOutputJacobian (X(我:),U(我,:),params) ';结束

由于预测模型输出函数不支持从输入到输出的直接馈通,输出函数雅可比矩阵只包含对状态的偏导数金宝appX.有关输出函数雅可比矩阵的更多信息,请参见为非线性MPC指定预测模型

为了找到雅可比矩阵,计算代价函数对状态轨迹、操纵变量轨迹和松弛变量的偏导数。例如,假设你的成本函数如下所示1是第一个被操纵的变量。

j = 10. 1 2 + 5. X 2 3. + X 1

为了计算关于状态轨迹的雅可比矩阵,使用下面的方法。回想一下G基于X从第二排到行P.+1,忽略第一行。

p = data.predictionhorizo​​n;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.

另请参阅

相关的话题