主要内容

使用自定义QP解算器模拟并生成MPC控制器的代码

此示例显示如何为使用自定义二次规划(QP)解算器的模型预测控制器模拟和生成代码。此示例中的设备是Simulink®中的直流伺服电机。万博1manbetx

直流伺服电机模型

直流伺服电机模型是[1]中描述的线性动态系统。植物是电机的连续时间-状态-空间模型。是最大容许扭矩,用作输出约束。

[工厂,tau]=MPC电机模型;

MPC控制器的设计

设备有一个输入,即电机输入电压。MPC控制器将此输入用作操纵变量(MV).设备有两个输出,电机角位置和轴扭矩。角位置为测量输出(卫生官员),且轴扭矩未测量(UO).

工厂=设置MPCSignals(工厂,“MV”1.“莫”1.“UO”,2);

将操纵变量约束为介于+/-220电压。由于设备输入和输出具有不同的数量级,为了便于调谐,使用比例因数。比例因数的典型选择是上限/下限或工作范围。

MV=结构(“敏”,-220,“马克斯”,220,“ScaleFactor”,440);

对角度位置没有约束。在前三个预测水平步骤中指定轴扭矩的上限和下限。要定义这些边界,请使用.

OV=结构(“敏”,{Inf,[-tau;-tau;-tau;-Inf]},...“马克斯”,{Inf,[tau;tau;tau;Inf]},“ScaleFactor”,{2*pi,2*tau});

控制任务是实现角位置的零跟踪误差。由于您只有一个操纵变量,通过将其调谐权重设置为零,允许轴扭矩在其约束范围内浮动。

权重=结构(“MV”,0,“MVRate”,0.1,“OV”,[0.1 0]);

指定采样时间和范围,并使用创建MPC控制器植物作为预测模型。

Ts=0.1;%采样时间p=10;%预测视界m=2;%控制视界mpcobj=mpc(设备、Ts、p、m、重量、MV、OV);

使用内置QP解算器在Si万博1manbetxmulink中进行模拟

要运行剩下的示例,需要Simulink。万博1manbetx

如果~mpcchecktoolbox已安装(“万博1manbetxsimulink”)disp('万博1manbetx运行此示例需要Simulink。')回来终止

打开使用MPC万博1manbetx控制器模拟直流伺服电机闭环控制的Simulink模型。默认情况下,MPC使用使用KWIK算法的内置QP解算器。

mdl=“mpc_customQPcodegen”; 开放式系统(mdl)

运行模拟

sim卡(mdl)
-->将模型转换为离散时间。假设测量的输出通道#1没有增加干扰。-->“mpc”对象的“Model.Noise”属性为空。假设每个测量输出通道上存在白噪声。

将设备输入和输出信号存储在MATLAB工作区中。

uKWIK=u;yKWIK=y;

使用自定义QP解算器在S万博1manbetximulink中进行模拟

要检查自定义解算器在相同条件下的行为,请在MPC控制器中启用自定义解算器。

mpcobj.Optimizer.CustomSolver=true;

您还必须提供满足以下要求的MATLAB®函数:

  • 函数名必须为mpcCustomSolver.

  • 输入和输出参数必须与模板文件中的参数匹配。

  • 函数必须位于MATLAB路径上。

在本例中,使用模板文件中定义的自定义QP解算器mpcCustomSolverCodeGen_templateml.txt,它实现了丹泽算法,适用于代码生成。将该函数保存在您的工作文件夹中mpcCustomSolver.m.

src=哪个(“mpcCustomSolverCodeGen_templateml.txt”); dest=完整文件(pwd,“Mpcustomsolver.m”);复制文件(src、dest、,“f”)

模拟直流伺服电机的闭环控制,节省设备的输入和输出。

sim(mdl)uDantzigSim=u;yDantzigSim=y;
-->将模型转换为离散时间。假设测量的输出通道#1没有增加干扰。-->“mpc”对象的“Model.Noise”属性为空。假设每个测量输出通道上存在白噪声。

使用自定义QP解算器生成代码

要运行剩下的示例,需要Simulink编码器产品。万博1manbetx

如果~mpcchecktoolbox已安装(“万博1manbetxsimulinkcoder”)disp('万博1manbetx运行此示例需要Simulink(R)编码器(TM)。')回来终止

要从使用自定义QP解算器的MPC控制器块生成代码,请在MPC控制器中启用“用于代码生成的自定义解算器”选项。

mpcobj.Optimizer.CustomSolverCodeGen=true;

您还必须提供满足以下所有要求的MATLAB®函数:

  • 函数名必须为mpcCustomSolverCodeGen.

  • 输入和输出参数必须与模板文件中的参数匹配。

  • 函数必须位于MATLAB路径上。

在本例中,使用中定义的相同自定义解算器mpcCustomSolverCodeGen_templateml.txt.将工作文件夹中的函数另存为mpcCustomSolverCodeGen.m.

src=哪个(“mpcCustomSolverCodeGen_templateml.txt”); dest=完整文件(pwd,“mpcCustomSolverCodeGen.m”);复制文件(src、dest、,“f”)

查看已保存的mpcCustomSolverCodeGen.m文件

作用[x,status]=mpcCustomSolverCodeGen(H,f,A,b,x0)%#编码基因%mpcCustomSolverCodeGen允许用户指定自定义(QP)解算器%用MATLAB编写,用于MPC控制器的代码生成。%%工作流程:%(1)将此模板文件复制到您的工作文件夹,并将其重命名为%“mpcCustomSolverCodeGen.m”。工作文件夹必须位于路径上。%(2)修改“mpcCustomSolverCodeGen.m”以使用您的解算器。%请注意,解算器必须仅使用固定大小的数据。%(3)设置“mpcobj.Optimizer.CustomSolverCodeGen=true”告知MPC%控制器以在代码生成中使用解算器。%要生成代码,请执行以下操作:%在MATLAB中,使用带有“mpcmoveCodeGeneration”的“codegen”命令(需要MATLAB编码器)%在Sim万博1manbetxulink中,使用MPC和自适应MPC块生成代码%%要在MATLAB和Simulink中使用此解算器进行仿真,您需要:万博1manbetx%(1)将“mpcCustomSolver.txt”模板文件复制到您的工作文件夹中,然后%将其重命名为“mpcCustomSolver.m”。工作文件夹必须位于路径上。%(2)修改“mpcCustomSolver.m”以使用解算器。%(3)设置“mpcobj.Optimizer.CustomSolver=true”告知MPC%控制器以在模拟中使用解算器。%%MPC QP问题定义如下:%%最小J(x)=0.5*x'*H*x+f'*x,s.t.A*x>=b。%%输入(由MPC控制器在运行时提供):%H:一个n乘n的Hessian矩阵,它是对称的,正定的。%f:n×1列向量。%A:不等式约束系数的m×n矩阵。%b:不等式约束右侧的m×1向量。%x0:最优解的初始猜测的n×1向量。%%输出(在运行时发送回MPC控制器):%x:必须是最优解的n×1向量。%状态:必须是以下值的整数:%正值:计算中使用的迭代次数%0:达到的最大迭代次数%-1:QP不可行%-2:由于其他原因,未能找到解决方案%请注意:%(1)当解算器无法找到最优解(状态<=0)时,“x”%还需要归还。%(2)要在MPC中使用次优QP解决方案,请返回次优“x”%“状态=0”。此外,您需要设置%MPC控制器中的“mpcobj.Optimizer.UseSuboptimalSolution=true”。%%不要更改上面的行%此模板使用“Dantzig”算法实现showcase QP解算器%由G.B.Dantzig、A.Orden和P.Wolfe所著,“广义单纯形法%在线性不等式约束下最小化线性形式“,%太平洋数学杂志,5:183-1951955。%%用户需要修改此模板并插入自己的自定义QP解算器%这取代了“Dantzig”算法。零=零(“喜欢”,H);一=一(“喜欢”,H);%xmin是一个常数项,由于“dantzig”而添加到初始基中%需要正优化变量。固定的“xmin”不起作用%对于所有MPC问题。xmin=-1e3*ONE(大小(f(:))*ONE;maxiter=200*ONE;nvar=length(f);ncon=length(b);a=-H*xmin(:);H=H\eye(nvar);rhsc=a*xmin(:)-b(:);rhsa=a-f(:);TAB=-[H*a';a*ha*H*a'];basisi=[H*rhsa;rhsc+a*H*rhsa];ibi=(1:nvar+nco)*ONE;ili=-ibi;%%调用EML函数“qpdantzg”[basis,ib,il,iter]=qpdantzg(TAB,basisi,ibi,ili,maxiter);%#好的%%地位如果iter>maxiter状态=零;埃尔塞夫iter<零状态=-1;其他的状态=国际热核实验堆;终止%%最优变量x=零(nvar,1,“喜欢”,H);对于j=1:nvar如果il(j)<=零x(j)=xmin(j);其他的x(j)=基(il(j))+xmin(j);终止终止

使用以下命令从Simulink模型生成可执行代码:万博1manbetxslbuild来自Simulink编码器万博1manbetx的命令。

slbuild(mdl)
###开始:mpc_customQPcodegen-->将模型转换为离散时间的构建过程。假设测量的输出通道#1。-->“mpc”的“model.Noise”属性未添加干扰对象为空。假设每个测量的输出通道上都存在白噪声。###成功完成以下生成过程:mpc#U customQPcodegen生成摘要生成的顶级模型目标:模型操作重建原因========================================================================================================================================================================================================================================================================================================================================================================================================================================================================================编译的代码生成信息文件不存在。已生成1个模型中的1个(0个模型已更新)生成持续时间:0h 0m 33.62s

在Windows系统上,生成过程完成后,软件将添加可执行文件mpc_customQPcodegen.exe到您的工作文件夹。

运行可执行文件。在可执行文件成功完成之后(状态=0),软件会添加数据文件mpc_customQPcodegen.mat将数据文件加载到MATLAB工作区,并获取可执行文件生成的设备输入和输出信号。

如果ispc状态=系统(mdl);荷载(mdl)uDantzigCodeGen=u;yDantzigCodeGen=y;其他的disp('此示例仅在Windows系统上运行可执行文件。');终止
该示例仅在Windows系统上运行可执行文件。

比较仿真结果

比较所有模拟的设备输入和输出信号。

如果ispc图形子地块(2,1,1)图(u.time,uKWIK.signals.values,u.time,uDantzigSim.signals.values,...'+',u.time,uDantzigCodeGen.signals.values,“哦”)子地块(2,1,2)绘图(y.time,yKWIK.signals.values,y.time,yDantzigSim.signals.values,...'+',y.time,yDantzigCodeGen.signals.values,“哦”)传奇(“KWIK”,“丹齐格·思慕”,“Dantzig CodeGen”,“位置”,“西北”)其他的图子地块(2,1,1)图(u.time、uKWIK.signals.values、u.time、uDantzigSim.signals.values、,'+')子地块(2,1,2)绘图(y.time,yKWIK.signals.values,y.time,yDantzigSim.signals.values,'+')传奇(“KWIK”,“丹齐格·思慕”,“位置”,“西北”)终止

所有模拟的信号都是相同的。

工具书类

[1] 通过参考管理在不确定线性系统中实现硬约束自动的,第34卷,第4号,第451-461页,1998年。

bdclose(mdl)

另见

功能

阻碍

相关话题