使用代码生成支持计算非线性MPC控制移动万博1manbetx
[
计算最优的非线性MPC控制移动,并支持代码生成以部署到实时目标。万博1manbetx控制移动使用当前预测模型状态(mv
那newOnlineData
) = nlmpcmoveCodeGeneration (coreData
那X
那lastMV
那onlinedata.
)X
),则控制从上一个控制间隔(lastMV
),以及输入数据结构(coreData
和nlOnlineData
)生成的使用getCodeGenerationData
.
nlmpcmoveCodeGeneration
不检查输入参数以获得正确的尺寸和数据类型。
[___那
返回有关优化结果的其他信息,包括迭代次数和目标函数成本。信息
) = nlmpcmoveCodeGeneration (___)
创建一个具有四个状态,两个输出和一个输入的非线性MPC控制器。
nlobj = nlmpc (4 2 1);
在标准代价函数中,默认情况下对一个或多个OVs应用零权,因为mv比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;params = {Ts};
指定模型的输出函数,将样本时间参数作为输入参数传递。
nlobj.Model.OutputFcn =“pendulumoutputfcn”;
为控制器定义标准约束。
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,[],params);
model.statefcn是好的。model.outputfcn是好的。分析用户提供的模型,成本和约束函数完成。
只有两个植物状态是可衡量的。因此,创建一个扩展的卡尔曼滤波器,用于估计四个工厂状态。它的状态转换功能是定义的pendulumStateFcn.m
其测量功能定义为pendulumMeasurementFcn.m
.
EKF = extendedKalmanFilter (@pendulumStateFcn @pendulumMeasurementFcn);
定义仿真的初始条件,初始化扩展卡尔曼滤波状态,并指定初始操纵变量值为零。
x0 =[0, 0, -π;0];x0 y0 = (x0 (1); (3)];卡尔曼滤波器。状态= x0;mv0 = 0;
为控制器创建代码生成数据结构,指定初始条件和参数。
[coreData, onlineData] = getCodeGenerationData (nlobj, x0、mv0 params);
在在线数据结构中指定输出参考值。
onlineData。裁判= [0 0];
为了验证控制器的运行,运行一个模拟10
秒。在每个控制间隔期间:
使用当前的测量值修正先前的预测。
计算最优控制移动使用nlmpcmoveCodeGeneration
.这个函数返回计算得到的最佳序列onlinedata.
.将更新后的数据结构传递给nlmpcmoveCodeGeneration
在下一个控制区间中提供最优序列的初始猜测。
预测模型状态。
将第一个计算的最佳控制移动到工厂,更新植物状态。
产生带有白噪声的传感器数据。
拯救植物状态。
mv = mv0;y = y0;x = x0;时间= 10;xHistory = x0;为CT = 1 :(持续时间/ TS)正确的先前预测xk =正确(卡尔曼滤波器,y);%计算最优控制移动[mv, onlineData] = nlmpcmoveCodeGeneration (coreData xk, mv, onlineData);% Predict下一次迭代的预测模型状态预测(卡尔曼滤波器,[mv;Ts]);%实施第一最佳控制移动x = pendulumDT0 (x, mv, Ts);%生成传感器数据Y = X([1 3])+ RANDN(2,1)* 0.01;%保存植物状态xHistory = [xHistory x];结束
用MATLAB®Coder™生成一个MEX函数,指定coreData
是一个常数。
func =“nlmpcmoveCodeGeneration”;funcOutput =“nlmpcmoveMEX”;Cfg = coder.config ('mex');cfg.dynamicmemoryallocation =.“关闭”;codegen (“配置”,cfg,func,“o”funcOutput,'-args'那...{coder.Constant (coreData), xk, mv, onlineData});
代码生成成功。
coreData
-非线性MPC配置参数在运行时恒定的非线性MPC配置参数,指定为使用的结构getCodeGenerationData
.
X
-当前预测模型状态当前预测模型状态,指定为长度向量NX,在那里NX为预测模型的状态数。中定义了预测模型状态函数nlobj.Model.StateFcn
.
由于非线性MPC控制器不执行状态估计,因此必须在每个控制间隔处测量或估计当前预测模型状态。有关非线性MPC预测模型的更多信息,请参阅为非线性MPC指定预测模型.
lastMV
-在以前的控制间隔内,设备中使用的控制信号在以前的控制间隔内,设备中使用的控制信号,指定为长度的列向量Nmv,在那里Nmv为被操纵变量的个数。
笔记
指定lastMV
随着操纵变量信号在先前的控制间隔中施加到工厂。通常,这些信号是由控制器生成的值(mv
).然而,情况并非总是如此。例如,如果您的控制器离线并运行在跟踪模式;即控制器输出不驱动被控对象,然后将实际控制信号馈电给被控对象last_mv
当控制器在线切换后,可以帮助实现无闷吸的转移。
onlinedata.
-在线控制器数据必须在运行时更新的在线控制器数据,指定为具有以下字段的结构。使用。生成初始结构getCodeGenerationData
.有些结构字段不是必需的,这取决于控制器的配置以及在运行时变化的权重或约束。
裁判
-输出参考值植物输出参考值,指定为长度的行向量Ny或一个阵列Ny列,Ny为输出变量的个数。
要在整个预测范围内使用相同的参考值,请指定行向量。
从时间从预测地平线上变化参考值K.+ 1,K.+P.,指定最多的数组P.行。这里,K.是当前的时间和P.是预测视界。每一行包含一个预测水平步骤的参考值。如果指定小于P.行,最后一行中的值用于预测视界的其余步骤。
如果控制器的成本函数不使用裁判
,离开裁判
默认值。
mvTarget
-操纵变量目标被操纵的变量目标,指定为长度的行向量Nmv或一个阵列Nmv列,Nmv为被操纵变量的个数。
要在整个预测范围内使用相同的操纵变量目标,请指定行向量。
随着时间的推移,在预测视界(预览)范围内改变目标K.时间K.+P.-1,指定一个数组P.行。这里,K.是当前的时间和P.是预测视界。每一行包含一个预测水平步骤的目标。如果指定小于P.行,最终目标用于预测视界的其余步骤。
如果控制器的成本函数不使用mvTarget
,离开mvTarget
默认值。
X0
-最优状态解的初始猜测万博 尤文图斯最佳状态解决方案的初始猜测,指定为长度的行矢量万博 尤文图斯NX或一个阵列NX列,NX是状态数。
要在预测地平线上使用相同的初始猜测,请指定行向量。
在不同时间的预测范围内改变最初的猜测K.+ 1,K.+P.,指定最多的数组P.行。这里,K.是当前的时间和P.是预测视界。每一行包含一个预测水平步骤的初始猜测。如果指定小于P.行,最终猜测用于预测地平线的其余步骤。
通常,在闭环模拟期间,您不需要指定X0
你自己。相反,当调用nlmpcmoveCodeGeneration
,返回newOnlineData
参数,其中包含已更新的X0
估计。你就可以通过了newOnlineData
在onlinedata.
输入参数nlmpcmoveCodeGeneration
为下一个控制间隔。
MV0
-最优操纵变量解的初始猜测万博 尤文图斯最优操纵变量解的初始猜测,指定为长度的行向量万博 尤文图斯Nmv或一个阵列Nmv列,Nmv为被操纵变量的个数。
要在预测地平线上使用相同的初始猜测,请指定行向量。
在不同时间的预测范围内改变最初的猜测K.时间K.+P.-1,指定一个数组P.行。这里,K.是当前的时间和P.是预测视界。每一行包含一个预测水平步骤的初始猜测。如果指定小于P.行,最终猜测用于预测地平线的其余步骤。
通常,在闭环模拟期间,您不需要指定MV0
你自己。相反,当调用nlmpcmoveCodeGeneration
,返回newOnlineData
参数,其中包含已更新的MV0
估计。你就可以通过了newOnlineData
在onlinedata.
输入参数nlmpcmoveCodeGeneration
为下一个控制间隔。
Slack0
-松弛变量在解处的初始猜测松弛变量在解处的初始猜想,指定为非负标量。
通常,在闭环模拟期间,您不需要指定Slack0
你自己。相反,当调用nlmpcmoveCodeGeneration
,返回newOnlineData
参数,其中包含已更新的Slack0
估计。你就可以通过了newOnlineData
在onlinedata.
输入参数nlmpcmoveCodeGeneration
为下一个控制间隔。
医学博士
-测量的扰动值测量的扰动值,指定为长度的行向量N医学博士或一个阵列N医学博士列,N医学博士是测量障碍的数量。如果您的控制器有衡量的干扰,则必须指定医学博士
.如果控制器没有可测量的扰动,那么getCodeGenerationData
省略了这一领域。
要在整个预测视界使用相同的扰动值,请指定行向量。
从时间从预测地平线上变化干扰值K.时间K.+P.,指定最多的数组P.+ 1行。这里,K.是当前的时间和P.是预测视界。每一行包含一个预测视界步长的扰动值。如果指定小于P.行,最后一行中的值用于预测视界的其余步骤。
参数
——参数值的预测模型、自定义成本函数和自定义约束使用的参数值,指定为长度等于的单元格向量Model.numberof Parameters.
属性。如果控制器没有参数,则getCodeGenerationData
省略了这一领域。
参数的顺序必须符合为预测模型、自定义成本函数和自定义约束定义的顺序。
OutputWeights
—输出可变调优权重在运行时替换默认调优权重的输出变量调优权重,指定为长度的行向量Ny或一个阵列Ny列,Ny为输出变量的个数。如果您希望输出变量权重在运行时发生变化,则必须在调用时将此字段添加到在线数据结构中getCodeGenerationData
.
要在整个预测范围内使用相同的权重,请指定行向量。
根据时间改变预测视界上的权重K.+ 1,K.+P.,指定最多的数组P.行。这里,K.是当前的时间和P.是预测视界。每一行包含一个预测水平步骤的权重。如果指定小于P.行,最终权重用于预测范围的其余步骤。
MVWeights
-操纵变量调优权重操纵可变调谐重量,可在运行时更换默认调谐权重,指定为长度的行向量Nmv或一个阵列Nmv列,Nmv为被操纵变量的个数。如果您希望在运行时进行操纵的可变权重,则必须在通话时将此字段添加到在线数据结构getCodeGenerationData
.
要在整个预测范围内使用相同的权重,请指定行向量。
根据时间改变预测视界上的权重K.+ 1,K.+P.,指定最多的数组P.行。这里,K.是当前的时间和P.是预测视界。每一行包含一个预测水平步骤的权重。如果指定小于P.行,最终权重用于预测范围的其余步骤。
MVRateWeights
-操纵可变率调优权重在运行时替换默认调优权重的操纵可变速率调优权重,指定为长度的行向量Nmv或一个阵列Nmv列,Nmv为被操纵变量的个数。如果您希望操作的可变速率重量在运行时会有所不同,则必须在致电时将此字段添加到在线数据结构中getCodeGenerationData
.
要在整个预测范围内使用相同的权重,请指定行向量。
根据时间改变预测视界上的权重K.+ 1,K.+P.,指定最多的数组P.行。这里,K.是当前的时间和P.是预测视界。每一行包含一个预测水平步骤的权重。如果指定小于P.行,最终权重用于预测范围的其余步骤。
ECRWeight
-松弛可变调优权重松弛可变率调优权重,它在运行时替换默认调优权重,指定为正标量。如果希望松弛变量权重在运行时发生变化,则必须在调用时将此字段添加到在线数据结构中getCodeGenerationData
.
outputmin.
—输出变量下界在运行时替换默认下界的输出变量下界,指定为长度的行向量Ny或一个阵列Ny列,Ny为输出变量的个数。如果您希望输出变量下界在运行时发生变化,则必须在调用时将此字段添加到在线数据结构中getCodeGenerationData
.
要在整个预测视界中使用相同的边界,请指定行向量。
根据时间改变预测范围K.+ 1,K.+P.,指定最多的数组P.行。这里,K.是当前的时间和P.是预测视界。每一行包含一个预测视界步骤的边界。如果指定小于P.行,最后的边界用于预测视界的其余步骤。
OutputMax
—输出变量上界输出变量上界,在运行时替换默认上界,指定为长度的行向量Ny或一个阵列Ny列,Ny为输出变量的个数。如果希望输出变量上界在运行时发生变化,则必须在调用时将此字段添加到在线数据结构中getCodeGenerationData
.
要在整个预测视界中使用相同的边界,请指定行向量。
根据时间改变预测范围K.+ 1,K.+P.,指定最多的数组P.行。这里,K.是当前的时间和P.是预测视界。每一行包含一个预测视界步骤的边界。如果指定小于P.行,最后的边界用于预测视界的其余步骤。
StateMin
-状态下界状态下界,在运行时替换默认下界,指定为长度的行向量NX或一个阵列NX列,NX是状态数。如果希望状态下界在运行时发生变化,则必须在调用时将此字段添加到在线数据结构中getCodeGenerationData
.
要在整个预测视界中使用相同的边界,请指定行向量。
根据时间改变预测范围K.+ 1,K.+P.,指定最多的数组P.行。这里,K.是当前的时间和P.是预测视界。每一行包含一个预测视界步骤的边界。如果指定小于P.行,最后的边界用于预测视界的其余步骤。
StateMax
-状态上界状态上界,在运行时替换默认上界,指定为长度的行向量NX或一个阵列NX列,NX是状态数。如果希望状态上界在运行时发生变化,则必须在调用时将此字段添加到在线数据结构中getCodeGenerationData
.
要在整个预测视界中使用相同的边界,请指定行向量。
根据时间改变预测范围K.+ 1,K.+P.,指定最多的数组P.行。这里,K.是当前的时间和P.是预测视界。每一行包含一个预测视界步骤的边界。如果指定小于P.行,最后的边界用于预测视界的其余步骤。
MVMin
-操纵变量下界操纵可变的可变下限,替换运行时的默认下限,指定为长度的行向量Nmv或一个阵列Nmv列,Nmv为被操纵变量的个数。如果希望操纵变量的下界在运行时发生变化,则必须在调用时将此字段添加到在线数据结构中getCodeGenerationData
.
要在整个预测视界中使用相同的边界,请指定行向量。
根据时间改变预测范围K.+ 1,K.+P.,指定最多的数组P.行。这里,K.是当前的时间和P.是预测视界。每一行包含一个预测视界步骤的边界。如果指定小于P.行,最后的边界用于预测视界的其余步骤。
MVMax
-操纵变量上界操纵可变的上限,替换运行时的默认上限,指定为长度的行矢量Nmv或一个阵列Nmv列,Nmv为被操纵变量的个数。如果希望操纵变量的上界在运行时发生变化,则必须在调用时将此字段添加到在线数据结构中getCodeGenerationData
.
要在整个预测视界中使用相同的边界,请指定行向量。
根据时间改变预测范围K.+ 1,K.+P.,指定最多的数组P.行。这里,K.是当前的时间和P.是预测视界。每一行包含一个预测视界步骤的边界。如果指定小于P.行,最后的边界用于预测视界的其余步骤。
MVRateMin
-操纵可变利率下界在运行时替换默认下界的操纵变量速率下界,指定为长度的行向量Nmv或一个阵列Nmv列,Nmv为被操纵变量的个数。如果您希望操纵的可变速率下限在运行时发生变化,则必须在调用时将此字段添加到在线数据结构中getCodeGenerationData
.
要在整个预测视界中使用相同的边界,请指定行向量。
根据时间改变预测范围K.+ 1,K.+P.,指定最多的数组P.行。这里,K.是当前的时间和P.是预测视界。每一行包含一个预测视界步骤的边界。如果指定小于P.行,最后的边界用于预测视界的其余步骤。
MVRateMax
-操纵可变利率上限在运行时替换默认上限的操纵变量速率上限,指定为长度的行向量Nmv或一个阵列Nmv列,Nmv为被操纵变量的个数。如果希望操纵的可变速率上限在运行时发生变化,则必须在调用时将此字段添加到在线数据结构中getCodeGenerationData
.
要在整个预测视界中使用相同的边界,请指定行向量。
根据时间改变预测范围K.+ 1,K.+P.,指定最多的数组P.行。这里,K.是当前的时间和P.是预测视界。每一行包含一个预测视界步骤的边界。如果指定小于P.行,最后的边界用于预测视界的其余步骤。
mv
-最优操纵变量控制动作最优操纵变量控制动作,返回为长度的列向量Nmv,在那里Nmv为被操纵变量的个数。
如果求解器会聚到局部最佳解决方案(信息。ExitFlag.
是积极的),然后呢mv
包含最优解。
如果求解器达到最大迭代次数,找到可行次最优解(信息。ExitFlag = 0
):
coredata.usesuboptimalsolution
是真正的
, 然后mv
包含次优解
coredata.usesuboptimalsolution
是假
, 然后mv
包含lastMV
如果求解器无法找到可行的解决方案(信息。ExitFlag.
是负的),然后呢mv
包含lastMV
.
newOnlineData
- 更新了在线控制器数据更新在线控制器数据,作为结构返回。这个结构和onlinedata.
,除了决策变量初始猜测(X0
那MV0
,Slack0
)更新。
对于随后的控制间隔,温暖的开始通过修改在线数据,求解器newOnlineData
并将更新的结构传递给nlmpcmoveCodeGeneration
作为onlinedata.
.这样做允许求解器使用判定变量初始猜测作为其解决方案的起点。
信息
- 解决方案细节解决方案详细信息,作为具有以下字段的结构返回。
mvopt.
-最优操纵变量序列最佳操纵变量序列,返回为a(P.+ 1)——-Nmv数组,P.预测的范围是和吗Nmv为被操纵变量的个数。
MVopt(我,:)
包含每次计算的最优操纵变量值k +张
, 为了我= 1,…,p
,在那里K.
为当前时间。mvopt(1,:)
包含与输出参数相同的操纵变量值mv
.由于控制器不计算最优控制移动时刻k + p
那: MVopt (p + 1)
等于MVopt (p,:)
.
Xopt
-最优预测模型状态序列最优预测模型状态序列,返回为(P.+ 1)——-NX数组,P.预测的范围是和吗NX为预测模型中的状态数。
Xopt(我,:)
包含时刻的计算状态值k +张
, 为了我= 2,…,p + 1
,在那里K.
为当前时间。: Xopt (1)
是否与当前状态相同X
.
Yopt
-最优输出可变序列最优输出变量序列,返回为P.+ 1)——-Ny数组,P.预测的范围是和吗Ny为输出数。
Yopt(我,:)
在时间包含计算的输出值k +张
, 为了我= 2,…,p + 1
,在那里K.
为当前时间。Yopt(1,:)
是基于当前状态计算的X
测量到的电流会干扰医学博士
,如果任何。
Topt
-预测水平时间序列预测水平时间序列,返回为长度的列向量P.+ 1,P.是预测视界。Topt
包含时间序列K.时间K.+P.,在那里K.为当前时间。
Topt (1)
= 0表示当前时间。随后的时间步长Topt(我)
是Ts *(张)
,在那里Ts
为控制器采样时间。
使用Topt
当策划mvopt.
那Xopt
,或Yopt
序列。
松弛
- 在最佳状态下松弛变量最优松弛变量ε用于约束软化,返回为非负标量值。
ε = 0 -在整个预测视界内,所有软约束均得到满足。
ε > 0 -至少违反了一个软约束。当违反多个约束时,ε表示最坏情况的软约束违反(根据每个约束的ECR值进行缩放)。
ExitFlag.
-优化退出代码优化退出代码,返回如下内容之一:
正整数-找到最优解
0.
-最大迭代次数后找到的可行次最优解
负整数 - 找不到可行的解决方案
迭代
-迭代次数求解器使用的迭代次数,返回为正整数。
成本
- 目标函数成本目标函数代价,作为非负标量值返回。成本量化了控制人员实现其目标的程度。
成本值只有在ExitFlag.
是非负面的。
使用注意事项及限制:
nlmpcmoveCodeGeneration
万博1manbetx支持仅为使用默认值的非线性MPC控制器生成代码fmincon
具有SQP算法的求解器。但是,您可以使用其他模拟控制器fmincon
算法。
当用于代码生成时,非线性MPC控制器不支持预测模型,定制成本函数或自定义约束函数的匿名函数。万博1manbetx然而,nlmpcmoveCodeGeneration
仍然可以模拟使用匿名函数的控制器。
您的自定义函数必须在MATLAB上®路径与Matlab Coder™.有关检查兼容性的更多信息,请参见使用代码生成准备工具检查代码(MATLAB编码器).
非线性MPC控制器的代码生成只支持双精度数据。万博1manbetx
为了生成用于计算非线性MPC控制器的最佳控制的代码:
从非线性MPC控制器生成数据结构使用getCodeGenerationData
.
为了验证你的控制器产生了预期的闭环结果,使用nlmpcmoveCodeGeneration
代替nlmpcmove.
.
生成的代码nlmpcmoveCodeGeneration
使用codegen
(MATLAB编码器).这一步要求MATLAB编码器软件
你点击一个链接对应于这个MATLAB命令:
通过在MATLAB命令窗口中输入命令来运行命令。Web浏览器不支持MATLAB命令。万博1manbetx
你也可以从以下列表中选择一个网站:
选择中国网站(以中文或英文)以获取最佳网站性能。其他MathWorks国家网站未优化您的位置。