主要内容

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.预测模型具有测量和未测量的干扰输入的对象。指定用于操纵变量,测量干扰和未测量干扰的输入指标。

输入参数

展开全部

预测模型状态的数量,指定为正整数。此值存储在维度。N.你mberOfStates控制器只读属性。创建控制器对象后,无法更改状态的数量。

预测模型输出的数量,指定为正整数。此值存储在尺寸.Numberofoutputs.控制器只读属性。创建控制器对象后,无法更改输出的数量。

预测模型输入的数量,它们都设置为被操纵变量,指定为正整数。此值存储在尺寸.NumberofInputs.控制器只读属性。创建控制器对象后,无法更改被操纵变量的数量。

操纵变量指标,指定为一个正整数向量。此值存储在尺寸.MVINDEX.控制器只读属性。创建控制器对象后,您无法更改这些索引。

来自mvindex.mdindex., 和udindex.必须包含所有整数1通过N., 在哪里N.是预测模型输入的数量。

测量的干扰指数,指定为正整数的向量。此值存储在尺寸..MdIndex.控制器只读属性。创建控制器对象后,您无法更改这些索引。

来自mvindex.mdindex., 和udindex.必须包含所有整数1通过N., 在哪里N.是预测模型输入的数量。

未测量的扰动指数,指定为正整数的向量。此值存储在尺寸.UDINDEX.控制器只读属性。创建控制器对象后,您无法更改这些索引。

来自mvindex.mdindex., 和udindex.必须包含所有整数1通过N., 在哪里N.是预测模型输入的数量。

特性

展开全部

预测模型采样时间,指定为正有限标量。控制器使用具有采样时间的离散时间模型Ts用于预测。如果指定连续时间预测模型(Model.IscontInuoustime.真的),然后控制器使用内置隐式梯形规则来离散模型,其中采样时间Ts

预测地平线步骤,指定为正整数。产品的产品predictionhorizo​​n.Ts是预测的时间;也就是说,控制器的观察到来了多远。

控制视界,指定为以下之一:

  • 正整数,m, 之间1P.,包括在内,在哪里P.等于predictionhorizo​​n..在这种情况下,控制器计算m有时发生自由控制移动K.通过K.+m-1,并保持控制器输出不变的剩余预测视界步骤K.+m通过K.+P.-1。这里,K.是当前的控制间隔。

  • 正整数向量[m1m2,…],指定阻塞间隔的长度。默认情况下,控制器进行计算m方块自由移动,哪里m是阻塞间隔的数量。第一个免费移动适用于时间K.通过K.+m1-1,第二个自由举动适用于时间K.+m1通过K.+m1+m2-1,等等。使用块移动可以提高控制器的稳健性。值的总和ControlHorizon必须符合预测范围吗P..如果指定一个向量,其和为:

    • 小于预测层位,则控制器增加一个阻塞间隔。这个区间的长度等于区间长度之和P..例如,如果P.=10你指定了一个控制的地平线ControlHorizon=[1 2 3],然后控制器使用四个长度为的间隔[1 2 3 4]

    • 大于预测地平线,然后截断间隔直到间隔长度的总和等于P..例如,如果P.=10你指定了一个控制的地平线ControlHorizon=[1 2 3 6 7],然后控制器使用四个长度为的间隔[1 2 3 4]

对于最佳路径规划应用,分段恒定阻断移动通常过于限制。为了产生更严格的更严格,有条件的非线性编程问题,可以指定分段线性操纵可变阻塞间隔。为此,请设置优化.mvinterpolationOrder.你的财产nlmpc.控制器对象1

有关如何用不同插值方法的操作变量阻塞方式的更多信息,请参阅操纵变量阻塞

此属性是只读的。

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

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

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

预测模型中的输入数指定为正整数。此值对应于任何一种nmv或者长度的总和mvindex.mdindex., 和udindex.

用于预测模型的操纵可变指标,指定为正整数的向量。该值对应于mvindex.

预测模型的测量扰动指数,指定为一个正整数向量。该值对应于mdindex.

预测模型的未测量障碍指数指定为正整数的向量。该值对应于udindex.

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

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

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

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

您可以通过以下方式之一指定状态函数:

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

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

    model.statefcn = @mystatefunction;
  • 匿名函数

    model.statefcn = @(x,u,params)mystatefunction(x,u,params)

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

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

笔记

您输出功能不能随时从任何操作变量直接馈通。

您可以通过以下方式之一指定输出功能:

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

    model.outputfcn =.“myoutputfunction”
  • 当前工作文件夹或MATLAB路径中的函数句柄

    model.outputfcn =.@myOutputFunction;
  • 匿名函数

    model.outputfcn =.@(x,u,params) myOutputFunction(x,u,params)

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

指示预测模型时域的标志,指定为以下之一:

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

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

笔记

IsContInuoustime.必须与中指定的功能一致模型。StateFcnmodel.outputfcn.

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

预测模型、自定义成本函数和自定义约束函数使用的可选模型参数数,指定为非负整数。参数的数量包括这些函数使用的所有参数。例如,如果状态函数仅使用参数P1,约束函数仅使用参数p2,并且成本函数仅使用参数p3, 然后NumberOfParameters3.

状态信息、边界和比例因子,作为结构数组指定N.X元素,N.X是状态数。每个结构元素有以下字段。

状态下限,指定为标量或向量。默认情况下,下限是不约束的。

要在预测视野上使用相同的绑定,请指定标量值。

从时间内改变预测地平线的界限K.+ 1,K.+P.,指定最多的向量P.值。这里,K.是当前的时间和P.是预测的地平线。如果您指定少于P.值,最终绑定用于预测地平线的剩余步骤。

状态范围始终是艰难的限制。

状态上界,指定为标量或向量。缺省情况下,上限不受约束。

要在预测视野上使用相同的绑定,请指定标量值。

从时间内改变预测地平线的界限K.+ 1,K.+P.,指定最多的向量P.值。这里,K.是当前的时间和P.是预测的地平线。如果您指定少于P.值,最终绑定用于预测地平线的剩余步骤。

状态范围始终是艰难的限制。

状态名称,指定为字符串或字符向量。默认状态名称是“X#”, 在哪里是它的状态索引。

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

状态比例因子,指定为正有限标量。通常,使用状态的工作范围。指定适当的比例因子可以改善优化的数值条件。

输出变量(OV)信息,界限和比例因子,指定为结构阵列N.y元素,N.y为输出变量的个数。要访问此属性,可以使用别名机汇代替opportVariables.

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

OV下界,指定为标量或向量。默认情况下,此较低界限是不受约束的。

要在预测视野上使用相同的绑定,请指定标量值。

从时间内改变预测地平线的界限K.+ 1,K.+P.,指定最多的向量P.值。这里,K.是当前的时间和P.是预测的地平线。如果您指定少于P.值,最终绑定用于预测地平线的剩余步骤。

OV上限,指定为标量或向量。默认情况下,此上限是不受约束的。

要在预测视野上使用相同的绑定,请指定标量值。

从时间内改变预测地平线的界限K.+ 1,K.+P.,指定最多的向量P.值。这里,K.是当前的时间和P.是预测的地平线。如果您指定少于P.值,最终绑定用于预测地平线的剩余步骤。

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

要在预测视野上使用相同的ECR值,请指定标量值。

使ECR值在预测视界上随时间变化K.+ 1,K.+P.,指定最多的向量P.值。这里,K.是当前的时间和P.是预测的地平线。如果您指定少于P.值,最终ECR值用于预测范围的剩余步骤。

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

要在预测视野上使用相同的ECR值,请指定标量值。

使ECR值在预测视界上随时间变化K.+ 1,K.+P.,指定最多的向量P.值。这里,K.是当前的时间和P.是预测的地平线。如果您指定少于P.值,最终ECR值用于预测范围的剩余步骤。

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

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

OV比例因子,指定为正有限标量。通常,使用输出变量的操作范围。指定适当的比例因子可以改善数值调节以进行优化。

操纵变量(MV)信息、边界和比例因子,指定为结构数组N.m元素,N.m是操纵变量的数目。若要访问此属性,可以使用别名MV代替漫画variables.

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

MV下界,指定为标量或向量。默认情况下,此较低界限是不受约束的。

要在预测视野上使用相同的绑定,请指定标量值。

从时间内改变预测地平线的界限K.时间K.+P.-1,指定最多的向量P.值。这里,K.是当前的时间和P.是预测的地平线。如果您指定少于P.值,最终绑定用于预测地平线的剩余步骤。

MV上限,指定为标量或向量。默认情况下,此上限是不受约束的。

要在预测视野上使用相同的绑定,请指定标量值。

从时间内改变预测地平线的界限K.时间K.+P.-1,指定最多的向量P.值。这里,K.是当前的时间和P.是预测的地平线。如果您指定少于P.值,最终绑定用于预测地平线的剩余步骤。

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

要在预测视野上使用相同的ECR值,请指定标量值。

使ECR值在预测视界上随时间变化K.时间K.+P.-1,指定最多的向量P.值。这里,K.是当前的时间和P.是预测的地平线。如果您指定少于P.值,最终ECR值用于预测范围的剩余步骤。

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

要在预测视野上使用相同的ECR值,请指定标量值。

使ECR值在预测视界上随时间变化K.时间K.+P.-1,指定最多的向量P.值。这里,K.是当前的时间和P.是预测的地平线。如果您指定少于P.值,最终ECR值用于预测范围的剩余步骤。

MV变化率下限,指定为非叠数标量或向量。MV变化率定义为MVK.) -MVK.-1),在哪里K.是当前的时间。默认情况下,此较低界限是不受约束的。

要在预测视野上使用相同的绑定,请指定标量值。

从时间内改变预测地平线的界限K.时间K.+P.-1,指定最多的向量P.值。这里,K.是当前的时间和P.是预测的地平线。如果您指定少于P.值,最终绑定用于预测地平线的剩余步骤。

MV变化率上限,指定为非负标量或向量。MV变化率定义为MVK.) -MVK.-1),在哪里K.是当前的时间。默认情况下,此较低界限是不受约束的。

要在预测视野上使用相同的绑定,请指定标量值。

从时间内改变预测地平线的界限K.时间K.+P.-1,指定最多的向量P.值。这里,K.是当前的时间和P.是预测的地平线。如果您指定少于P.值,最终绑定用于预测地平线的剩余步骤。

MV变化率下限较低的柔软度,其中较大的ECR值表示更软的约束,指定为非负有限标量或向量。缺省情况下,更改下限的MV速率是硬约束。

要在预测视野上使用相同的ECR值,请指定标量值。

在预测视界上随时间改变ECR值K.时间K.+P.-1,指定最多的向量P.值。这里,K.是当前的时间和P.是预测的地平线。如果您指定少于P.值,最终的ECR值用于预测地平线的剩余步骤。

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

要在预测视野上使用相同的ECR值,请指定标量值。

在预测视界上随时间改变ECR值K.时间K.+P.-1,指定最多的向量P.值。这里,K.是当前的时间和P.是预测的地平线。如果您指定少于P.值,最终的ECR值用于预测地平线的剩余步骤。

MV名称,指定为字符串或字符向量。默认的MV名称是“你#”, 在哪里是它的输入指标。

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

MV比例因子,指定为正有限标量。通常,使用操纵变量的操作范围。指定适当的比例因子可以改善数值调节以进行优化。

测量的干扰(MD)信息和比例因子,指定为结构阵列N.m元素,N.m是测量障碍的数量。如果您的型号没有测量的干扰,那么测量扰动[].要访问此属性,可以使用别名医学博士代替测量扰动

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

MD名称,指定为字符串或字符向量。默认MD名称是“你#”, 在哪里是它的输入指标。

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

MD比例因子,指定为正的有限标量。一般使用干扰的操作范围。指定适当的比例因子可以改善数值调节以进行优化。

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

笔记

如果使用定制成本函数使用优化.customcostfcn.并设置优化。ReplaceStandardCost真的,然后控制器忽略标准成本函数调整权重重量

重量具有以下字段。

操纵变量调整权值,惩罚偏离MV目标的偏差,指定为非负值的行向量或数组。所有受操纵变量的默认权重为0.

要在预测地平线上使用相同的权重,请指定长度的行向量N.m, 在哪里N.m是操纵变量的数量。

从时间从预测地平线上改变调谐重量K.时间K.+P.-1,指定阵列N.m列和最多P.行。这里,K.是当前的时间和P.是预测的地平线。每行包含一个预测地平线步骤的操纵变量调谐权重。如果您指定少于P.行,最终行中的权重用于预测地平线的剩余步骤。

要在运行时指定MV目标,请创建一个nlmpcmoveopt.对象,并设置其mvtarget.财产。

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

要在预测地平线上使用相同的权重,请指定长度的行向量N.m, 在哪里N.m是操纵变量的数量。

从时间从预测地平线上改变调谐重量K.时间K.+P.-1,指定阵列N.m列和最多P.行。这里,K.是当前的时间和P.是预测的地平线。每行包含一个预测地平线步骤的操纵可变速率调谐权重。如果您指定少于P.行,最终行中的权重用于预测地平线的剩余步骤。

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

要在预测地平线上使用相同的权重,请指定长度的行向量N.y, 在哪里N.y为输出变量的个数。

从时间从预测地平线上改变调谐重量K.+ 1,K.+P.,指定一个数组N.y列和最多P.行。这里,K.是当前的时间和P.是预测的地平线。每行包含一个预测地平线步骤的输出变量调谐权重。如果您指定少于P.行,最终行中的权重用于预测地平线的剩余步骤。

松弛可变调谐重量,指定为正标量。

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

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

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

    优化.customcostfcn =“mycostfunction”
  • 当前工作文件夹或MATLAB路径中的函数句柄

    优化.customcostfcn = @mycostfunction;
  • 匿名函数

    优化.customcostfcn =@(X,U,e,data,params) myCostFunction(X,U,e,data,params);

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

功能J = MyCostFunction(x,u,e,数据,params)

有关更多信息,请参阅指定非线性MPC的成本函数

标志,指示是否使用自定义成本函数替换标准成本函数,指定为以下之一:

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

  • 错误的—控制器以标准成本与定制成本之和作为优化的目标函数。

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

有关更多信息,请参阅指定非线性MPC的成本函数

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

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

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

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

    Optimization.CustomEqConFcn=@(X,U,data,params)myEqConFunction(X,U,data,params);

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

功能CEQ = MyeqConfunction(x,u,数据,p1,p2,...

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

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

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

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

    优化.customineqconfcn = @myineqconfunction;
  • 匿名函数

    优化.customineqconfcn = @(x,u,e,data,params)myineqconfunction(x,u,e,数据,params);

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

功能cineq = myineqconfunction(x,u,e,数据,params)

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

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

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

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

    优化.customsolverfcn = @mynlpsolver;

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

求解器选项,指定为选项对象fmincon[]

如果您有优化工具箱软件,leveroptions.包含的选项对象fmincon求解器。

如果你没有优化工具箱,leveroptions.[]

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

指示是否模拟作为线性控制器的标志,指定为以下之一:

  • “离开”- 用非线性预测模型模拟控制器作为非线性控制器。

  • “自适应”- 对于每个控制间隔,从当前操作点处的指定非线性状态和输出功能获得线性模型,并在预测地平线上使用。要确定Adaptive MPC控制器是否为非线性控制器提供了可比性性能,请使用此选项。有关Adaptive MPC的更多信息,请参阅自适应MPC

  • “罚球”- 对于每个控制间隔,P.线性模型是从指定的非线性状态和输出函数获得的P.从上一个时间间隔预测的工作点,每个预测视界步骤一个。要确定线性时变MPC控制器是否提供与非线性控制器相当的性能,请使用此选项。有关时变MPC的更多信息,请参阅时变MPC

使用任何一种“自适应”“罚球”选项,您的控制器必须没有自定义约束和无自定义成本函数。

将非线性MPC控制器模拟为线性控制器的示例,请参见使用非线性MPC的FED批量反应器的优化和控制

指示是否可接受次优解决方案的标志,作为逻辑值指定。当非线性规划求解器在未找到解的情况下达到最大迭代次数时(退出标志为0.),控制器:

  • 冻结MV值,如果使用imeryuboptimalsolution.错误的

  • 在最终迭代之后应用求解器发现的次优溶液使用imeryuboptimalsolution.真的

要指定最大的迭代次数,请使用优化.SolverOptions.maxiter.

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

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

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

如果控件地平线是标量,则控制器忽略了mvinterpolationOrder.

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

雅各比亚的模型函数,以及定制成本和约束函数,指定为结构。每当可以在可用时使用雅各者是最好的做法,因为它们提高了优化效率。如果未为给定函数指定Jacobian,则非线性编程求解器必须在数值上计算Jacobian。

雅各比亚结构包含以下字段。

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

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

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

    model.statefcn = @mystatejacobian;
  • 匿名函数

    model.statefcn = @(x,u,params)mystatejacobian(x,u,params)

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

雅各比奥输出功能ymodel.outputfcn.,指定为以下之一:

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

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

    model.statefcn = @myoutputjacobian;
  • 匿名函数

    模型。StateFcn = @(x,u,params) myOutputJacobian(x,u,params)

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

定制成本函数的雅可比矩阵j优化.customcostfcn.,指定为以下之一:

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

    jacobian.customcostfcn =“myCostJacobian”
  • 当前工作文件夹或MATLAB路径中的函数句柄

    Jacobian.CustomCostFcn=@myCostJacobian;
  • 匿名函数

    Jacobian.CustomCostFcn=@(X,U,e,data,params)myCostJacobian(X,U,e,data,params)

您的成本Jacobian函数必须具有签名:

功能[g,gmv,ge] = mycostjacobian(x,u,e,数据,params)

有关更多信息,请参阅指定非线性MPC的成本函数

雅各比亚自定义平等约束CEQ.优化。CustomEqConFcn,指定为以下之一:

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

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

    jacobian.customeqconfcn = @myeqconjacobian;
  • 匿名函数

    雅可比矩阵。CustomEqConFcn = @(X,U,数据,参数)myEqConJacobian(X,U,数据,参数);

您的平等约束Jacobian函数必须具有签名:

功能(G, Gmv) = myEqConJacobian (X, U,数据、参数)

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

雅各比亚的自定义不平等约束C优化.Customineqconfcn.,指定为以下之一:

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

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

    jacobian.customeqconfcn = @myineqconjacobian;
  • 匿名函数

    jacobian.customeqconfcn = @(x,u,data,params)myineqconjacobian(x,u,data,params);

您的不等式约束Jacobian函数必须具有签名:

功能[g,gmv,ge] = myineqconjacobian(x,u,数据,params)

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

对象功能

nlmpcmove. 计算非线性MPC控制器的最优控制动作
验证EFCNS 检查预测模型和自定义功能nlmpc.nlmpcmultistage潜在问题的对象
ConvertTompc. 转换nlmpc.将对象转换为一个或多个MPC.对象
createParameterBus 创建万博1manbetx总线对象和配置总线创建者块传递模型参数到非线性MPC控制器块

例子

全部收缩

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

nx = 4;纽约= 2;nu = 1;nlobj = nlmpc(nx,ny,nu);
在标准成本函数中,默认情况下,零重量施加到一个或多个OV,因为没有比OVS更少。

指定控制器的采样时间和视野。

t = 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.和名义投入情况.由于预测模型使用自定义参数,因此必须将此参数传递给验证EFCNS

x0 = [0.1; 0.2; -pi / 2; 0.3];U0 = 0.4;validatefcns(nlobj,x0,u0,[],{ts});
model.statefcn是好的。model.outputfcn是好的。分析用户提供的模型,成本和约束函数完成。

使用三种状态,一个输出和四个输入创建非线性MPC控制器。第一两个输入是测量干扰的,第三输入是操纵变量,第四输入是一个未测量的干扰。

nlobj=nlmpc(3,1,“MV”,3,'MD',[1 2],“UD”4);

要查看控制器状态、输出和输入尺寸和索引,请使用方面属性。

nlobj.dimensions.
ans=带字段的结构:NumberOfstates:3 NumberOfOutputs:1 NumberOfInputs:4 MVIndex:3 MdIndex:[1 2] Udindex:4

指定控制器采样时间和视野。

nlobj.ts = 0.5;nlobj.predictionhorizo​​n = 6;nlobj.controlhorizo​​n = 3;

指定在文件中的预测模型状态函数exocstrStateFcnCT.m

nlobj.Model.StateFcn =“exocstrstatefcnc”

指定在文件中的预测模型输出函数Exocstrutputfcn.m.

nlobj.Model.OutputFcn =“exocstrOutputFcn”

使用初始操作点验证预测模型功能,作为用于测试和设置未测量的干扰状态的标称条件,X0(3), 到0..由于该模型具有衡量的干扰,因此您必须将它们传递给验证EFCNS

x0 = (311.2639;8.5698;0);情况= [10;298.15;298.15);validateFcns (x0, nlobj情况(3),情况(1:2)');
model.statefcn是好的。model.outputfcn是好的。分析用户提供的模型,成本和约束函数完成。

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

nx = 6;纽约= 6;nu = 4;nlobj = nlmpc(nx,ny,nu);
在标准成本函数中,默认情况下,零重量施加到一个或多个OV,因为没有比OVS更少。

指定控制器采样时间和视野。

ts = 0.4;p = 30;c = 4;nlobj.ts = ts;nlobj.predictionhorizo​​n = p;nlobj.controlhorizo​​n = 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;0];u0=零(nu,1);验证EFCNS(nlobj,x0,u0);
model.statefcn是好的。jacobian.statefcn还可以。没有指定输出函数。假设预测模型中的“y = x”。优化.customcostfcn是可以的。优化.customeqconfcn是可以的。分析用户提供的模型,成本和约束函数完成。

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

nlobj = nlmpc(4,1,“MV”,1,'MD',2);

指定控制器采样时间和视野。

nlobj。PredictionHorizon = 10;nlobj.controlhorizo​​n = 3;

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

nlobj.Model.StateFcn =“氧化状态FCN”

指定预测模型输出函数和输出变尺度因子。

nlobj.model.outputfcn = @(x,u)x(3);nlobj.outputvariables.scalefactor = 0.03;

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

nlobj.manipuldvariables.min = 0.0704;nlobj.manipuldvariables.max = 0.7042;nlobj.manipuldvariables.scalefactor = 0.6;

指定测量的扰动比例因子。

nlobj.MeasuredDisturbances.ScaleFactor = 0.5;

使用FSOLVE.功能。

选项= Optimoptions('fsolve''展示'“没有”);ulow = [0.38 0.5];xlow = fsolve(@(x)oxidationstatefcn(x,ulow),[1 0.3.03 1],选项);umedium = [0.24 0.5];XMedium = FSOLVE(@(x)氧化术菌(x,umedium),[1 0.03 1],选项);uhigh = [0.15 0.5];xhigh = fsolve(@(x)oxidationstatefcn(x,uhigh),[1 0.3.03 1],选项);

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

mpcobjlow = converttompc(nlobj,xlow,ulow);MPCobjmedium = ConvertTompc(Nlobj,Xmedium,Umedium);mpcobjhigh = converttompc(nlobj,xhigh,uhigh);

您还可以使用标称条件数组创建多个控制器。数组中的行数指定要创建的控制器数。线性控制器以单元阵列的形式返回MPC.物体。

u = [ulow;umedium;uhigh];x = [xlow;Xmedium;xhigh];mpcobjs = converttompc(nlobj,x,u);

查看mpcobjLow控制器。

mpcobjLow
MPC对象(在23:19121 13:19:55创建):--------------------------------------------采样时间:1(秒)预测地平线:10控制地平线:3植物模型:------------- 1操纵变量- > |4州|||  - > 1测量输出1测量干扰(S) - > |2个输入|||  - > 0未测量的输出0未测量干扰(S) - > |1输出| -------------- Indices: (input vector) Manipulated variables: [1 ] Measured disturbances: [2 ] (output vector) Measured outputs: [1 ] Disturbance and Noise Models: Output disturbance model: default (type "getoutdist(mpcobjLow)" for details) Measurement noise model: default (unity gain after scaling) Weights: ManipulatedVariables: 0 ManipulatedVariablesRate: 0.1000 OutputVariables: 1 ECR: 100000 State Estimation: Default Kalman Filter (type "getEstimator(mpcobjLow)" for details) Constraints: 0.0704 <= u1 <= 0.7042, u1/rate is unconstrained, y1 is unconstrained

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

nx = 6;纽约= 6;nu = 4;nlobj = nlmpc(nx,ny,nu);
在标准成本函数中,默认情况下,零重量施加到一个或多个OV,因为没有比OVS更少。

指定控制器采样时间和视野。

ts = 0.4;p = 30;c = 4;nlobj.ts = ts;nlobj.predictionhorizo​​n = p;nlobj.controlhorizo​​n = 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;0];u0=零(nu,1);验证EFCNS(nlobj,x0,u0);
model.statefcn是好的。jacobian.statefcn还可以。没有指定输出函数。假设预测模型中的“y = x”。优化.customcostfcn是可以的。优化.customeqconfcn是可以的。分析用户提供的模型,成本和约束函数完成。

计算最优状态和操纵变量轨迹,这些轨迹在信息

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

绘制最佳轨迹。

FlyingRobotplotplanning(信息)
最优油耗= 4.712383

图包含6个轴。具有标题x的轴1包含类型线的对象。标题Y的轴2包含类型线的对象。带有标题Theta的轴3包含类型线的对象。带标题Vx的轴4包含类型线的对象。带标题VY的轴5包含类型线的对象。带标题OMEGA的轴6包含类型线的对象。

图包含4个轴。带有标题推力U(1)的轴1包含楼梯类型的对象。带有标题推力U(2)的轴2包含阶段阶段的对象。带有标题推力U(3)的轴3包含楼梯类型的对象。带有标题推力U(4)的轴4包含阶段的物体。

图中包含一个轴。标题为“最佳轨迹”的轴包含62个patch、line类型的对象。

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

nlobj = nlmpc(4,2,1);
在标准成本函数中,默认情况下,零重量施加到一个或多个OV,因为没有比OVS更少。

指定控制器的采样时间和视野。

t = 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.ManipulatedVariablesRate = 0.1;nlobj.OV(1)。最小值= -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});
model.statefcn是好的。model.outputfcn是好的。分析用户提供的模型,成本和约束函数完成。

只有两个植物状态是可衡量的。因此,创建一个扩展的卡尔曼滤波器,用于估计四个工厂状态。它的状态转换功能是定义的pendulumStateFcn.m其测量功能定义为摆锤测量法

EKF = ExtendedKalmanFilter(@ PendulumStateFCN,@ PendulummeArementFCN);

定义仿真的初始条件,初始化扩展卡尔曼滤波状态,并指定初始操纵变量值为零。

x = [0; 0; -pi; 0];Y = [x(1); x(3)];ekf.state = x;mv = 0;

指定输出参考值。

Yref = [0 0];

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

nloptions = nlmpcmoveopt;nloptions.parameters = {ts};

运行模拟10秒。在每个控制间隔期间:

  1. 使用当前测量值更正先前的预测。

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

  3. 预测模型状态。

  4. 将第一个计算的最佳控制移动到工厂,更新植物状态。

  5. 使用白噪声生成传感器数据。

  6. 保存植物状态。

时间= 10;xHistory = x;为了CT = 1 :(持续时间/ TS)正确的先前预测XK =正确(EKF,Y);%计算最佳控制移动[mv,nloptions] = nlmpcmove(nlobj,xk,mv,yref,[],nloptions);%预测预测模型状态为下一次迭代预测(EKF,[MV; TS]);%实施第一最佳控制移动x = Pendulumdt0(x,mv,ts);%生成传感器数据Y = X([1 3])+ RANDN(2,1)* 0.01;%拯救植物状态xHistory = [xHistory x];结束

绘制结果状态轨迹。

图形子图(2,2,1)绘图(0:TS:持续时间,Xhistory(1,:))XLabel(“时间”) ylabel (“z”) 标题('购物车位置')子图(2,2,2)绘图(0:TS:持续时间,Xhistory(2,:))XLabel(“时间”) ylabel ('ZDOT') 标题('购物车速度')子图(2,2,3)绘图(0:TS:持续时间,Xhistory(3,:))XLabel(“时间”) ylabel ('theta') 标题(“摆角”)子图(2,2,4)绘图(0:TS:持续时间,Xhistory(4,:))XLabel(“时间”) ylabel ('thetadot') 标题('摆锤'

图中包含4个轴。标题为cart position的轴1包含类型为line的对象。标题为cart velocity的轴2包含类型为line的对象。具有标题摆锤角度的轴3包含类型为line的对象。标题为“摆锤速度”的轴4包含线型对象。

在R2018B中介绍