主要内容

模拟和生成代码为MPC控制器定制QP解算器

这个例子展示了如何模拟和生成代码使用一个自定义的模型预测控制器二次规划(QP)解算器。这个例子是一个直流伺服电机的工厂模型®。金宝app

直流伺服电机模型

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

(植物、τ)= mpcmotormodel;

MPC控制器设计

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

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

限制被控变量+ / -220年伏特。由于植物输入和输出不同的数量级,便于调整,使用规模的因素。典型的选择比例因子上/下限或操作范围。

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

没有约束的角位置。指定上界和下界在前三轴转矩预测地平线的步骤。定义这些界限,使用τ

OV =结构(“最小值”,{负无穷变化,τ,τ;τ;负)},“马克斯”,{正无穷,τ;τ,τ;正]},“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);

模拟仿真软件的内置QP解金宝app算器

剩下的例子,运行仿真软件是必需的。金宝app

如果~ mpcchecktoolboxinstalled (“金宝app模型”)disp (仿金宝app真软件需要运行这个例子。)返回结束

打开一个仿真软金宝app件模型,模拟闭环控制的直流伺服电动机使用MPC控制器。默认情况下,货币政策委员会使用一个内置的QP使用KWIK算法解算器。

mdl =“mpc_customQPcodegen”;open_system (mdl)

运行仿真

sim (mdl)
- - >将模型转换为离散时间。假设没有干扰测量输出通道# 1。- - >”模型。噪音”属性是空的。假设白噪声在每个测量输出。

存储装置的输入和输出信号的MATLAB工作区。

uKWIK = u;yKWIK = y;

在仿真软件模拟一个定制的金宝appQP解算器

检查自定义如何解决表现在相同的条件下,使定制的解决者在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。- - >”模型。噪音”属性是空的。假设白噪声在每个测量输出。

与定制QP解算器生成代码

剩下的例子,运行仿真软件编码器产品是必需的。金宝app

如果~ mpcchecktoolboxinstalled (“金宝appsimulinkcoder”)disp (”金宝app模型(R)编码器(TM)需要运行这个例子。)返回结束

从一个MPC控制器生成代码块使用自定义QP解算器,为代码生成选项启用自定义解决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,状态]= mpcCustomSolverCodeGen (H, f, A, b, x0)% # codegen% mpcCustomSolverCodeGen允许用户指定一个自定义(QP)解算器%用MATLAB编写代码生成的MPC控制器使用。%%的工作流程:%(1)这个模板文件复制到你的工作文件夹重命名它%”mpcCustomSolverCodeGen.m”。工作文件夹必须的道路上。% (2)mpcCustomSolverCodeGen修改”。m”使用你的解算器。%注意你的解算器必须只使用固定大小的数据。%(3)设置“mpcobj.Optimizer。告诉MPC CustomSolverCodeGen = true”%控制器使用代码生成的解算器。%来生成代码:%在MATLAB中,使用“codegen”命令“mpcmoveCodeGeneration”(需要MATLAB编码器)%在仿真软金宝app件,生成代码与MPC和自适应MPC块%%使用这对在MATLAB和Simulink仿真解算器,你需要:金宝app% (1)“mpcCustomSolver副本。txt”文件夹和模板文件到你的工作%将它重命名为“mpcCustomSolver.m”。工作文件夹必须的道路上。% (2)mpcCustomSolver修改”。m”使用你的解算器。%(3)设置“mpcobj.Optimizer。告诉MPC CustomSolver = true”%控制器使用模拟的求解程序。%% MPC QP问题定义如下:%%分钟J (x) = 0.5 * x ' * H * x + f ' * x,酸处理* x > = b。%%的输入(MPC控制器在运行时提供的):% H: n×n海赛矩阵是对称正定。% f: n×1列向量。%:一个m×n的矩阵不等式约束系数。% b: m×1矢量不等式约束的右边。% x0: n×1向量的初始猜测最优解决方案。%%输出(送回MPC控制器在运行时):% x:必须是一个n×1最优解向量。%状态:必须是一个整数:%的积极价值:用于计算的迭代次数% 0:最大迭代数% 1:QP是不可行的% 2:由于其他原因未能找到一个解决方案%注意:%(1)当解算器无法找到一个最佳的解决方案(< = 0),“x”状态%仍然需要返回。%(2)采用次优QP解决方案在MPC,返回最优“x”%”状态= 0”。此外,您需要设置%”mpcobj.Optimizer。在MPC控制器UseSuboptimalSolution = true”。%%不改变线以上%这个模板实现了展示QP使用“Dantzig”算法解算器%由g . b . Dantzig, a . Orden p·沃尔夫:“广义单纯形法%最小化线性不等式约束下的线性形式”,%太平洋j .数学5:183 - 195,1955。%%的用户预计将修改这个模板和插入自定义的QP解算器%,取代了“Dantzig”算法。0 = 0 (“喜欢”、H);一个= (“喜欢”、H);% xmin是一个常数项,增加了最初的基础,因为“dantzig”%需要积极优化变量。一个固定的“xmin”并不工作%对所有货币政策委员会的问题。xmin = 1 e3 *的(大小(f (:))) *;麦克斯特= 200 * 1;据nvar =长度(f);ncon =长度(b);一个= - h * xmin (:);H = H \眼睛(据nvar);rhsc =一个* xmin (:) - b (:);rhsa = f (:);选项卡= - [H H *”;一个H * * H *”);basisi = [H * rhsa; rhsc + A*H*rhsa]; ibi = -(1:nvar+ncon)'*ONE; ili = -ibi*ONE;% %调用EML函数“qpdantzg”(基础、ib、il, iter) = qpdantzg(选项卡,basisi ibi、伊犁,麦克斯特);% #好< ASGLU >% %状态如果iter >麦克斯特状态=零;elseifiter <零状态=一;其他的状态= iter;结束% %优化变量x = 0(据nvar 1“喜欢”、H);据nvar j = 1如果伊尔(j) < = 0 x (j) = xmin (j);其他的x (j) =基础(il (j)) + xmin (j);结束结束

从使用的仿真软件模型生成可执行代码金宝appslbuild从仿真软件编码器的命令。金宝app

slbuild (mdl)
# # #开始构建过程:mpc_customQPcodegen——>将模型转换为离散时间。假设没有干扰测量输出通道# 1。- - >”模型。噪音”属性是空的。假设白噪声在每个测量输出。# # #成功完成构建过程:mpc_customQPcodegen模型建立目标:总结构建模型重建行动的原因= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = mpc_customQPcodegen代码生成和编译代码生成信息文件不存在。1 1模型的建立(0模型已经更新)构建持续时间:0 h 0米19.893秒

在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一场”,“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一场”,“位置”,“西北”)结束

信号的模拟都是相同的。

引用

[1]Bemporad, a,莫斯卡,E。“满足硬约束的不确定线性系统参考管理。”自动化34卷4号,第461 - 451页,1998年。

bdclose (mdl)

另请参阅

功能

相关的话题