nlmpc
非线性模型预测控制器
描述
非线性模型预测控制器使用非线性预测模型、非线性代价函数和非线性约束计算在预测范围内的最优控制移动。有关非线性MPC的更多信息,请参见非线性MPC.
创建
语法
描述
输入参数
nx
- - - - - -预测模型状态数
正整数
预测模型状态数,指定为正整数。该值存储在维度。Nu米berOfStates
控制器只读属性。创建控制器对象后不能更改状态数。
例子:6
纽约
- - - - - -预测模型输出数
正整数
预测模型输出的数量,指定为正整数。该值存储在维度。Nu米berOfOutputs
控制器只读属性。创建控制器对象后,不能更改输出数。
例子:2
ν
- - - - - -预测模型输入数量
正整数
预测模型输入的数量,它们都被设置为被操纵的变量,指定为正整数。该值存储在维度。Nu米berOfInputs
控制器只读属性。创建控制器对象后,不能更改被操纵变量的数量。
例子:4
mvIndex
- - - - - -操纵变量指数
正整数向量
操纵变量指数,指定为正整数向量。该值存储在维度。MVIndex
控制器只读属性。创建控制器对象后不能更改这些索引。
的组合索引集mvIndex
,mdIndex
,udIndex
必须包含来自的所有整数1
通过Nu,在那里Nu是预测模型输入的数量。
例子:3 [1]
mdIndex
- - - - - -实测扰动指数
正整数向量
测量的干扰指数,指定为正整数向量。该值存储在维度。MDIndex
控制器只读属性。创建控制器对象后不能更改这些索引。
的组合索引集mvIndex
,mdIndex
,udIndex
必须包含来自的所有整数1
通过Nu,在那里Nu是预测模型输入的数量。
例子:2
udIndex
- - - - - -不可测扰动指数
正整数向量
未测量的干扰指数,用正整数向量表示。该值存储在维度。UDIndex
控制器只读属性。创建控制器对象后不能更改这些索引。
的组合索引集mvIndex
,mdIndex
,udIndex
必须包含来自的所有整数1
通过Nu,在那里Nu是预测模型输入的数量。
例子:4
属性
Ts
- - - - - -预测模型采样时间
1
(默认)|正有限标量
预测模型采样时间,指定为正的有限标量。控制器采用采样时间为的离散时间模型Ts
为预测。如果指定连续时间预测模型(模型。IsContinuousTime
是真正的
),然后控制器采用内置的隐式梯形规则对模型进行离散化,采样时间为Ts
.
例子:0.1
PredictionHorizon
- - - - - -预测地平线
10
(默认)|正整数
预测水平步长,指定为正整数。的乘积PredictionHorizon
而且Ts
是预测时间,也就是控制器预测未来的距离。
例子:15
ControlHorizon
- - - - - -控制层
2
(默认)|正整数|正整数向量
控制水平,指定为下列之一:
正整数,米之间,
1
而且p,包括,其中p等于PredictionHorizon
.在这种情况下,控制器进行计算米自由控制动作时有发生k通过k+米-1,并保持从剩下的预测水平步长的控制器输出不变k+米通过k+p1。在这里,k当前控制间隔。正整数向量[米1,米2,…],指定阻塞间隔的长度。默认情况下,控制器进行计算米方块的自由移动,其中米是阻塞间隔的个数。第一个自由动作适用于时代k通过k+米1-1,第二次自由移动适用于时间k+米1通过k+米1+米2-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
.
有关操纵变量块如何与不同插补方法一起工作的更多信息,请参见操纵变量阻塞.
例子:3.
维
- - - - - -预测模型维度信息
结构
此属性是只读的。
预测模型维度信息,在创建控制器时指定,并存储为具有以下字段的结构。
NumberOfStates
-州数
正整数
预测模型中的状态数,指定为正整数。此值对应于nx
.
例子:6
NumberOfOutputs
-输出数量
正整数
预测模型中的输出数,指定为正整数。此值对应于纽约
.
例子:1
NumberOfInputs
-输入数量
正整数
预测模型中的输入数,指定为正整数。这个值对应于任意一个ν
或者是长度的和mvIndex
,mdIndex
,udIndex
.
例子:3.
MVIndex
-操纵变量指数
正整数向量
预测模型的操纵变量指数,指定为正整数向量。此值对应于mvIndex
.
例子:(1 2)
MDIndex
-测量的扰动指数
正整数向量
预测模型的测量扰动指数,指定为正整数向量。此值对应于mdIndex
.
例子:4
UDIndex
-未测量的扰动指数
正整数向量
预测模型的未测量扰动指数,指定为正整数向量。此值对应于udIndex
.
例子:3.
模型
- - - - - -预测模型
结构
预测模型,指定为具有以下字段的结构。
StateFcn
-状态函数
字符串|字符向量|函数句柄
状态函数,指定为字符串、字符向量或函数句柄。对于连续时间预测模型,StateFcn
是状态导数函数。对于离散时间预测模型,StateFcn
是状态更新功能。
如果你的状态函数是连续时间的,控制器自动离散模型使用隐式梯形规则。该方法可以处理中等刚度模型,其预测精度取决于控制器采样时间Ts
;也就是说,较大的样本时间会导致预测不准确。
如果默认的离散化方法不能为您的应用程序提供令人满意的预测,您可以指定自己的离散时间预测模型,该模型使用不同的方法,例如多步向前欧拉规则。
你可以用以下方式之一来指定你的状态函数:
当前工作文件夹或MATLAB中函数的名称®路径,指定为字符串或字符向量
模型。StateFcn =“myStateFunction”;
当前工作文件夹或MATLAB路径中函数的句柄
模型。StateFcn = @myStateFunction;
匿名函数
模型。mystatefcn = @(x,u,params)
有关更多信息,请参见为非线性MPC指定预测模型.
例子:“@transFcn”
OutputFcn
-输出函数
[]
(默认)| string |字符向量|函数句柄
输出函数,指定为字符串、字符向量或函数句柄。如果预测模型的状态数和输出相同,则可以省略OutputFcn
,这意味着所有的状态都是可测量的;也就是说,每个输出对应一个状态。
请注意
您的输出函数不能在任何时候从任何被操纵的变量直接馈送到任何输出。
您可以通过以下方式之一指定输出函数:
当前工作文件夹或MATLAB路径中的函数名称,指定为字符串或字符向量
模型。OutputFcn =“myOutputFunction”;
当前工作文件夹或MATLAB路径中函数的句柄
模型。OutputFcn = @myOutputFunction;
匿名函数
模型。myOutputFunction(x,u,params)
有关更多信息,请参见为非线性MPC指定预测模型.
例子:“@outFcn”
IsContinuousTime
-显示预测模型时域的选项
真正的
(默认)|假
选项,用于指示预测模型时域,指定为以下之一:
真正的
-连续时间预测模型。在这种情况下,控制器在预测使用过程中自动离散模型Ts
.假
-离散时间预测模型。在这种情况下,Ts
为模型的采样时间。
请注意
IsContinuousTime
必须与中指定的函数一致模型。StateFcn
而且模型。OutputFcn
.
如果IsContinuousTime
是真正的
,StateFcn
必须返回当前时刻状态对时间的导数。否则StateFcn
必须在下一个控制间隔返回状态。
例子:真正的
NumberOfParameters
—可选模型参数个数
0
(默认)|非负整数
预测模型使用的可选模型参数数,自定义代价函数,自定义约束,被动函数,指定为非负整数。参数的数量包括这些函数使用的所有参数。例如,如果状态函数只使用参数p1
时,约束函数只使用形参p2
,代价函数只使用参数p3
,然后NumberOfParameters
是3.
.
例子: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”#
,在那里#
它的状态索引。
例子:“速度”
单位
-国家单位
""
(默认)| string |字符向量
状态单位,指定为字符串或字符向量。
例子:“米/秒”
ScaleFactor
-状态尺度因子
1
(默认)|正有限标量
状态尺度因子,指定为正的有限标量。一般情况下,使用运行范围的状态。指定适当的比例因子可以改善优化的数值调节。
例子:10
OutputVariables
- - - - - -输出变量信息、边界和比例因子
结构数组
的结构数组指定的输出变量(OV)信息、边界和比例因子Ny元素,Ny是输出变量的个数。要访问此属性,可以使用别名机汇
而不是OutputVariables
.
每个结构元素都有以下字段。
最小值
- OV下界
负
(默认)|标量|向量
OV的下界,指定为标量或向量。默认情况下,这个下界为负
.
若要在预测范围内使用相同的边界,请指定一个标量值。
随时间变化预测范围的范围k+1到时间k+p,指定到的向量p值。在这里,k当前时间和p是预测视界。如果你指定小于p值时,最终边界用于预测范围的其余步骤。
例子:(-10 8)
马克斯
- OV上限
正
(默认)|标量|向量
OV上限,指定为标量或向量。缺省情况下,该上限为+正
.
若要在预测范围内使用相同的边界,请指定一个标量值。
随时间变化预测范围的范围k+1到时间k+p,指定到的向量p值。在这里,k当前时间和p是预测视界。如果你指定小于p值时,最终边界用于预测范围的其余步骤。
例子:[12 10 8]
MinECR
- OV下界柔软度
1
(默认)|非负有限标量|向量
OV下界柔软性,其中较大的ECR值表示较软的约束,指定为非负的有限标量或向量。默认情况下,OV上界是软约束。
要在整个预测范围内使用相同的ECR值,请指定一个标量值。
在预测范围内随时间变化ECR值k+1到时间k+p,指定到的向量p值。在这里,k当前时间和p是预测视界。如果你指定小于p值时,最终的ECR值用于预测范围的其余步骤。
例子:[2 1 0.5]
MaxECR
- OV上限柔软度
1
(默认)|非负有限标量|向量
OV上限柔软性,其中较大的ECR值表示较软的约束,指定为非负的有限标量或向量。默认情况下,OV下界是软约束。
要在整个预测范围内使用相同的ECR值,请指定一个标量值。
在预测范围内随时间变化ECR值k+1到时间k+p,指定到的向量p值。在这里,k当前时间和p是预测视界。如果你指定小于p值时,最终的ECR值用于预测范围的其余步骤。
例子:[5 2 1]
的名字
- OV名称
字符串|字符向量
OV名称,指定为字符串或字符向量。OV的默认名称为“y”#
,在那里#
它的输出索引。
例子:“攻角”
单位
- OV单位
""
(默认)| string |字符向量
OV单位,指定为字符串或字符向量。
例子:“度”
ScaleFactor
- OV比例因子
1
(默认)|正有限标量
OV尺度因子,指定为正的有限标量。一般情况下,使用输出变量的操作范围。指定适当的比例因子可以改善优化的数值调节。
例子:90
ManipulatedVariables
- - - - - -操纵变量信息,边界和比例因子
结构数组
的结构数组指定的被操纵变量(MV)信息、边界和比例因子Nmv元素,Nmv是被操纵变量的数量。要访问此属性,可以使用别名MV
而不是ManipulatedVariables
.
每个结构元素都有以下字段。
最小值
- MV下界
负
(默认)|标量|向量
MV的下界,指定为标量或向量。默认情况下,这个下界为负
.
若要在预测范围内使用相同的边界,请指定一个标量值。
随时间变化预测范围的范围k时间k+p-1,指定一个到的向量p值。在这里,k当前时间和p是预测视界。如果你指定小于p值时,最终边界用于预测范围的其余步骤。
例子:(-1.1 - 1)
马克斯
- MV上限
正
(默认)|标量|向量
MV的上界,指定为标量或向量。缺省情况下,该上限为+正
.
若要在预测范围内使用相同的边界,请指定一个标量值。
随时间变化预测范围的范围k时间k+p-1,指定一个到的向量p值。在这里,k当前时间和p是预测视界。如果你指定小于p值时,最终边界用于预测范围的其余步骤。
例子:(1.2 - 1)
MinECR
- MV下界柔软度
0
(默认)|非负标量|向量
MV下界柔软性,其中较大的ECR值表示较软的约束,指定为非负标量或向量。默认情况下,MV下界是硬约束。
要在整个预测范围内使用相同的ECR值,请指定一个标量值。
在预测范围内随时间变化ECR值k时间k+p-1,指定一个到的向量p值。在这里,k当前时间和p是预测视界。如果你指定小于p值时,最终的ECR值用于预测范围的其余步骤。
例子:0.1 [0]
MaxECR
- MV上限
0
(默认)|非负标量|向量
MV上限柔软度,其中较大的ECR值表示较软的约束,指定为非负标量或向量。默认情况下,MV上界是硬约束。
要在整个预测范围内使用相同的ECR值,请指定一个标量值。
在预测范围内随时间变化ECR值k时间k+p-1,指定一个到的向量p值。在这里,k当前时间和p是预测视界。如果你指定小于p值时,最终的ECR值用于预测范围的其余步骤。
例子:(0.5 - 0.2)
杀鼠灵
- MV变化率下限
负
(默认)|非正标量|向量
MV变化率下限,用非正标量或向量表示。MV变化率定义为MV(k) - - -MV(k1),k是当前时间。默认情况下,这个下界为负
.
若要在预测范围内使用相同的边界,请指定一个标量值。
随时间变化预测范围的范围k时间k+p-1,指定一个到的向量p值。在这里,k当前时间和p是预测视界。如果你指定小于p值时,最终边界用于预测范围的其余步骤。
例子:(-50 -20)
RateMax
- MV变化率上限
正
(默认)|非负标量|向量
MV变化率的上限,指定为非负的标量或向量。MV变化率定义为MV(k) - - -MV(k1),k是当前时间。缺省情况下,该上限为+正
.
若要在预测范围内使用相同的边界,请指定一个标量值。
随时间变化预测范围的范围k时间k+p-1,指定一个到的向量p值。在这里,k当前时间和p是预测视界。如果你指定小于p值时,最终边界用于预测范围的其余步骤。
例子:50 [20]
RateMinECR
- MV变化率下限柔软度
0
(默认)|非负有限标量|向量
MV变化率下界柔软度,其中较大的ECR值表示较软的约束,指定为非负的有限标量或向量。默认情况下,MV变化率的下界是硬约束。
要在整个预测范围内使用相同的ECR值,请指定一个标量值。
在预测范围内随时间变化ECR值k时间k+p-1,指定一个到的向量p值。在这里,k当前时间和p是预测视界。如果你指定小于p值,最终的ECR值用于预测范围的其余步骤。
例子:0.1 [0]
RateMaxECR
- MV变化率上限柔软度
0
(默认)|非负有限标量|向量
MV变化率上限柔软性,其中较大的ECR值表示较软的约束,指定为非负的有限标量或向量。默认情况下,MV变化率上界是硬约束。
要在整个预测范围内使用相同的ECR值,请指定一个标量值。
在预测范围内随时间变化ECR值k时间k+p-1,指定一个到的向量p值。在这里,k当前时间和p是预测视界。如果你指定小于p值,最终的ECR值用于预测范围的其余步骤。
例子:[1 0.5 0.2]
的名字
- MV名称
字符串|字符向量
MV名称,指定为字符串或字符向量。默认MV名称为“u”#
,在那里#
是它的输入索引。
例子:“舵角”
单位
- MV单位
""
(默认)| string |字符向量
MV单位,指定为字符串或字符向量。
例子:“度”
ScaleFactor
- MV比例因子
1
(默认)|正有限标量
MV比例因子,指定为正的有限标量。一般情况下,使用被操纵变量的操作范围。指定适当的比例因子可以改善优化的数值调节。
例子:60
MeasuredDisturbances
- - - - - -测量的扰动信息和尺度因子
结构数组
测量扰动(MD)信息和比例因子,指定为具有的结构数组N医学博士元素,N医学博士是测量扰动的数量。如果你的模型没有测量到扰动,那么MeasuredDisturbances
是[]
.要访问此属性,可以使用别名医学博士
而不是MeasuredDisturbances
.
每个结构元素都有以下字段。
的名字
- MD名称
字符串|字符向量
MD名称,指定为字符串或字符向量。默认的MD名称为“u”#
,在那里#
是它的输入索引。
例子:“风速”
单位
- MD单位
""
(默认)| string |字符向量
MD单位,指定为字符串或字符向量。
例子:“米/秒”
ScaleFactor
- MD比例因子
1
(默认)|正有限标量
MD比例因子,指定为正的有限标量。一般情况下,使用扰动的工作范围。指定适当的比例因子可以改善优化的数值调节。
例子:10
权重
- - - - - -标准成本函数调优权重
结构
标准成本函数调优权重,指定为结构。控制器将这些权重应用于缩放的变量。因此,调优权重是无量纲值。
请注意
如果您使用优化。CustomCostFcn
并设置优化。ReplaceStandardCost
来真正的
,则控制器忽略权重调整的标准代价函数权重
.
权重
具有以下字段。
ManipulatedVariables
-操纵可变调优权重
行向量|数组
操纵的可变调优权重,用于惩罚偏离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)
ManipulatedVariablesRate
-操纵可变率调整权重
行向量|数组
操纵的可变速率调优权重,用于惩罚控制移动中的较大变化,指定为行向量或非负值数组。所有被操纵的可变利率的默认权重为0.1
.
若要在整个预测范围内使用相同的权重,请指定长度的行向量Nmv,在那里Nmv是被操纵变量的数量。
在预测范围内随时间变化调整权重k时间k+p-1,指定数组Nmv列和至p行。在这里,k当前时间和p是预测视界。每行包含一个预测水平步骤的操纵变量率调优权重。如果你指定小于p行,最后一行中的权重用于预测范围的其余步骤。
例子:(0.1 - 0.1)
OutputVariables
-输出可变调优权重
向量|数组
输出变量调优权重,用于惩罚与输出引用的偏差,指定为行向量或非负值数组。所有输出变量的默认权重为1
.
若要在整个预测范围内使用相同的权重,请指定长度的行向量Ny,在那里Ny是输出变量的个数。
在预测范围内随时间变化调整权重k+1到时间k+p,指定数组Ny列和至p行。在这里,k当前时间和p是预测视界。每行包含一个预测水平步的输出变量调优权重。如果你指定小于p行,最后一行中的权重用于预测范围的其余步骤。
例子:(0.1 - 0.1)
ECR
-松弛可变调重
1 e5
(默认)|正标量
松弛变量调优权重,指定为正标量。
例子:1 e4
优化
- - - - - -自定义优化函数和求解器
结构
自定义优化函数和求解器,指定为具有以下字段的结构。
CustomCostFcn
-自定义成本函数
[]
| string |字符向量|函数句柄
自定义代价函数,指定为下列之一:
当前工作文件夹或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
ReplaceStandardCost
—替换标准成本函数的选项
真正的
(默认)|假
将标准代价函数替换为自定义代价函数的选项,指定为以下之一:
真正的
—控制器在优化过程中仅使用自定义代价作为目标函数。在这种情况下,权重
控制器的属性被忽略。假
-控制器在优化过程中以标准成本和定制成本之和为目标函数。
如果没有指定自定义代价函数,则使用CustomCostFcn
,则控制器忽略RepalceStandardCost
.
有关更多信息,请参见指定非线性MPC的代价函数.
例子:真正的
CustomEqConFcn
-自定义等式约束函数
[]
(默认)| string |字符向量|函数句柄
自定义相等约束函数,指定为以下之一:
当前工作文件夹或MATLAB路径中的函数名称,指定为字符串或字符向量
优化。CustomEqConFcn =“myEqConFunction”;
当前工作文件夹或MATLAB路径中函数的句柄
优化。CustomEqConFcn = @myEqConFunction;
匿名函数
优化。CustomEqConFcn = @(X,U,数据,参数)myEqConFunction(X,U,数据,参数);
你的等式约束函数必须有签名:
函数ceq = myEqConFunction(X,U,数据,参数)
有关更多信息,请参见指定一般非线性MPC的约束条件.
例子:@eqFcn
CustomIneqConFcn
-自定义不等式约束函数
[]
(默认)| string |字符向量|函数句柄
自定义不等式约束函数,指定为以下之一:
当前工作文件夹或MATLAB路径中的函数名称,指定为字符串或字符向量
优化。CustomIneqConFcn =“myIneqConFunction”;
当前工作文件夹或MATLAB路径中函数的句柄
优化。CustomIneqConFcn = @myIneqConFunction;
匿名函数
优化。CustomIneqConFcn = @(X,U,e,数据,参数)myIneqConFunction(X,U,e,数据,params);
你的等式约束函数必须有签名:
函数cineq = myIneqConFunction(X,U,e,data,params)
有关更多信息,请参见指定一般非线性MPC的约束条件.
例子:@ineqFcn
CustomSolverFcn
-自定义非线性规划求解器
[]
(默认)| string |字符向量|函数句柄
自定义非线性编程求解器函数,指定为字符串、字符向量或函数句柄。如果没有“优化工具箱”软件,则必须指定自己的自定义非线性编程求解器。您可以通过以下方式之一指定自定义求解器函数:
当前工作文件夹或MATLAB路径中的函数名称,指定为字符串或字符向量
优化。CustomSolverFcn =“myNLPSolver”;
当前工作文件夹或MATLAB路径中函数的句柄
优化。CustomSolverFcn = @myNLPSolver;
有关更多信息,请参见非线性MPC优化求解器的配置.
例子:@mySolver
SolverOptions
-求解器选项
对象的选项。fmincon
|[]
的选项对象,指定为fmincon
或[]
.
如果您有“优化工具箱”软件,SolverOptions
控件的选项对象fmincon
解算器。
如果没有“优化工具箱”,SolverOptions
是[]
.
有关更多信息,请参见非线性MPC优化求解器的配置.
RunAsLinearMPC
-选项模拟为线性控制器
“关闭”
(默认)|“自适应”
|“TimeVarying”
作为线性控制器进行模拟的选项,指定为以下之一:
使用任何一种“自适应”
或“TimeVarying”
选项,您的控制器必须没有自定义约束和自定义代价函数。
有关将非线性MPC控制器模拟为线性控制器的示例,请参见基于非线性MPC的加料间歇反应器优化控制.
例子:“自适应”
UseSuboptimalSolution
-接受次优解决方案的选项
假
(默认)|真正的
选项,用于接受次优解决方案,指定为逻辑值。当非线性规划求解器达到最大迭代次数而没有找到解决方案时(退出标志为0
),控制器:
如果冻结MV值
UseSuboptimalSolution
是假
应用求解器在最后迭代后发现的次优解,如果
UseSuboptimalSolution
是真正的
要指定最大迭代次数,请使用Optimization.SolverOptions.MaxIter
.
例子:真正的
MVInterpolationOrder
线性插值顺序用于块移动
0
(默认)|1
块移动使用的线性插值顺序,指定为以下之一:
0
-使用分段常量操纵变量间隔。1
-使用分段线性操纵变量区间。
如果控制层是标量,则控制器忽略MVInterpolationOrder
.
有关操纵变量阻塞的更多信息,请参见操纵变量阻塞.
例子:1
雅可比矩阵
- - - - - -模型函数的雅可比矩阵,以及自定义代价函数和约束函数
结构
模型函数、自定义代价函数和约束函数的雅可比矩阵,指定为结构。作为最佳实践,只要可用就使用雅可比矩阵,因为它们可以提高优化效率。如果你没有为给定的函数指定雅可比矩阵,非线性规划求解器必须数值计算雅可比矩阵。
的雅可比矩阵
结构包含以下字段。
StateFcn
-状态函数的雅可比矩阵
[]
(默认)| string |字符向量|函数句柄
状态函数的雅可比矩阵z
从模型。StateFcn
,指定为下列之一
当前工作文件夹或MATLAB路径中的函数名称,指定为字符串或字符向量
模型。StateFcn =“myStateJacobian”;
当前工作文件夹或MATLAB路径中函数的句柄
模型。StateFcn = @myStateJacobian;
匿名函数
模型。mystate雅可比矩阵(x,u,params)
有关更多信息,请参见为非线性MPC指定预测模型.
例子:@Afcn
OutputFcn
-输出函数的雅可比矩阵
[]
(默认)| string |字符向量|函数句柄
输出函数的雅可比矩阵y
从模型。OutputFcn
,指定为以下其中之一:
当前工作文件夹或MATLAB路径中的函数名称,指定为字符串或字符向量
模型。StateFcn =“myOutputJacobian”;
当前工作文件夹或MATLAB路径中函数的句柄
模型。StateFcn = @myOutputJacobian;
匿名函数
模型。myoutput雅可比矩阵(x,u,params)
有关更多信息,请参见为非线性MPC指定预测模型.
例子:@Cfcn
CustomCostFcn
-定制成本函数的雅可比矩阵
[]
| string |字符向量|函数句柄
定制成本函数的雅可比矩阵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
-自定义等式约束的雅可比矩阵
[]
(默认)| string |字符向量|函数句柄
自定义等式约束的雅可比矩阵量表信
从优化。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
CustomIneqConFcn
-自定义不等式约束的雅可比矩阵
[]
(默认)| string |字符向量|函数句柄
自定义不等式约束的雅可比矩阵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为输出无源性指标,νu为输入被动度指标,up(x,u)被动输入函数,和yp(x,u)为被动输出函数。的变量x而且u是预测模型的当前状态和输入。
假设植物相对于输入-输出对已经是被动的up而且yp,如果这两个不等式被验证,那么(在温和条件下)所得到的闭环系统随着时间的推移趋于耗散能量,因此具有稳定的平衡。有关被动式的更多信息,请参阅指定一般非线性MPC的约束条件在线性系统中,关于被动性和被动性指数.有关示例,请参见基于无源非线性MPC的四油箱控制而且基于无源非线性MPC的机械手控制.
EnforceConstraint
-强制约束选项
假
(默认)|真正的
选项来强制约束,指定为下列之一:
真正的
-在优化过程中强制执行被动约束。在这种情况下,必须指定OutputFcn
而且InputFcn
属性。假
-在优化过程中不会强制执行被动约束。
例子:真正的
OutputPassivityIndex
-控制器所需的输出无源指数
0.1
(默认)|非负标量
控制器的期望输出无源指数,指定为非负标量。
如果被动。EnforceConstraint
是真正的
,优化算法在每一步都试图强制被动不等式约束,这涉及到被动指数νy中指定的被动。OututPassivityIndex
.
例子:1
InputPassivityIndex
-控制器所需的输入无源性指标
0
(默认)|非负标量
控制器的期望输出无源指数,指定为非负标量。
如果被动。EnforceConstraint
是真正的
,优化算法在每一步都试图强制被动不等式约束,这涉及到被动指数νu中指定的被动。InputPassivityIndex
.
例子:1
OutputFcn
-无源输出功能
[]
(默认)| string |字符向量|函数句柄
被动输出函数,指定为字符串、字符向量或函数句柄。
如果被动。EnforceConstraint
是真正的
然后,优化算法在每一步都试图强制输入和输出不等式约束,这涉及到函数yp(x,u)中指定的被动。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
InputFcn
-无源输入功能
字符串|字符向量|函数句柄
被动输出函数,指定为字符串、字符向量或函数句柄。如果被动。EnforceConstraint
是真正的
然后,优化算法在每一步都试图强制输入和输出不等式约束,这涉及到函数up(x,u)中指定的被动。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
OutputJacobianFcn
-被动输出函数的雅可比矩阵
[]
(默认)| string |字符向量|函数句柄
无源输出函数的雅可比矩阵被动。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
InputJacobianFcn
-被动输入函数的雅可比矩阵
[]
(默认)| string |字符向量|函数句柄
被动输入函数的雅可比矩阵被动。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
UsePredictedState
-选项使用预测或当前状态
真正的
(默认)|假
使用预测或当前状态的选项,指定为以下之一:
真正的
- - - - - -x (k + 1)是优化问题中的一个决策变量。假
- - - - - -x [k]是优化问题中的一个决策变量。
例子:真正的
对象的功能
nlmpcmove |
计算非线性MPC控制器的最优控制动作 |
validateFcns |
的预测模型和自定义函数nlmpc 或nlmpcMultistage 潜在问题的对象 |
convertToMPC |
转换nlmpc 对象转换为一个或多个对象货币政策委员会 对象 |
createParameterBus |
创建金宝app配置总线创建器块,用于将模型参数传递给非线性MPC控制器块 |
例子
用离散预测模型创建非线性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控制器与实测和未测扰动
创建一个具有三种状态、一个输出和四个输入的非线性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预测模型和自定义函数
创建六状态,六输出,四输入的非线性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控制器创建线性MPC控制器
创建一个具有四个状态、一个输出变量、一个操纵变量和一个测量扰动的非线性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规划最优弹道
创建一个具有六种状态、六种输出和四种输入的非线性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
用非线性MPC控制器模拟闭环控制
创建一个具有四个状态、两个输出和一个输入的非线性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
秒。在每个控制区间内:
使用当前的测量来修正先前的预测。
计算最优控制招式
nlmpcmove
.此函数返回中计算的最佳序列nloptions
.将更新后的选项对象传递给nlmpcmove
在下一个控制区间提供最优序列的初始猜测。预测模型状态。
将第一个计算出的最优控制移动应用于对象,更新对象状态。
生成带有白噪声的传感器数据。
保存植物状态。
持续时间= 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”)标题(“摆速度”)
版本历史
在R2018b中引入
Abrir比如
Tiene una versión modificada de este ejemplo。¿Desea abrir este ejemplo con sus modificaciones?
MATLAB突击队
Ha hecho clic en unenlace que对应一个este commando de MATLAB:
弹射突击队introduciéndolo en la ventana de commandos de MATLAB。Los navegadores web no permission comandos de MATLAB。
您也可以从以下列表中选择一个网站:
如何获得最佳的网站性能
选择中国站点(中文或英文)以获得最佳站点性能。其他MathWorks国家站点没有针对您所在位置的访问进行优化。