主要内容

用自定义QP求解器模拟和生成MPC控制器代码

此示例显示了如何模拟和生成用于使用自定义二次编程(QP)求解器的模型预测控制器的代码。该示例的工厂是Simulink®中的DC-伺服电机。金宝app

直流伺服电机模型

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

(植物、τ)= mpcmotormodel;

MPC控制器设计

工厂有一个输入,电机输入电压。MPC控制器使用这个输入作为操纵变量(MV)。该工厂具有两个输出,电动机角位置和轴扭矩。角度位置是测量的输出(),轴转矩未测(UO.)。

植物= setmpcsignals(植物,'mv',1,“莫”,1,“UO”2);

约束操作变量在+/-之间220伏特。由于植物的输入和输出是不同数量级的,为了便于调整,使用比例因子。标度因子的典型选择是上限/下限或操作范围。

mv = struct('min',-220,'最大限度', 220,'比例因子',440);

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

OV =结构('min',{ -  inf,[-tau; -tau; -tau; -inf]},......'最大限度',{正无穷,τ;τ,τ;正]},'比例因子',{2π* 2 *τ});

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

权重= struct('mv'0,“MVRate”,0.1,机汇的, 0.1 [0]);

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

ts = 0.1;%样品时间p = 10;%预测地平线m = 2;%控制地平线MPCOBJ = MPC(植物,TS,P,M,重量,MV,OV);

用内置QP求解器模拟Si金宝appmulink

要运行剩余的示例,需要Simulink。金宝app

如果〜mpcchecktoolboxinstalled('金宝appsimulink') disp (“金宝app运行这个示例需要Simulink。”的)返回结束

打开使用MPC金宝app控制器模拟DC-Servo电机的闭环控制。默认情况下,MPC使用使用KWIK算法的内置QP QP解算程序。

mdl =“mpc_customQPcodegen”;open_system (mdl)

运行仿真

SIM(MDL)
——>模型转换为离散时间。假设对测量的输出通道#1没有增加任何干扰。- >“MPC”对象的“Model.Noise”属性为空。假设每个测量的输出通道上的白噪声。

将植物的输入和输出信号存储在MATLAB工作空间中。

uKWIK = u;yKWIK = y;

使用自定义QP求解器模拟金宝appSimulink

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

mpcobj.Optimizer.CustomSolver = true;

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

  • 函数名必须为mpccustomsolver

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

  • 函数必须在MATLAB路径上。

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

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

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

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

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

要运行剩下的示例,需要Simulink Coder产品。金宝app

如果〜mpcchecktoolboxinstalled(“金宝appsimulinkcoder”) disp (“金宝app需要Simulink(R) Coder(TM)来运行这个示例。”的)返回结束

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

mpcobj.Optimizer.CustomSolverCodeGen = true;

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

  • 函数名必须为mpccustomsolvercodegen.

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

  • 函数必须在MATLAB路径上。

在本例中,使用中定义的自定义求解器mpcCustomSolverCodeGen_TemplateEML.txt.将函数保存在工作文件夹中mpccustomsolvercodegen.m ..

src = (“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控制器在代码生成时使用。%的工作流程:%(1)将此模板文件复制到您的工作文件夹并将其重命名为%”mpcCustomSolverCodeGen.m”。工作文件夹必须在路径上。%(2)修改“mpcCustomSolverCodeGen. exe”。用你的解算器。%注意,您的求解器必须仅使用固定大小的数据。%(3)设置“mpcobj.optimizer.customsolvercodegen = true”告诉MPC%控制器在代码生成中使用求解器。%生成代码:matlab%,使用“mpcmovecodegeneration”(需要matlab编码器)的“codegen”命令%在Sim金宝appulink中,使用MPC和Adaptive MPC块生成代码%在MATLAB和Simulink中使用此求解器进行仿真,您需要:金宝app%(1)复制“mpcCustomSolver.txt”模板文件到你的工作文件夹%重命名为“mpcCustomSolver.m”。工作文件夹必须在路径上。%(2)修改“MPCCUSTOMOLVERM”以使用您的求解器。%(3)设置mpcobj.Optimizer。CustomSolver = true”来告诉MPC%控制器在模拟中使用求解器。% MPC QP问题定义如下:% min J(x) = 0.5*x'*H*x + f'*x, s.t. A*x >= b。%输入(由运行时间的MPC控制器提供):%h:一个N-by-n Hessian矩阵,它是对称和正面的。% 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控制器中UseSuboptimalSolution = true"。%不改变上面的行此模板使用“Dantzig”算法实现展示QP求解器[G. B. Dantzig, A. Orden, and P. Wolfe, "广义单纯形方法%在线性不等式约束下最小化线性形式”,%太平洋J.数学,5:183 - 195,1955。期望用户修改此模板并插入自己的自定义QP求解器%替换“Dantzig”算法。0 = 0 (“喜欢”、H);一个= (“喜欢”、H);%xmin是一个常数术语,增加了最初的基础,因为“dantzig”%需要正优化变量。固定的“xmin”不起作用%用于所有MPC问题。xmin = -1e3 * x x(尺寸(f(:)))*一个;maxiter = 200 *一个;nvar =长度(f);ncon =长度(b);a = -h * xmin(:);h = h \眼睛(nvar);Rhsc = a * xmin(:)  -  b(:);RHSA = A-F(:);标签=  -  [h * a'; a * h a * h * a'];Basisi = [H * RHSA; rhsc + A*H*rhsa]; ibi = -(1:nvar+ncon)'*ONE; ili = -ibi*ONE;%%调用EML函数“qpantzg”(基础、ib、il, iter) = qpdantzg(选项卡,basisi ibi、伊犁,麦克斯特);% #好< ASGLU >%% 地位如果iter > maxiter status = 0;elsef.iter < 0 status = - 1;其他的状态= iter;结束%%最佳变量x = 0(据nvar 1“喜欢”、H);据nvar j = 1如果if (j) <= 0 x(j) = xmin(j);其他的x (j) =基础(il (j)) + xmin (j);结束结束

使用Simulink模型生成可执行代码金宝appslbuild命令来自Simulink 金宝appCoder。

SLBUILD(MDL)
###启动构建过程:MPC_CUSTOMQPCODEGEN  - >将模型转换为离散时间。假设对测量的输出通道#1没有增加任何干扰。- >“MPC”对象的“Model.Noise”属性为空。假设每个测量的输出通道上的白噪声。###成功完成构建过程:MPC_CUSTOMQPCODEGEN构建摘要顶层型号内置:模型动作重建原因==================================================================================================== mpc_customqpcodegen代码生成和编译的代码生成信息文件不存在。1个中有1个(0型号已达到约会)构建持续时间:0H 0M 31.794S

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

运行可执行文件。可执行文件成功完成后(状态= 0)时,软件会添加数据文件mpc_customqpcodegen.mat.到您的工作文件夹。将数据文件加载到MATLAB工作空间中,获取可执行文件生成的植物输入和输出信号。

如果Ispc status = system(mdl);load(mdl) uDantzigCodeGen = u;yDantzigCodeGen = y;其他的disp (“该示例仅在Windows系统上运行可执行文件。);结束
该示例仅在Windows系统上运行可执行文件。

比较仿真结果

将植物输入和输出信号与所有模拟进行比较。

如果ispc figure subplot(2,1,1) plot(u.time,uKWIK.signals.values,u.time,uDantzigSim.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一场”“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'“Dantzig一场”“位置”“西北”的)结束

来自所有模拟的信号是相同的。

参考文献

Bemporad, A.和Mosca, E.引用管理实现不确定线性系统中的硬约束自动化,第34卷,第4期,第451-461页,1998。

bdclose (mdl)

也可以看看

职能

相关的话题