用自定义QP求解器模拟和生成MPC控制器代码
这个例子展示了如何模拟和生成使用自定义二次规划(QP)求解器的模型预测控制器的代码。本例中的工厂是Simulink®中的直流伺服电机。万博1manbetx
直流伺服电机模型
直流伺服电机模型是[1]中描述的线性动态系统。植物
是电机的连续时间状态空间模型。τ
是可接受的最大扭矩,可用作输出约束。
[plant,tau] = mpcmotormodel;
MPC控制器设计
该装置有一个输入,即电机输入电压。MPC控制器将此输入作为操作变量(MV
).该装置有两个输出,电机角位置和轴转矩。角位置是测量的输出(莫
),轴转矩未测量(UO
).
植物= setmpcsignals(植物,“MV”,1,“莫”,1,“UO”2);
将操作变量约束在+/-之间220
伏特。由于工厂的输入和输出是不同的数量级,为了便于调整,使用比例因子。比例因子的典型选择是上下限或工作范围。
MV = struct(“最小值”, -220,“马克斯”, 220,“ScaleFactor”, 440);
角位置没有限制。在前三个预测水平步中指定轴扭矩的上下限。要定义这些边界,请使用τ
.
OV = struct(“最小值”,{负无穷变化,τ,τ;τ;负)},...“马克斯”,{正无穷,τ;τ,τ;正]},“ScaleFactor”,{2π* 2 *τ});
控制任务是实现角位置的零跟踪误差。由于您只有一个可操作的变量,允许轴扭矩浮动在其约束内,通过设置其调谐权值为零。
权重= struct(“MV”0,“MVRate”, 0.1,机汇的, 0.1 [0]);
指定示例时间和范围,并使用植物
作为预测模型。
Ts = 0.1;采样时间%P = 10;%预测水平M = 2;%控制水平mpcobj = mpc(plant,Ts,p,m,Weights,MV,OV);
用内置QP求解器在Sim万博1manbetxulink中进行模拟
要运行剩下的示例,需要使用Simulink。万博1manbetx
如果~ mpcchecktoolboxinstalled (“万博1manbetx模型”) disp (运万博1manbetx行此示例需要Simulink。)返回结束
打开Simul万博1manbetxink模型,使用MPC控制器模拟直流伺服电机的闭环控制。默认情况下,MPC使用一个使用KWIK算法的内置QP求解器。
mdl =“mpc_customQPcodegen”;open_system (mdl)
运行模拟
sim (mdl)
——>转换模型到离散时间。假设对测量的1号输出通道没有干扰。——>”模式。“噪音”属性为空。假设每个测量输出都有白噪声。
将植物输入和输出信号存储在MATLAB工作空间中。
uKWIK = u;yKWIK = y;
用自定义QP求解器在Si万博1manbetxmulink中进行模拟
要检查自定义求解器在相同条件下的行为,请在MPC控制器中启用自定义求解器。
mpcoj . optimizer . customsolver = true;
您还必须提供一个MATLAB®函数,满足以下要求:
函数名必须为
mpcCustomSolver
.输入和输出参数必须与模板文件中的参数匹配。
函数必须在MATLAB路径上。
在本例中,使用模板文件中定义的自定义QP求解器mpcCustomSolverCodeGen_TemplateEML.txt
,它实现dantzig
算法,适用于代码生成。将该函数保存在工作文件夹中为mpcCustomSolver.m
.
SRC = which(“mpcCustomSolverCodeGen_TemplateEML.txt”);Dest = fullfile(pwd,“mpcCustomSolver.m”);拷贝文件(src,桌子,“f”)
模拟直流伺服电机的闭环控制,保存设备的输入输出。
sim(mdl) uDantzigSim = u;yDantzigSim = y;
——>转换模型到离散时间。假设对测量的1号输出通道没有干扰。——>”模式。“噪音”属性为空。假设每个测量输出都有白噪声。
用自定义QP求解器生成代码
要运行剩下的示例,需要使用Simulink Coder产品。万博1manbetx
如果~ mpcchecktoolboxinstalled (“万博1manbetxsimulinkcoder”) disp (“万博1manbetx运行此示例需要Simulink(R) Coder(TM)。”)返回结束
要从使用自定义QP求解器的MPC控制器块生成代码,请在MPC控制器中启用用于代码生成的自定义求解器选项。
mpcoco . optimizer . customsolvercodegen = true;
您还必须提供一个MATLAB®函数,满足以下所有要求:
函数名必须为
mpcCustomSolverCodeGen
.输入和输出参数必须与模板文件中的参数匹配。
函数必须在MATLAB路径上。
在此示例中,使用中定义的相同自定义求解器mpcCustomSolverCodeGen_TemplateEML.txt
.将该函数保存在工作文件夹中为mpcCustomSolverCodeGen.m
.
SRC = which(“mpcCustomSolverCodeGen_TemplateEML.txt”);Dest = fullfile(pwd,“mpcCustomSolverCodeGen.m”);拷贝文件(src,桌子,“f”)
查看已保存的mpcCustomSolverCodeGen.m
文件。
函数[x, status] = mpcCustomSolverCodeGen(H, f, A, b, x0)% # codegen% mpcCustomSolverCodeGen允许用户指定一个自定义(QP)求解器%编写在MATLAB中用于MPC控制器的代码生成。%%的工作流程:复制此模板文件到您的工作文件夹,并将其重命名为%”mpcCustomSolverCodeGen.m”。工作文件夹必须在路径上。(2)修改mpcCustomSolverCodeGen. %用你的解算器。注意,你的求解器必须只使用固定大小的数据。%(3)设置“mpcoco . optimizer . %”CustomSolverCodeGen = true”来告诉MPC%控制器在代码生成中使用求解器。%生成代码:%在MATLAB中,使用"codegen"命令和"mpcmoveCodeGeneration"(需要MATLAB编码器)在Simu万博1manbetxlink中,生成带有MPC和Adaptive MPC块的代码%要在MATLAB和Simulink中使用此求解器进行仿真,您需要:万博1manbetx复制“mpcCustomSolver.txt”模板文件到您的工作文件夹和重命名为“mpcCustomSolver.m”。工作文件夹必须在路径上。%(2)修改“mpcCustomSolver。”用你的解算器。%(3)设置“mpcoco . optimizer . %”CustomSolver = true”来告诉MPC%控制器在模拟中使用求解器。%MPC QP问题定义如下:%% min J(x) = 0.5*x'*H*x + f'*x, s.t A*x >= b。%%输入(由MPC控制器在运行时提供):% H:一个n × n的黑森矩阵,它是对称的正定矩阵。% f: n × 1的列向量。% A:一个m × n的不等式约束系数矩阵。% b:不等式约束右侧的m × 1向量。% x0:最优解初始猜测的n × 1向量。%%输出(在运行时发送回MPC控制器):% x:必须是一个n × 1的最优解向量。% status:必须为以下整数:%正值:计算中使用的迭代次数% 0:达到的最大迭代次数% -1: QP是不可行的% -2:由于其他原因无法找到解决方案%注意:%(1)当求解器找不到最优解(状态<=0)时,"x"%仍然需要返回。%(2)在MPC中使用次优QP解,返回次优“x”%,“status = 0”。此外,还需要设置%”mpcobj.Optimizer。在MPC控制器中使用esuboptimalsolution = true”。%%不要更改上面的行这个模板使用“Dantzig”算法实现了一个展示QP求解器(G. B. Dantzig, A. Orden,和P. Wolfe, "广义单纯形法在线性不等式约束下最小化线性形式的% "数学,5:183-195,1955。%希望用户修改此模板并插入自己的自定义QP求解器%,取代“Dantzig”算法。零=零(“喜欢”、H);一个=一个(“喜欢”、H);% xmin是加在初始基上的常数项,因为"dantzig"%需要正优化变量。固定的“xmin”不起作用%为所有MPC问题。xmin = -1e3*ones(size(f(:)))*ONE;maxiter = 200* 1;Nvar =长度(f);Ncon =长度(b);a = -H*xmin(:);H = H\眼(nvar);rhsc = A*xmin(:) - b(:);Rhsa = a-f(:);TAB = -[h h * a '; a * h a * h * a '];basisi = [H*rhsa; rhsc + A*H*rhsa]; ibi = -(1:nvar+ncon)'*ONE; ili = -ibi*ONE;%%调用EML函数"qpdantzg"[basis,ib,il,iter] = qpdantzg(TAB,basisi,ibi,ili,maxiter);% #好< ASGLU >% %状态如果iter > maxiter status = 0;elseifiter < 0 status = - 1;其他的Status = iter;结束最优变量X = 0 (nvar,1,“喜欢”、H);为J = 1:nvar如果il(j) <= 0 x(j) = xmin(j);其他的X (j) =基(il(j))+xmin(j);结束结束
从Simulink模型生成可执行代码万博1manbetxslbuild
从Simulink Cod万博1manbetxer命令。
slbuild (mdl)
开始构建过程:mpc_customQPcodegen——>转换模型到离散时间。假设对测量的1号输出通道没有干扰。——>”模式。“噪音”属性为空。假设每个测量输出都有白噪声。# # #成功完成构建过程:mpc_customQPcodegen模型建立目标:总结构建模型重建行动的理由 ===================================================================================================== mpc_customQPcodegen代码生成和编译。代码生成信息文件不存在。构建1个模型(0个模型已经更新)构建持续时间:0h 0m 33.974s
在Windows系统上,构建过程完成后,软件会添加可执行文件mpc_customQPcodegen.exe
到您的工作文件夹。
运行可执行文件。在可执行文件成功完成后(状态= 0
),软件添加数据文件mpc_customQPcodegen.mat
到您的工作文件夹。将数据文件加载到MATLAB工作空间中,获得可执行文件生成的工厂输入输出信号。
如果Ispc status = system(mdl);load(mdl) uDantzigCodeGen = u;yDantzigCodeGen = y;其他的disp (该示例只在Windows系统上运行可执行文件。);结束
该示例仅在Windows系统上运行可执行文件。
仿真结果比较
比较所有模拟的工厂输入和输出信号。
如果ispc图subplot(2,1,1) plot(u.time,uKWIK.signals.values,u.time,uDantzigSim.signals.values,...“+”u.time uDantzigCodeGen.signals.values,“o”(y.time, ykwick .signals.values,y.time,yDantzigSim.signals.values,...“+”y.time yDantzigCodeGen.signals.values,“o”)传说(“KWIK”,“Dantzig一场”,“Dantzig CodeGen”,“位置”,“西北”)其他的图subplot(u.time,uKWIK.signals.values,u.time,uDantzigSim.signals.values,“+”(y.time, ykwick .signals.values,y.time,yDantzigSim.signals.values,“+”)传说(“KWIK”,“Dantzig一场”,“位置”,“西北”)结束
所有模拟的信号都是一样的。
参考文献
A. Bemporad和E. Mosca。用引用管理实现不确定线性系统中的硬约束自动化1998年,第34卷第4期,第451-461页。
bdclose (mdl)