主要内容

使用自定义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]},“ScaleFactor”,{2π* 2 *τ});

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

重量=结构(“MV”,0,“MVRate”, 0.1,机汇的,[0.1 0]);

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

t = 0.1;%样品时间p=10;%预测地平线m=2;%控制视界mpcobj = mpc(植物、t、p、m,重量、MV, OV);

在Simulink中使用万博1manbetx内置的QP求解器进行模拟

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

如果~ mpcchecktoolboxinstalled (“万博1manbetx模型”)disp('万博1manbetx运行此示例需要Simulink。'返回终止

建立Simul万博1manbetxink模型,仿真MPC控制器对直流伺服电机的闭环控制。默认情况下,MPC使用内置的QP求解器,使用KWIK算法。

mdl=“mpc_customQPcodegen”;open_system (mdl)

运行仿真

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

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

uKWIK=u;yKWIK=y;

在Simulink中使用万博1manbetx自定义QP求解器进行模拟

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

mpcobj.Optimizer.CustomSolver = true;

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

  • 函数名必须为mpcCustomSolver

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

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

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

src = (“mpcCustomSolverCodeGen_templateml.txt”);dest = fullfile (pwd,“mpcCustomSolver.m”);拷贝文件(src,桌子,“f”

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

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

用自定义QP求解器生成代码

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

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

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

mpcobj.Optimizer.CustomSolverCodeGen = true;

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

  • 函数名必须为mpcCustomSolverCodeGen

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

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

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

src = (“mpcCustomSolverCodeGen_templateml.txt”);dest = fullfile (pwd,“mpcCustomSolverCodeGen.m”);拷贝文件(src,桌子,“f”

检查保存的mpcCustomSolverCodeGen.m文件。

函数[x,status]=mpcCustomSolverCodeGen(H,f,A,b,x0)% # codegen%mpcCustomSolverCodeGen允许用户指定自定义(QP)解算器%用MATLAB编写,供MPC控制器在代码生成时使用。%工作流程:%(1)将此模板文件复制到您的工作文件夹,并将其重命名为%“mpcCustomSolverCodeGen.m”。工作文件夹必须位于路径上。%(2)修改“mpcCustomSolverCodeGen.m”以使用您的解算器。%注意你的解算器只能使用固定大小的数据。%(3)设置mpcobj.Optimizer。CustomSolverCodeGen = true”来告诉MPC%控制器在代码生成中使用求解器。%生成代码:%在MATLAB中,使用“codegen”命令和“mpcmoveCodeGeneration”(需要MATLAB编码器)%在Sim万博1manbetxulink中,使用MPC和Adaptive MPC块生成代码%要在MATLAB和Simulink中使用此解算器进行仿真,您需要:万博1manbetx%(1)复制“mpcCustomSolver.txt”模板文件到你的工作文件夹%重命名为“mpcCustomSolver.m”。工作文件夹必须在路径上。%(2)修改“mpcCustomSolver. properties”。用你的解算器。%(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”% status = 0。另外,还需要设置%MPC控制器中的“mpcobj.Optimizer.UseSuboptimalSolution=true”。%不要更改上面的行%这个模板使用Dantzig算法实现了一个展示QP求解器[G. B. Dantzig, A. Orden, and P. Wolfe, "广义单纯形方法%在线性不等式约束下最小化线性形式“,%太平洋数学杂志,5:183-1951955。期望用户修改此模板并插入自己的自定义QP求解器%这取代了“Dantzig”算法。零=零(“喜欢”,H);一=一(“喜欢”、H);% xmin是一个常数项,因为“dantzig”%需要正向优化变量。固定的“xmin”不起作用%用于所有MPC问题。xmin = 1 e3 *的(大小(f (:))) *;麦克斯特= 200 * 1;据nvar =长度(f);ncon =长度(b);一个= - h * xmin (:);H = H \眼睛(据nvar);rhsc = A*xmin(:) - b(:);rhsa = f (:);= -[h h * a '; a * h * h * a '];basisi = [H * rhsa; rhsc + A*H*rhsa]; ibi = -(1:nvar+ncon)'*ONE; ili = -ibi*ONE;%%调用EML函数“qpantzg”[basis,ib,il,iter]=qpdantzg(TAB,basisi,ibi,ili,maxiter);%#好的% %状态如果iter > maxiter status = 0;elseifiter<零状态=-1;其他的状态= iter;终止% %优化变量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)
### Starting build procedure for: mpc_customQPcodegen——>转换模型为离散时间。假设对测量的输出通道#1没有增加任何干扰。——>”模式。mpc对象的Noise属性为空。假设每个测量输出通道上都有白噪声。# # #成功完成构建过程:mpc_customQPcodegen模型建立目标:总结构建模型重建行动的理由  ==================================================================================================== mpc_customQPcodegen代码生成和编译代码生成信息文件不存在。建造时间:0小时0米31.794秒

在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,“o”次要情节(2,1,2)情节(y.time、yKWIK.signals.values y.time, yDantzigSim.signals.values,...“+”y.time yDantzigCodeGen.signals.values,“o”)传奇(“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)

另见

功能

阻碍

相关的话题