文件帮助中心文件
建立MEX文件,解决一个(通用或多级)非线性MPC控制问题
mexFcn = buildMEX (nlobj mexName、coreData onlineData)
mexFcn = buildMEX(nlobj,mexName,coreData,onlineData,mexConfig)
例子
mexFcn= buildMEX (nlobj那mexName那coreData那onlineData)建立一个MEX文件,解决非线性MPC控制问题比nlmpcmove.该MEX文件是在当前工作文件夹中创建。
mexFcn= buildMEX (nlobj那mexName那coreData那onlineData)
mexFcn
nlobj
mexName
coreData
onlineData
nlmpcmove
mexFcn= buildMEX (nlobj那mexName那coreData那onlineData那mexConfig)生成使用所述码生成配置对象一个MEX函数mexConfig.使用此语法自定义MEX代码生成。
mexFcn= buildMEX (nlobj那mexName那coreData那onlineData那mexConfig)
mexConfig
全部折叠
这个示例使用:
创建一个具有四个状态,两个输出和一个输入的非线性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使用多步前推欧拉法。
pendulumDT0.m
pendulumCT0.m
nlobj.Model.StateFcn =“pendulumDT0”;nlobj.Model.IsContinuousTime = FALSE;
预测模型使用的可选参数TS来表示采样时间。指定的参数的数量,并创建一个参数矢量。
TS
nlobj.Model.NumberOfParameters = 1;params = {Ts};
指定模型的输出函数,将样本时间参数作为输入参数传递。
nlobj.Model.OutputFcn =“pendulumOutputFcn”;
定义为控制器标准约束。
nlobj.Weights.OutputVariables = [3 3];nlobj.Weights.ManipulatedVariablesRate = 0.1;nlobj.OV(1).Min = -10;nlobj.OV(1)最大= 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是OK。Model.OutputFcn是OK。用户提供的模型,成本和约束函数的分析完成。
只有两个工厂的状态是可测量的。因此,用于估计四种植物状态创建扩展卡尔曼滤波器。其状态转换函数定义在pendulumStateFcn.m和它的测量功能中所定义pendulumMeasurementFcn.m.
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。Ref = [0 0];
构建MEX函数求解非线性MPC控制问题。该MEX函数是在当前工作目录中创建。
mexFcn = buildMEX (nlobj,“myController的”、coreData onlineData);
从非线性MPC生成MEX函数“myController”,加速仿真。代码生成成功。成功生成MEX函数“myController”。
运行下面的模拟10.秒。在每个控制间隔期间:
10.
使用当前的测量值修正先前的预测。
计算最优控制移动使用MEX函数。该函数返回所计算的最佳序列中onlineData.在下一个控制区间将更新的数据结构传递给MEX函数可以提供对最优序列的初始猜测。
预测模型状态。
应用首先计算最优控制转移到工厂,更新设备的状态。
产生带有白噪声的传感器数据。
拯救植物状态。
MV = MV0;Y = Y0;X = X0;持续时间= 10;xHistory = X0;为了CT = 1:(持续时间/ Ts)的%正确先前预测xk =正确(卡尔曼滤波器,y);%计算最优控制移动[MV,onlineData] = myController的(XK,MV,onlineData);% Predict下一次迭代的预测模型状态预测(卡尔曼滤波器,[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”)标题(“车位置”) subplot(2,2,2) plot(0:Ts:Duration,xHistory(2,:))'时间') ylabel ('zdot')标题(“车速度”)子plot(0,2,3) plot(0:Ts:Duration,xHistory(3,:))'时间') ylabel (“θ”)标题(“摆角”)副区(2,2,4)情节(0:TS:持续时间,xHistory(4,:))xlabel('时间') ylabel ('thetadot')标题(“摆速度”)
nlmpc
nlmpcMultistage
非线性模型预测控制器,指定为nlmpc或nlmpcMultistage对象。
你的控制器必须使用默认fmincon用SQP算法求解。此外,您的控制器不能为其预测模型、自定义成本函数或自定义约束函数使用匿名函数。
fmincon
MEX函数名,指定为字符串或字符向量。
非线性MPC配置参数是在运行时间常数,指定为使用所生成的一个结构getCodeGenerationData.
getCodeGenerationData
初始在线控制器数据,指定为结构生成使用getCodeGenerationData.的字段设置的详细信息onlineData, 看nlmpcmoveCodeGeneration.
nlmpcmoveCodeGeneration
MexCodeConfig
代码生成配置对象,指定为MexCodeConfig对象。
要创建配置对象,请使用以下代码。
mexConfig = coder.config ('MEX');
要自定义MEX代码生成,请修改此对象的设置。例如,要在调试期间检测运行时内存访问冲突,请设置IntegrityChecks到真正的.
IntegrityChecks
真正的
mexConfig。IntegrityChecks = true;
默认情况下,要提高生成代码的性能,可以进行诸如IntegrityChecks和ResponsivenessChecks被禁用的buildMEX.
ResponsivenessChecks
buildMEX
buildMEX用指定的值覆盖以下配置设置。
cfg。DynamicMemoryAllocation
'AllVariableSizeArrays'
cfg.ConstantInputs
'消除'
生成的MEX函数,作为函数句柄返回。这个MEX函数具有以下签名。
(mv, newOnlineData信息)= mexFcn (x, lastMV onlineData)
MEX函数有以下输入参数,它们与对应的输入参数相同nlmpcmoveCodeGeneration.
X
当前预测模型状态,指定为长度向量N.X,在那里N.X为预测模型的状态数。
lastMV
在先前控制时间间隔植物中使用的控制信号,指定为长度的矢量N.mv,在那里N.mv是操纵变量的数量。
MEX函数有以下输出参数,它们与的输出参数相同nlmpcmoveCodeGeneration.
mv
最优操纵变量控制动作,返回为长度的列向量N.mv,在那里N.mv是操纵变量的数量。
newOnlineData
更新在线控制器数据,作为结构返回。这个结构和onlineData,只是更新了决策变量的初始猜测。
信息
为了模拟使用所生成的MEX功能的控制器,使用初始在线数据结构onlineData第一控制间隔。对于后续的控制区间,修改在线数据newOnlineData并通过更新结构到MEX功能onlineData.
nlmpc|nlmpcmove|nlmpcmoveCodeGeneration|getCodeGenerationData
您有这个示例的修改版本。您想打开这个示例与您的编辑吗?
您单击了与此MATLAB命令对应的链接:
通过在MATLAB命令窗口中输入命令来运行命令。Web浏览器不支持MATLAB命令。万博1manbetx
选择一个网站,以便在可用的地方进行翻译的内容,并查看本地活动和优惠。根据您的位置,我们建议您选择:.
你也可以从以下列表中选择一个网站:
选择中国网站(以中文或英文)以获取最佳网站性能。其他MathWorks国家网站未优化您的位置。
与当地办事处联系