主要内容

nlmpc

非线性模型预测控制器

描述

非线性模型预测控制器使用非线性预测模型、非线性代价函数和非线性约束计算最优控制移动通过预测水平。有关非线性MPC的更多信息,请参见非线性MPC

创建

描述

例子

nlobj= nlmpc (nx纽约ν创建一个nlmpc对象,其预测模型具有nx州,纽约输出,ν输入,所有的输入都是被操纵的变量。如果您的模型没有测量或未测量扰动输入,则使用此语法。

nlobj= nlmpc (nx纽约“MV”,mvIndex“医学博士”,mdIndex创建一个nlmpc对象,其预测模型已测量扰动输入。指定被操纵变量的输入指标,mvIndex和测量的扰动,mdIndex

nlobj= nlmpc (nx纽约“MV”,mvIndex“UD”,udIndex创建一个nlmpc对象,其预测模型具有未测量的扰动输入。指定被操纵变量和未测量扰动的输入指标,udIndex

例子

nlobj= nlmpc (nx纽约“MV”,mvIndex“医学博士”,mdIndex“UD”,udIndex创建一个nlmpc对象,其预测模型同时具有已测扰动和未测扰动输入。指定操作变量、测量扰动和未测量扰动的输入指标。

输入参数

全部展开

预测模型状态的数目,指定为正整数。该值存储在维度。Nu米berOfStates控制器只读属性。在创建控制器对象后,不能更改状态的数量。

例子:6

预测模型输出的数量,指定为正整数。该值存储在维度。Nu米berOfOutputs控制器只读属性。在创建控制器对象后,不能更改输出的数量。

例子:2

预测模型输入的数量,它们都被设置为被操作的变量,指定为正整数。该值存储在维度。Nu米berOfInputs控制器只读属性。在创建控制器对象后,不能更改操作变量的数量。

例子:4

被操纵的变量索引,指定为正整数的向量。该值存储在维度。MVIndex控制器只读属性。在创建控制器对象后,不能更改这些索引。

的索引的组合集mvIndexmdIndex,udIndex必须包含来自的所有整数1通过Nu,在那里Nu是预测模型输入的数量。

例子:3 [1]

测量的扰动指数,指定为正整数的向量。该值存储在维度。MDIndex控制器只读属性。在创建控制器对象后,不能更改这些索引。

的索引的组合集mvIndexmdIndex,udIndex必须包含来自的所有整数1通过Nu,在那里Nu是预测模型输入的数量。

例子:2

未测量的扰动指数,指定为正整数的向量。该值存储在维度。UDIndex控制器只读属性。在创建控制器对象后,不能更改这些索引。

的索引的组合集mvIndexmdIndex,udIndex必须包含来自的所有整数1通过Nu,在那里Nu是预测模型输入的数量。

例子:4

属性

全部展开

预测模型采样时间,指定为一个正的有限标量。该控制器采用离散时间模型,采样时间为Ts为预测。如果指定连续时间预测模型(模型。IsContinuousTime真正的),然后使用内置的隐式梯形规则对模型进行离散化,采样时间为Ts

例子:0.1

预测水平步长,指定为正整数。的乘积PredictionHorizon而且Ts是预测时间,即控制器预测未来的距离。

例子:15

控制水平,指定为以下之一:

  • 正整数,之间,1而且p,其中p等于PredictionHorizon.在这种情况下,控制器进行计算有时会出现自由控制动作k通过k+-1,并保持控制器输出恒定的剩余预测水平步距k+通过k+p1。在这里,k是当前控制间隔。

  • 正整数向量[12,…],指定阻塞间隔的长度。默认情况下,控制器进行计算方块的自由移动,在哪里是阻塞间隔的数量。第一个自由动作适用于时间k通过k+1-1,第二个自由移动适用于时间k+1通过k+1+2-1,等等。使用块移动可以提高控制器的鲁棒性。中的值的和ControlHorizon必须匹配预测视界p.如果指定一个向量,其和为:

    • 小于预测水平,则控制器增加一个阻塞间隔。这个间隔的长度是这样的,以至于间隔长度的和是p.例如,如果p10你指定一个控制视界ControlHorizon[1 2 3],则控制器使用四个具有长度的间隔[1 2 3 4]

    • 大于预测视界,则对区间进行截断,直到区间长度之和等于p.例如,如果p10你指定一个控制视界ControlHorizon[1 2 3 6 7],则控制器使用四个具有长度的间隔[1 2 3 4]

分段恒定的阻塞移动对于最优路径规划应用来说往往限制太大。为了产生一个限制较少、条件较好的非线性规划问题,可以指定分段线性操作变量阻塞间隔。为此,设置优化。MVInterpolationOrder您的财产nlmpc控制器对象1

有关操纵变量块如何与不同插值方法一起工作的更多信息,请参见操纵变量阻塞

例子:3.

此属性是只读的。

预测模型尺寸信息,在创建控制器时指定,并存储为具有以下字段的结构。

预测模型中的状态数,指定为正整数。此值对应于nx

例子:6

预测模型中的输出数,指定为正整数。此值对应于纽约

例子:1

预测模型中输入的数量,指定为正整数。此值对应于任意一个ν或者是长度的和mvIndexmdIndex,udIndex

例子:3.

预测模型的操纵变量指标,指定为正整数的向量。此值对应于mvIndex

例子:(1 2)

预测模型的测量扰动指数,指定为正整数向量。此值对应于mdIndex

例子:4

预测模型的未测扰动指数,指定为正整数向量。此值对应于udIndex

例子:3.

预测模型,指定为具有以下字段的结构。

状态函数,指定为字符串、字符向量或函数句柄。对于连续时间预测模型,StateFcn是状态导数函数。对于离散时间预测模型,StateFcn是状态更新功能。

如果您的状态函数是连续时间的,控制器自动离散模型使用隐式梯形规则。该方法可以处理中等刚度的模型,其预测精度取决于控制器采样时间Ts;也就是说,大样本时间会导致预测不准确。

如果默认的离散化方法不能为您的应用程序提供令人满意的预测,您可以指定自己的离散时间预测模型,该模型使用不同的方法,例如多步前向欧拉规则。

你可以用以下方式之一指定你的状态函数:

  • 当前工作文件夹或MATLAB中函数的名称®路径,指定为字符串或字符向量

    模型。StateFcn =“myStateFunction”
  • 当前工作文件夹或MATLAB路径中函数的句柄

    模型。StateFcn = @myStateFunction;
  • 匿名函数

    模型。myStateFunction(x,u,params)

有关更多信息,请参见指定非线性MPC预测模型

例子:“@transFcn”

输出函数,指定为字符串、字符向量或函数句柄。如果预测模型的状态数和输出数相同,则可以省略OutputFcn,这意味着所有的状态都是可测量的;也就是说,每个输出对应一个状态。

请注意

你的输出函数不能在任何时候从任何被操纵的变量直接传递到任何输出。

您可以通过以下方式之一指定输出函数:

  • 当前工作文件夹或MATLAB路径中函数的名称,指定为字符串或字符向量

    模型。OutputFcn =“myOutputFunction”
  • 当前工作文件夹或MATLAB路径中函数的句柄

    模型。OutputFcn = @myOutputFunction;
  • 匿名函数

    模型。myOutputFunction(x,u,params)

有关更多信息,请参见指定非线性MPC预测模型

例子:“@outFcn”

选项,用于指示预测模型时域,指定为以下之一:

  • 真正的-连续时间预测模型。在这种情况下,控制器在使用预测时自动离散模型Ts

  • -离散时间预测模型。在这种情况下,Ts为模型的采样时间。

请注意

IsContinuousTime必须与模型。StateFcn而且模型。OutputFcn

如果IsContinuousTime真正的StateFcn必须返回状态在当前时刻对时间的导数。否则StateFcn必须在下一个控制间隔返回状态。

例子:真正的

预测模型使用的可选模型参数数、自定义代价函数、自定义约束、无源函数,指定为非负整数。参数的数量包括这些函数使用的所有参数。例如,如果状态函数只使用参数p1,约束函数只使用形参p2,代价函数只使用参数p3,然后NumberOfParameters3.

例子:1

的结构数组指定的状态信息、边界和比例因子Nx元素,Nx是状态数。每个结构元素都有以下字段。

状态下界,指定为标量或向量。默认情况下,这个下界为

若要在整个预测范围内使用相同的界限,请指定一个标量值。

随时间改变预测视界的范围k+1到时间k+p,指定一个向量为p值。在这里,k当前时间是和p为预测视界。如果指定小于p值,最后的界限用于预测范围的其余步骤。

状态边界总是硬约束。

例子:[-20 -18 -15]

状态上界,指定为标量或向量。缺省情况下,该上限为+正

若要在整个预测范围内使用相同的界限,请指定一个标量值。

随时间改变预测视界的范围k+1到时间k+p,指定一个向量为p值。在这里,k当前时间是和p为预测视界。如果指定小于p值,最后的界限用于预测范围的其余步骤。

状态边界总是硬约束。

例子:20 [15]

状态名,指定为字符串或字符向量。默认状态名称为“x”#,在那里是其状态索引。

例子:“速度”

状态单位,指定为字符串或字符向量。

例子:“米/秒”

状态比例因子,指定为正的有限标量。一般情况下,使用运行范围的状态。指定适当的比例因子可以改善优化的数值条件。

例子:10

的结构数组指定的输出变量(OV)信息、边界和比例因子Ny元素,Ny是输出变量的个数。要访问此属性,可以使用别名机汇而不是OutputVariables

每个结构元素都有以下字段。

OV下界,指定为标量或向量。默认情况下,这个下界为

若要在整个预测范围内使用相同的界限,请指定一个标量值。

随时间改变预测视界的范围k+1到时间k+p,指定一个向量为p值。在这里,k当前时间是和p为预测视界。如果指定小于p值,最后的界限用于预测范围的其余步骤。

例子:(-10 8)

OV上界,指定为标量或向量。缺省情况下,该上限为+正

若要在整个预测范围内使用相同的界限,请指定一个标量值。

随时间改变预测视界的范围k+1到时间k+p,指定一个向量为p值。在这里,k当前时间是和p为预测视界。如果指定小于p值,最后的界限用于预测范围的其余步骤。

例子:[12 10 8]

OV下界柔软度,其中较大的ECR值表示较软的约束,指定为非负的有限标量或向量。默认情况下,OV上界是软约束。

要在整个预测范围内使用相同的ECR值,请指定一个标量值。

在预测范围内随时间变化ECR值k+1到时间k+p,指定一个向量为p值。在这里,k当前时间是和p为预测视界。如果指定小于p值,最后的ECR值用于预测范围的其余步骤。

例子:[2 1 0.5]

OV上限柔软度,其中较大的ECR值表示较软的约束,指定为非负的有限标量或向量。默认情况下,OV下界为软约束。

要在整个预测范围内使用相同的ECR值,请指定一个标量值。

在预测范围内随时间变化ECR值k+1到时间k+p,指定一个向量为p值。在这里,k当前时间是和p为预测视界。如果指定小于p值,最后的ECR值用于预测范围的其余步骤。

例子:[5 2 1]

OV名称,指定为字符串或字符向量。默认的OV名称为“y”#,在那里是它的输出指标。

例子:“攻角”

OV单位,指定为字符串或字符向量。

例子:“度”

OV比例因子,指定为正的有限标量。一般情况下,使用输出变量的操作范围。指定适当的比例因子可以改善优化的数值条件。

例子:90

的结构数组指定的可操作变量(MV)信息、边界和比例因子Nmv元素,Nmv是被操纵变量的数量。要访问此属性,可以使用别名MV而不是ManipulatedVariables

每个结构元素都有以下字段。

MV下界,指定为标量或向量。默认情况下,这个下界为

若要在整个预测范围内使用相同的界限,请指定一个标量值。

随时间改变预测视界的范围k时间k+p-1,指定一个向量p值。在这里,k当前时间是和p为预测视界。如果指定小于p值,最后的界限用于预测范围的其余步骤。

例子:(-1.1 - 1)

MV的上限,指定为标量或向量。缺省情况下,该上限为+正

若要在整个预测范围内使用相同的界限,请指定一个标量值。

随时间改变预测视界的范围k时间k+p-1,指定一个向量p值。在这里,k当前时间是和p为预测视界。如果指定小于p值,最后的界限用于预测范围的其余步骤。

例子:(1.2 - 1)

MV下界柔软度,其中较大的ECR值表示较软的约束,指定为非负标量或向量。默认情况下,MV下界是硬约束。

要在整个预测范围内使用相同的ECR值,请指定一个标量值。

在预测范围内随时间变化ECR值k时间k+p-1,指定一个向量p值。在这里,k当前时间是和p为预测视界。如果指定小于p值,最后的ECR值用于预测范围的其余步骤。

例子:0.1 [0]

MV上限柔软度,其中较大的ECR值表示较软的约束,指定为非负标量或向量。默认情况下,MV上界是硬约束。

要在整个预测范围内使用相同的ECR值,请指定一个标量值。

在预测范围内随时间变化ECR值k时间k+p-1,指定一个向量p值。在这里,k当前时间是和p为预测视界。如果指定小于p值,最后的ECR值用于预测范围的其余步骤。

例子:(0.5 - 0.2)

变化率的下限,指定为非正标量或向量。MV变化率定义为MVk) - - -MVk1),k是当前时间。默认情况下,这个下界为

若要在整个预测范围内使用相同的界限,请指定一个标量值。

随时间改变预测视界的范围k时间k+p-1,指定一个向量p值。在这里,k当前时间是和p为预测视界。如果指定小于p值,最后的界限用于预测范围的其余步骤。

例子:(-50 -20)

变化率的上限,指定为非负标量或向量。MV变化率定义为MVk) - - -MVk1),k是当前时间。缺省情况下,该上限为+正

若要在整个预测范围内使用相同的界限,请指定一个标量值。

随时间改变预测视界的范围k时间k+p-1,指定一个向量p值。在这里,k当前时间是和p为预测视界。如果指定小于p值,最后的界限用于预测范围的其余步骤。

例子:50 [20]

MV变化率下界柔软度,其中较大的ECR值表示较软的约束,指定为非负的有限标量或向量。默认情况下,MV变化率下界为硬约束。

要在整个预测范围内使用相同的ECR值,请指定一个标量值。

在预测范围内随时间变化ECR值k时间k+p-1,指定一个向量p值。在这里,k当前时间是和p为预测视界。如果指定小于p值,最终ECR值用于预测范围的其余步骤。

例子:0.1 [0]

MV变化率上限柔软度,其中较大的ECR值表示较软的约束,指定为非负的有限标量或向量。默认情况下,MV变化率上界为硬约束。

要在整个预测范围内使用相同的ECR值,请指定一个标量值。

在预测范围内随时间变化ECR值k时间k+p-1,指定一个向量p值。在这里,k当前时间是和p为预测视界。如果指定小于p值,最终ECR值用于预测范围的其余步骤。

例子:[1 0.5 0.2]

MV名称,指定为字符串或字符向量。默认MV名称为“u”#,在那里是它的输入索引。

例子:“舵角”

MV单位,指定为字符串或字符向量。

例子:“度”

MV比例因子,指定为正的有限标量。一般情况下,使用被操纵变量的操作范围。指定适当的比例因子可以改善优化的数值条件。

例子:60

测量扰动(MD)信息和尺度因子,指定为结构阵列与N医学博士元素,N医学博士是测量到的扰动数。如果你的模型没有测量到干扰,那么MeasuredDisturbances[].要访问此属性,可以使用别名医学博士而不是MeasuredDisturbances

每个结构元素都有以下字段。

MD名称,指定为字符串或字符向量。默认MD名称为“u”#,在那里是它的输入索引。

例子:“风速”

MD单位,指定为字符串或字符向量。

例子:“米/秒”

MD比例因子,指定为正的有限标量。一般情况下,使用扰动的工作范围。指定适当的比例因子可以改善优化的数值条件。

例子:10

标准成本函数调优权值,指定为结构。控制器将这些权重应用到缩放变量上。因此,调优权值为无量纲值。

请注意

如果你定义一个自定义成本函数使用优化。CustomCostFcn并设置优化。ReplaceStandardCost真正的,则控制器忽略调优权重的标准代价函数权重

权重具有以下字段。

操纵变量调优权值,用于惩罚偏离MV目标的情况,指定为行向量或非负值的数组。所有被操作变量的默认权重为0

若要在整个预测水平面上使用相同的权值,请指定长度的行向量Nmv,在那里Nmv是被操纵变量的数量。

在预测范围内随时间变化调整权重k时间k+p-1,指定一个数组Nmv列及以下p行。在这里,k当前时间是和p为预测视界。每行包含一个预测水平步的操纵变量调优权值。如果指定小于p行,最后一行中的权重用于预测水平的其余步骤。

在Simulink中,在运行时指定MV目标®,将目标值传递给非线性MPC控制器块。在MATLAB中,将目标值传递给仿真函数(如nlmpcmove,使用MVTarget物业的性质nlmpcmoveopt对象)。

例子:(0.1 - 0.2)

操纵的可变率调优权值,它惩罚控制移动中的较大更改,指定为行向量或非负值的数组。所有操纵变量的默认权重为0.1

若要在整个预测水平面上使用相同的权值,请指定长度的行向量Nmv,在那里Nmv是被操纵变量的数量。

在预测范围内随时间变化调整权重k时间k+p-1,指定一个数组Nmv列及以下p行。在这里,k当前时间是和p为预测视界。每行包含一个预测水平步的操纵变量率调谐权值。如果指定小于p行,最后一行中的权重用于预测水平的其余步骤。

例子:(0.1 - 0.1)

输出变量调优权值,它惩罚偏离输出引用的情况,指定为行向量或非负值的数组。所有输出变量的默认权重为1

若要在整个预测水平面上使用相同的权值,请指定长度的行向量Ny,在那里Ny是输出变量的个数。

在预测范围内随时间变化调整权重k+1到时间k+p,指定一个数组Ny列及以下p行。在这里,k当前时间是和p为预测视界。每行包含一个预测水平步的输出变量调优权重。如果指定小于p行,最后一行中的权重用于预测水平的其余步骤。

例子:(0.1 - 0.1)

松弛变量调优权值,指定为正标量。

例子:1 e4

自定义优化函数和求解器,指定为具有以下字段的结构。

自定义成本函数,指定为以下之一:

  • 当前工作文件夹或MATLAB路径中函数的名称,指定为字符串或字符向量

    优化。CustomCostFcn=“myCostFunction”
  • 当前工作文件夹或MATLAB路径中函数的句柄

    优化。CustomCostFcn=@myCostFunction;
  • 匿名函数

    优化。CustomCostFcn=@(X,U,e,data,params) myCostFunction(X,U,e,data,params);

你的成本函数必须有以下签名:

函数J = myCostFunction(X,U,e,data,params)

有关更多信息,请参见指定非线性MPC的代价函数

例子:@costFcn

用自定义代价函数替换标准代价函数的选项,指定为以下之一:

  • 真正的—控制器在优化过程中只使用自定义代价作为目标函数。在这种情况下,权重属性将被忽略。

  • —控制器在优化过程中使用标准成本和定制成本之和作为目标函数。

如果您不指定自定义成本函数使用CustomCostFcn,则控制器忽略RepalceStandardCost

有关更多信息,请参见指定非线性MPC的代价函数

例子:真正的

自定义相等约束函数,指定为以下之一:

  • 当前工作文件夹或MATLAB路径中函数的名称,指定为字符串或字符向量

    优化。CustomEqConFcn =“myEqConFunction”
  • 当前工作文件夹或MATLAB路径中函数的句柄

    优化。CustomEqConFcn = @myEqConFunction;
  • 匿名函数

    优化。CustomEqConFcn = @(X,U,data,params) myEqConFunction(X,U,data,params);

等式约束函数必须具有以下签名:

函数ceq = myEqConFunction(X,U,data,params)

有关更多信息,请参见为一般非线性MPC指定约束条件

例子:@eqFcn

自定义不等式约束函数,指定为以下之一:

  • 当前工作文件夹或MATLAB路径中函数的名称,指定为字符串或字符向量

    优化。CustomIneqConFcn =“myIneqConFunction”
  • 当前工作文件夹或MATLAB路径中函数的句柄

    优化。CustomIneqConFcn = @myIneqConFunction;
  • 匿名函数

    优化。myIneqConFunction(X,U,e,data,params);

等式约束函数必须具有以下签名:

函数cineq = myIneqConFunction(X,U,e,data,params)

有关更多信息,请参见为一般非线性MPC指定约束条件

例子:@ineqFcn

自定义非线性编程求解器函数,指定为字符串、字符向量或函数句柄。如果没有最优化工具箱™软件,则必须指定自己的自定义非线性编程求解器。您可以通过以下方式之一指定您的自定义求解器函数:

  • 当前工作文件夹或MATLAB路径中函数的名称,指定为字符串或字符向量

    优化。CustomSolverFcn =“myNLPSolver”
  • 当前工作文件夹或MATLAB路径中函数的句柄

    优化。CustomSolverFcn = @myNLPSolver;

有关更多信息,请参见非线性MPC优化求解器的配置

例子:@mySolver

的选项,指定为的选项对象fmincon[]

如果你有优化工具箱软件,SolverOptions控件的选项对象fmincon解算器。

如果没有“优化工具箱”,SolverOptions[]

有关更多信息,请参见非线性MPC优化求解器的配置

选项模拟为线性控制器,指定为以下之一:

  • “关闭”—使用非线性预测模型将控制器模拟为非线性控制器。

  • “自适应”-对于每个控制区间,从当前工作点的指定非线性状态和输出函数中获得线性模型,并在整个预测范围内使用。要确定自适应MPC控制器是否提供与非线性控制器相当的性能,请使用此选项。有关自适应MPC的更多信息,请参见自适应政策委员会

  • “TimeVarying”-对于每个控制区间,p的指定非线性状态和输出函数得到线性模型p从前一个区间预测的操作点,每个预测水平步长一个。要确定线性时变MPC控制器是否提供与非线性控制器相当的性能,请使用此选项。有关时变MPC的更多信息,请参见时变MPC

使用the或the“自适应”“TimeVarying”选项,您的控制器必须没有自定义约束和自定义代价函数。

有关将非线性MPC控制器模拟为线性控制器的示例,请参见基于非线性MPC的馈料堆优化与控制

例子:“自适应”

接受次优解决方案(指定为逻辑值)的选项。当非线性规划求解器达到迭代的最大次数而没有找到一个解时(退出标志为0),控制器:

  • 冻结MV值如果UseSuboptimalSolution

  • 应用求解器在最后迭代后发现的次优解UseSuboptimalSolution真正的

要指定最大迭代次数,请使用Optimization.SolverOptions.MaxIter

例子:真正的

块移动所使用的线性插值顺序,指定为以下之一:

  • 0-使用分段常数操纵变量间隔。

  • 1-使用分段线性操纵可变区间。

如果控制水平是一个标量,则控制器将忽略MVInterpolationOrder

有关操纵变量阻塞的更多信息,请参见操纵变量阻塞

例子:1

模型函数的雅可比矩阵,自定义代价和约束函数,指定为一个结构。作为最佳实践,只要可用就使用雅可比矩阵,因为它们可以提高优化效率。如果你不指定给定函数的雅可比矩阵,非线性规划求解器必须数值计算雅可比矩阵。

雅可比矩阵结构包含以下字段。

状态函数的雅可比矩阵z模型。StateFcn,指定为以下之一

  • 当前工作文件夹或MATLAB路径中函数的名称,指定为字符串或字符向量

    模型。StateFcn =“myStateJacobian”
  • 当前工作文件夹或MATLAB路径中函数的句柄

    模型。StateFcn = @myStateJacobian;
  • 匿名函数

    模型。mystate - jacobian (x,u,params)

有关更多信息,请参见指定非线性MPC预测模型

例子:@Afcn

输出函数的雅可比矩阵y模型。OutputFcn,指定为以下其中之一:

  • 当前工作文件夹或MATLAB路径中函数的名称,指定为字符串或字符向量

    模型。StateFcn =“myOutputJacobian”
  • 当前工作文件夹或MATLAB路径中函数的句柄

    模型。StateFcn = @myOutputJacobian;
  • 匿名函数

    模型。myOutputJacobian(x,u,params)

有关更多信息,请参见指定非线性MPC预测模型

例子:@Cfcn

定制成本函数的雅可比矩阵J优化。CustomCostFcn,指定为以下其中之一:

  • 当前工作文件夹或MATLAB路径中函数的名称,指定为字符串或字符向量

    雅可比矩阵。CustomCostFcn =“myCostJacobian”
  • 当前工作文件夹或MATLAB路径中函数的句柄

    雅可比矩阵。CustomCostFcn = @myCostJacobian;
  • 匿名函数

    雅可比矩阵。CustomCostFcn = @(X,U,e,data,params)

代价雅可比矩阵函数必须有这样的特征:

函数[G,Gmv,Ge] = myCostJacobian(X,U,e,data,params)

有关更多信息,请参见指定非线性MPC的代价函数

例子:@costJacFcn

自定义等式约束的雅可比矩阵量表信优化。CustomEqConFcn,指定为以下其中之一:

  • 当前工作文件夹或MATLAB路径中函数的名称,指定为字符串或字符向量

    雅可比矩阵。CustomEqConFcn =“myEqConJacobian”
  • 当前工作文件夹或MATLAB路径中函数的句柄

    雅可比矩阵。CustomEqConFcn = @myEqConJacobian;
  • 匿名函数

    雅可比矩阵。CustomEqConFcn = @(X,U,data,params) myEqConJacobian(X,U,data,params);

等式约束雅可比矩阵函数必须有这样的签名:

函数[G,Gmv] = myEqConJacobian(X,U,data,params)

有关更多信息,请参见为一般非线性MPC指定约束条件

例子:@eqJacFcn

自定义不等式约束的雅可比矩阵c优化。CustomIneqConFcn,指定为以下其中之一:

  • 当前工作文件夹或MATLAB路径中函数的名称,指定为字符串或字符向量

    雅可比矩阵。CustomEqConFcn =“myIneqConJacobian”
  • 当前工作文件夹或MATLAB路径中函数的句柄

    雅可比矩阵。CustomEqConFcn = @myIneqConJacobian;
  • 匿名函数

    雅可比矩阵。myIneqConJacobian(X,U,data,params);

不等式约束雅可比矩阵函数必须有如下签名:

函数[G,Gmv,Ge] = myIneqConJacobian(X,U,data,params)

有关更多信息,请参见为一般非线性MPC指定约束条件

例子:@ineqJacFcn

无源性约束,指定为具有以下字段的结构。

当你的非线性MPC控制器配置为使用无源约束时,优化算法在每一步都试图强制执行不等式约束:

y p x u T u p x u + ν y y p x u T y p x u + ν u u p x u T u p x u 0

在这里,νy为输出无源性指数,νu为输入无源性指数,upxu是无源输入函数,和ypxu为无源输出函数。的变量x而且u是预测模型的当前状态和输入。

假设植物对于输入输出对已经是被动的up而且yp,如果这两个不等式得到验证,则(在温和条件下)所得到的闭环系统随着时间趋于能量耗散,因此具有稳定的平衡。有关被动的更多信息,请参见为一般非线性MPC指定约束条件在线性系统中,关于被动和被动指数.有关示例,请参见基于无源非线性MPC的四油箱控制而且基于无源非线性MPC的机器人机械手控制

选项强制约束,指定为以下之一:

  • 真正的-在优化过程中强制执行被动约束。在本例中,您必须指定OutputFcn而且InputFcn属性。

  • -在优化过程中不会强制执行被动约束。

例子:真正的

控制器的期望输出无源指标,指定为非负标量。

如果被动。EnforceConstraint真正的,在每一步优化算法都试图强制执行无源性不等式约束,这涉及到无源性指标νy中指定的被动。OututPassivityIndex

例子:1

控制器的期望输出无源指标,指定为非负标量。

如果被动。EnforceConstraint真正的,在每一步优化算法都试图强制执行无源性不等式约束,这涉及到无源性指标νu中指定的被动。InputPassivityIndex

例子:1

被动输出函数,指定为字符串、字符向量或函数句柄。

如果被动。EnforceConstraint真正的然后,在每一步优化算法尝试强制输入和输出不等式约束,这涉及到函数ypxu中指定的被动。OutputFcn

你可以指定你的无源输出函数如下所示:

  • 当前工作文件夹或MATLAB路径中函数的名称,指定为字符串或字符向量

    被动。OutputFcn=“myPassivityOutputFcn”
  • 当前工作文件夹或MATLAB路径中函数的句柄

    被动。OutputFcn=@myPassivityOutputFcn;
  • 匿名函数

    被动。OutputFcn=@(x,u,params) myPassivityOutputFcn(x,u,params)

在这里,x而且u预测模型的状态和输入分别是和吗参数个数用逗号分隔的参数列表(例如p1, p2, p3),这可能是您指定的函数所需要的。如果任何函数使用可选参数,则必须指定使用的参数的数量模型。Nu米berOfParameters.在运行时,在Simulink中,然后将这些参数传递给非线性MPC控制器块。在MATLAB中,将参数传递给一个仿真函数(例如nlmpcmove,使用nlmpcmoveopt选项集对象)。

例子:@ypFcn

被动输出函数,指定为字符串、字符向量或函数句柄。如果被动。EnforceConstraint真正的然后,在每一步优化算法尝试强制输入和输出不等式约束,这涉及到函数upxu中指定的被动。OutputFcn

你可以指定你的无源输入函数如下所示:

  • 当前工作文件夹或MATLAB路径中函数的名称,指定为字符串或字符向量

    被动。InputFcn =“myPassivityInputFcn”
  • 当前工作文件夹或MATLAB路径中函数的句柄

    被动。InputFcn =@myPassivityInputFcn;
  • 匿名函数

    被动。InputFcn =@(x,u,params) myPassivityInputFcn(x,u,params)

在这里,x而且u预测模型的状态和输入分别是和吗参数个数用逗号分隔的参数列表(例如p1, p2, p3),这可能是您指定的函数所需要的。如果任何函数使用可选参数,则必须指定使用的参数的数量模型。Nu米berOfParameters.在运行时,在Simulink中,然后将这些参数传递给非线性MPC控制器块。在MATLAB中,将参数传递给一个仿真函数(例如nlmpcmove,使用nlmpcmoveopt选项集对象)。

例子:@upFcn

无源输出函数的雅可比矩阵被动。OutputFcn,指定为以下其中之一:

  • 当前工作文件夹或MATLAB路径中函数的名称,指定为字符串或字符向量

    被动。OutputJacobianFcn =“myPsvOutJacFcn”
  • 当前工作文件夹或MATLAB路径中函数的句柄

    被动。OutputJacobianFcn = @myPsvOutJacFcn;
  • 匿名函数

    被动。输出jacobianfcn = @(x,u,params) myPsvOutJacFcn(x,u,params)

在这里,x而且u预测模型的状态和输出分别是和吗参数个数是可选的逗号分隔列表(例如p1, p2, p3)所指定的函数可能需要的参数。如果任何函数使用可选参数,则必须指定使用的参数数量模型。Nu米berOfParameters.在运行时,在Simulink中,然后将这些参数传递给非线性MPC控制器块。在MATLAB中,将参数传递给一个仿真函数(例如nlmpcmove,使用nlmpcmoveopt).

中指定的函数被动。OutputJacobianFcn(如果有的话)必须返回输出无源函数相对于当前状态的雅可比矩阵作为第一个输出参数Nyp通过Nx矩阵),作为第二个输出参数,输出无源函数相对于被操纵变量的雅可比矩阵(anNyp通过Nmv矩阵)。

在这里,Nx为预测模型的状态变量个数,Nmv操纵变量的数量是和吗Nyp为无源输出函数的输出个数。

例子:@ypJac

无源输入函数的雅可比矩阵被动。InputFcn,指定为以下之一

  • 当前工作文件夹或MATLAB路径中函数的名称,指定为字符串或字符向量

    被动。InputJacobianFcn =“myPsvInJacFcn”
  • 当前工作文件夹或MATLAB路径中函数的句柄

    被动。InputJacobianFcn = @myPsvInJacFcn;
  • 匿名函数

    被动。InputJacobianFcn = @(x,u,params) myPsvInJacFcn(x,u,params)

在这里,x而且u预测模型的状态和输出分别是和吗参数个数是可选的逗号分隔列表(例如p1, p2, p3)所指定的函数可能需要的参数。如果任何函数使用可选参数,则必须指定使用的参数数量模型。Nu米berOfParameters.在运行时,在Simulink中,然后将这些参数传递给非线性MPC控制器块。在MATLAB中,将参数传递给一个仿真函数(例如nlmpcmove,使用nlmpcmoveopt).

中指定的函数被动。InputJacobianFcn(如果有的话)必须返回输入无源函数相对于当前状态的雅可比矩阵作为第一个输出参数Nup通过Nx矩阵),作为第二个输出参数,输入无源函数相对于被操纵变量的雅可比矩阵(anNup通过Nmv矩阵)。

在这里,Nx为预测模型的状态变量个数,Nmv操纵变量的数量是和吗Nup为无源输入函数的输出个数。

例子:@upFcn

使用预测或当前状态的选项,指定为以下之一:

  • 真正的- - - - - -x (k + 1)是优化问题中的一个决策变量。

  • - - - - - -x [k]是优化问题中的一个决策变量。

例子:真正的

对象的功能

nlmpcmove 计算非线性MPC控制器的最优控制动作
validateFcns 检验预测模型和自定义函数nlmpcnlmpcMultistage潜在问题的对象
convertToMPC 转换nlmpc对象转换为一个或多个货币政策委员会对象
createParameterBus 创建动态仿真模块总线对象,并配置总线创建者块传递模型参数到非线性MPC控制器块

例子

全部折叠

创建一个四状态、两个输出和一个输入的非线性MPC控制器。

Nx = 4;Ny = 2;Nu = 1;Nlobj = nlmpc(nx,ny,nu);
在标准成本函数中,默认情况下对一个或多个OVs应用零权重,因为mv比OVs少。

指定控制器的采样时间和范围。

Ts = 0.1;nlobj。Ts=Ts;nlobj。PredictionHorizon = 10;nlobj。ControlHorizon = 5;

指定控制器的状态函数,该函数位于文件中pendulumDT0.m.该离散时间模型集成了中定义的连续时间模型pendulumCT0.m使用了多步向前的欧拉方法。

nlobj.Model.StateFcn =“pendulumDT0”;nlobj.Model.IsContinuousTime = false;

离散时间状态函数使用一个可选参数,采样时间Ts,集成连续时间模型。因此,必须将可选参数的数量指定为1

nlobj.Model.NumberOfParameters = 1;

指定控制器的输出函数。在本例中,将第一和第三个状态定义为输出。即使这个输出函数不使用可选的采样时间参数,您也必须将该参数指定为输入参数(Ts).

nlobj.Model.OutputFcn = @(x,u,Ts) [x(1);x (3)];

验证名义状态的预测模型函数x0名义输入情况.由于预测模型使用自定义参数,您必须将该参数传递给validateFcns

X0 = [0.1;0.2;-pi/2;0.3];U0 = 0.4;validateFcns(nlobj, x0, u0, [], {Ts});
模型。StateFcn是OK的。模型。OutputFcn是OK的。分析用户提供的模型,成本和约束功能完成。

创建一个具有三种状态、一个输出和四个输入的非线性MPC控制器。前两个输入为测量扰动,第三个输入为操纵变量,第四个输入为未测量扰动。

Nlobj = nlmpc(3,1,“MV”3,“医学博士”(1 - 2),“UD”4);

要查看控制器状态、输出和输入维度和索引,请使用属性。

nlobj。维
ans =带有字段的结构:NumberOfStates: 3 NumberOfOutputs: 1 NumberOfInputs: 4 MVIndex: 3 MDIndex: [1 2] UDIndex: 4

指定控制器采样时间和范围。

nlobj。Ts=0.5; nlobj.PredictionHorizon = 6; nlobj.ControlHorizon = 3;

指定预测模型状态函数,该函数位于文件中exocstrStateFcnCT.m

nlobj.Model.StateFcn =“exocstrStateFcnCT”

指定预测模型输出函数,该函数在文件中exocstrOutputFcn.m

nlobj.Model.OutputFcn =“exocstrOutputFcn”

以初始工作点为标称条件,验证预测模型函数,测试和设置未测扰动状态,x0 (3),0.因为模型已经测量了干扰,你必须把它们传递给validateFcns

X0 = [311.2639;8.5698;0);U0 = [10;298.15;298.15);validateFcns (x0, nlobj情况(3),情况(1:2)');
模型。StateFcn是OK的。模型。OutputFcn是OK的。分析用户提供的模型,成本和约束功能完成。

创建六状态,六输出,四输入的非线性MPC控制器。

Nx = 6;Ny = 6;Nu = 4;Nlobj = nlmpc(nx,ny,nu);
在标准成本函数中,默认情况下对一个或多个OVs应用零权重,因为mv比OVs少。

指定控制器采样时间和范围。

Ts = 0.4;P = 30;C = 4;nlobj。Ts=Ts;nlobj。PredictionHorizon = p;nlobj。ControlHorizon = c;

指定预测模型状态函数和状态函数的雅可比矩阵。对于本例,使用飞行机器人的模型。

nlobj.Model.StateFcn =“FlyingRobotStateFcn”;nlobj.Jacobian.StateFcn =“FlyingRobotStateJacobianFcn”

为控制器指定一个自定义代价函数,以取代标准代价函数。

nlobj.Optimization.CustomCostFcn = @(X,U,e,data) Ts*sum(sum(U(1:p,:)));nlobj.Optimization.ReplaceStandardCost = true;

为控制器指定一个自定义约束函数。

nlobj.Optimization.CustomEqConFcn = @(X,U,data) X(end,:)';

在初始状态验证预测模型和自定义函数(x0)和初始输入(情况)。

X0 = [-10;-10;pi/2;0;0];U0 = 0 (nu,1);validateFcns (nlobj x0,情况);
模型。StateFcn是OK的。雅可比矩阵。StateFcn是OK. No output function specified. Assuming "y = x" in the prediction model. Optimization.CustomCostFcn is OK. Optimization.CustomEqConFcn is OK. Analysis of user-provided model, cost, and constraint functions complete.

创建一个具有四个状态、一个输出变量、一个操纵变量和一个测量扰动的非线性MPC控制器。

Nlobj = nlmpc(4,1,“MV”, 1“医学博士”2);

指定控制器采样时间和范围。

nlobj。PredictionHorizon = 10;nlobj。ControlHorizon = 3;

指定预测模型的状态函数。

nlobj.Model.StateFcn =“oxidationStateFcn”

指定预测模型输出函数和输出变量比例因子。

nlobj.Model.OutputFcn = @(x,u) x(3);nlobj.OutputVariables.ScaleFactor = 0.03;

指定被操纵的变量约束和比例因子。

nlobj. manipulation variables . min = 0.0704;nlobj. manipulation variables . max = 0.7042;nlobj. manipulation variables . scalefactor = 0.6;

指定测量的扰动尺度因子。

nlobj. measured扰动. scalefactor = 0.5;

计算三个线性MPC控制器的状态和输入工作条件fsolve函数。

选项= optimoptions(“fsolve”“显示”“没有”);uLow = [0.38 0.5];xLow = fsolve(@(x) oxidationStateFcn(x,uLow),[1 0.3 0.03 1],options);uMedium = [0.24 0.5];xMedium = fsolve(@(x) oxidationStateFcn(x,uMedium),[1 0.3 0.03 1],options);uHigh = [0.15 0.5];xHigh = fsolve(@(x) oxidationStateFcn(x,uHigh),[1 0.3 0.03 1],options);

为每个标称条件创建线性MPC控制器。

mpcobjLow = convertToMPC(nlobj,xLow,uLow);mpcobjMedium = convertToMPC(nlobj,xMedium,uMedium);mpcobjHigh = convertToMPC(nlobj,xHigh,uHigh);

还可以使用标称条件数组创建多个控制器。数组中的行数指定要创建的数量控制器。的单元阵列返回线性控制器货币政策委员会对象。

u = [uLow;]uMedium;uHigh];x = [xLow;xMedium;xHigh];mpcobjs = convertToMPC(nlobj,x,u);

的属性mpcobjLow控制器。

mpcobjLow
MPC对象(创建于2022年8月31日05:01:07):---------------------------------------------采样时间:1(秒)预测范围:10控制范围:3植物模型:-------------- 1操纵变量(s)—>| 4状态| | |—> 1测量输出(s) 1测量扰动(s)—>| 2输入| | |—> 0未测量输出(s) 0未测量扰动(s)—>| 1输出| --------------指数:(输入矢量)操纵变量:[1]测量扰动:[2](输出矢量)测量输出:[1]扰动和噪声模型:输出扰动模型:default(类型"getoutdist(mpcobjLow)"为详细信息)测量噪声模型:default(缩放后的单位增益)权重:controllatedvariables: 0 controllatedvariablesrate: 0.1000 OutputVariables: 1 ECR: 100000状态估计:default卡尔曼滤波器(类型"getEstimator(mpcobjLow)"为详细信息)约束:0.0704 <= u1 <= 0.7042, u1/rate为无约束,y1为无约束

创建一个具有六种状态、六种输出和四种输入的非线性MPC控制器。

Nx = 6;Ny = 6;Nu = 4;Nlobj = nlmpc(nx,ny,nu);
在标准成本函数中,默认情况下对一个或多个OVs应用零权重,因为mv比OVs少。

指定控制器采样时间和范围。

Ts = 0.4;P = 30;C = 4;nlobj。Ts=Ts;nlobj。PredictionHorizon = p;nlobj。ControlHorizon = c;

指定预测模型状态函数和状态函数的雅可比矩阵。对于本例,使用飞行机器人的模型。

nlobj.Model.StateFcn =“FlyingRobotStateFcn”;nlobj.Jacobian.StateFcn =“FlyingRobotStateJacobianFcn”

为控制器指定一个自定义代价函数,以取代标准代价函数。

nlobj.Optimization.CustomCostFcn = @(X,U,e,data) Ts*sum(sum(U(1:p,:)));nlobj.Optimization.ReplaceStandardCost = true;

为控制器指定一个自定义约束函数。

nlobj.Optimization.CustomEqConFcn = @(X,U,data) X(end,:)';

指定被操纵变量的线性约束。

ct = 1:nu nlobj.MV(ct)。Min = 0;nlobj.MV (ct)。Max = 1;结束

在初始状态验证预测模型和自定义函数(x0)和初始输入(情况)。

X0 = [-10;-10;pi/2;0;0];U0 = 0 (nu,1);validateFcns (nlobj x0,情况);
模型。StateFcn是OK的。雅可比矩阵。StateFcn是OK. No output function specified. Assuming "y = x" in the prediction model. Optimization.CustomCostFcn is OK. Optimization.CustomEqConFcn is OK. Analysis of user-provided model, cost, and constraint functions complete.

中返回的最优状态和操纵的可变轨迹信息

[~,~,info] = nlmpcmove(nlobj,x0,u0);
松弛变量未使用或自定义成本函数中的零加权。所有的约束都将是艰难的。

画出最佳轨迹。

FlyingRobotPlotPlanning(信息,Ts)
最佳油耗= 1.884953

图中包含6个轴对象。标题为x的axis对象1包含一个类型为line的对象。标题为y的Axes对象2包含一个类型为line的对象。标题为theta的Axes对象3包含一个类型为line的对象。标题为vx的Axes对象4包含一个类型为line的对象。标题为vy的axis对象5包含一个类型为line的对象。标题为omega的Axes对象6包含一个类型为line的对象。

图中包含4个轴对象。标题为推力u(1)的轴对象1包含一个类型为stair的对象。标题为推力u(2)的axis对象2包含一个类型为stair的对象。标题为推力u(3)的轴对象3包含一个类型为stair的对象。标题为推力u(4)的轴对象4包含一个类型为stair的对象。

图中包含一个axes对象。标题为Optimal Trajectory的axis对象包含62个patch、line类型的对象。

创建一个四状态、两个输出和一个输入的非线性MPC控制器。

Nlobj = nlmpc(4,2,1);
在标准成本函数中,默认情况下对一个或多个OVs应用零权重,因为mv比OVs少。

指定控制器的采样时间和范围。

Ts = 0.1;nlobj。Ts=Ts;nlobj。PredictionHorizon = 10;nlobj。ControlHorizon = 5;

指定控制器的状态函数,该函数位于文件中pendulumDT0.m.该离散时间模型集成了中定义的连续时间模型pendulumCT0.m使用了多步向前的欧拉方法。

nlobj.Model.StateFcn =“pendulumDT0”;nlobj.Model.IsContinuousTime = false;

预测模型使用了一个可选参数,Ts,表示样本时间。指定参数的数量。

nlobj.Model.NumberOfParameters = 1;

指定模型的输出函数,传递样本时间参数作为输入参数。

nlobj.Model.OutputFcn = @(x,u,Ts) [x(1);x (3)];

为控制器定义标准约束。

nlobj.Weights.OutputVariables = [3 3];nlobj. weights . manipulation variablesrate = 0.1;nlobj.OV(1)。Min = -10;nlobj.OV(1)。Max = 10;nlobj.MV.Min = -100;nlobj.MV.Max = 100;

验证预测模型函数。

X0 = [0.1;0.2;-pi/2;0.3];U0 = 0.4;validateFcns(nlobj, x0, u0, [], {Ts});
模型。StateFcn是OK的。模型。OutputFcn是OK的。分析用户提供的模型,成本和约束功能完成。

只有两种植物状态是可测量的。因此,创建一个扩展的卡尔曼滤波器来估计四种植物状态。它的状态转移函数定义在pendulumStateFcn.m其测量函数定义在pendulumMeasurementFcn.m

EKF = extendedKalmanFilter(@pendulumStateFcn,@pendulumMeasurementFcn);

为模拟定义初始条件,初始化扩展卡尔曼滤波状态,并指定初始操作变量值为零。

X = [0;0;-pi;0];Y = [x(1);x(3)];卡尔曼滤波器。状态= x;Mv = 0;

指定输出参考值。

Yref = [0 0];

创建一个nlmpcmoveopt对象,并指定采样时间参数。

Nloptions = nlmpcmoveopt;nloptions。参数= {Ts};

运行以下模拟10秒。在每个控制间隔内:

  1. 用当前的测量来修正先前的预测。

  2. 计算最优控制移动nlmpcmove.函数返回计算的最优序列nloptions.将更新的选项对象传递给nlmpcmove下一个控制区间提供最优序列的初始猜测。

  3. 预测模型状态。

  4. 应用第一个计算的最优控制移动到设备,更新设备状态。

  5. 生成带有白噪声的传感器数据。

  6. 拯救植物状态。

持续时间= 10;xHistory = x;ct = 1:(Duration/Ts)%正确先前的预测xk = correct(EKF,y);计算最优控制移动[mv,nloptions] = nlmpcmove(nlobj,xk,mv,yref,[],nloptions);预测下一个迭代的预测模型状态。预测(卡尔曼滤波器,[mv;Ts]);执行第一个最优控制动作x = pendulumDT0(x,mv,Ts);%生成传感器数据Y = x([1 3]) + randn(2,1)*0.01;%保存工厂状态xHistory = [xHistory x];结束

绘制结果状态轨迹。

图subplot(0:Ts:Duration,xHistory(1,:))“时间”) ylabel (“z”)标题(“车位置”) subplot(2,2,2) plot(0:Ts:Duration,xHistory(2,:)“时间”) ylabel (“zdot”)标题(“车速度”) subplot(2,2,3) plot(0:Ts:Duration,xHistory(3,:)“时间”) ylabel (“θ”)标题(“摆角”) subplot(0:Ts:Duration,xHistory(4,:))“时间”) ylabel (“thetadot”)标题(“摆速度”

图中包含4个轴对象。带有标题推车位置的Axes对象1包含一个类型为line的对象。标题为cart velocity的Axes对象2包含一个类型为line的对象。带有标题摆角的Axes对象3包含一个类型为line的对象。带有标题摆速度的轴对象4包含一个类型为line的对象。

版本历史

在R2018b中介绍

Baidu
map