主要内容

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;
  • 匿名函数

    模型。mystatefcn = @(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变化率下限,用非正标量或向量表示。MV变化率定义为MVk) - - -MVk1),k是当前时间。默认情况下,这个下界为

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

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

例子:(-50 -20)

MV变化率的上限,指定为非负的标量或向量。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目标金宝app®,将目标值传递给非线性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,数据,参数)myEqConFunction(X,U,数据,参数);

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

函数ceq = myEqConFunction(X,U,数据,参数)

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

例子:@eqFcn

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

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

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

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

    优化。CustomIneqConFcn = @(X,U,e,数据,参数)myIneqConFunction(X,U,e,数据,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

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

有关将非线性MPC控制器模拟为线性控制器的示例,请参见基于非线性MPC的加料间歇反应器优化控制

例子:“自适应”

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

  • 如果冻结MV值UseSuboptimalSolution

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

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

例子:真正的

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

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

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

如果控制层是标量,则控制器忽略MVInterpolationOrder

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

例子:1

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

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

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

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

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

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

    模型。mystate雅可比矩阵(x,u,params)

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

例子:@Afcn

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

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

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

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

    模型。myoutput雅可比矩阵(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;
  • 匿名函数

    雅可比矩阵。CustomEqConFcn = @(X,U,数据,参数)myIneqConJacobian(X,U,数据,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中,金宝app然后将这些参数传递给非线性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中,金宝app然后将这些参数传递给非线性MPC控制器块。在MATLAB中,您将参数传递给仿真函数(例如nlmpcmove,使用nlmpcmoveopt选项集对象)。

例子:@upFcn

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

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

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

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

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

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

中指定的函数被动。OutputJacobianFcn(如果有的话)必须返回输出被动函数相对于当前状态(an)的雅可比矩阵作为第一个输出参数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中,金宝app然后将这些参数传递给非线性MPC控制器块。在MATLAB中,您将参数传递给仿真函数(例如nlmpcmove,使用nlmpcmoveopt).

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

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

例子:@upFcn

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

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

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

例子:真正的

对象的功能

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

例子

全部折叠

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

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

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

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);
在标准代价函数中,默认情况下对一个或多个ov应用零权重,因为mv比ov少。

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

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;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.ManipulatedVariables.Min = 0.0704;nlobj.ManipulatedVariables.Max = 0.7042;nlobj.ManipulatedVariables.ScaleFactor = 0.6;

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

nlobj. measureddisturbed . 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年11月26日06:58:01):---------------------------------------------采样时间:1(秒)预测水平:10控制水平:3植物模型:-------------- 1操纵变量(s)—>| 4状态| | |—> 1测量输出(s) 1测量扰动(s)—>| 2输入| | |—> 0未测输出(s) 0未测扰动(s)—>| 1输出| --------------指数:(输入矢量)操纵变量:[1]测量扰动:[2](输出向量)测量输出:[1]扰动和噪声模型:输出扰动模型:default(类型“getoutdist(mpcobjLow)”为详细信息)测量噪声模型:default(缩放后的单位增益)权重:0 ManipulatedVariablesRate: 0.1000 OutputVariables: 1 ECR: 100000状态估计:default Kalman Filter(类型“getEstimator(mpcobjLow)”为详细信息)约束:0.0704 <= u1 <= 0.7042, u1/rate是无约束的,y1是无约束的

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

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

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

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;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的坐标轴对象1包含一个line类型的对象。标题为y的坐标轴对象2包含一个line类型的对象。标题为theta的坐标轴对象3包含一个类型为line的对象。标题为vx的Axes对象4包含一个line类型的对象。标题为vy的坐标轴对象5包含一个line类型的对象。标题为omega的Axes对象6包含一个类型为line的对象。

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

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

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

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

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

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.ManipulatedVariablesRate = 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:(持续时间/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(2,2,1) plot(0:Ts:Duration,xHistory(1,:)) xlabel(“时间”) ylabel (“z”)标题(“车位置”) subplot(2,2,2) plot(0:Ts:Duration,xHistory(2,:)) xlabel(“时间”) ylabel (“zdot”)标题(“车速度”) subplot(2,2,3) plot(0:Ts:Duration,xHistory(3,:)) xlabel(“时间”) ylabel (“θ”)标题(“摆角”) subplot(2,2,4) plot(0:Ts:Duration,xHistory(4,:)) xlabel(“时间”) ylabel (“thetadot”)标题(“摆速度”

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

版本历史

在R2018b中引入