模型预测控制器QP求解器将线性MPC优化问题转化为一般形式的QP问题
服从线性不等式约束
在哪里
x是解向量。
H为Hessian矩阵。当您的预测模型和调优权重在运行时没有改变时,此矩阵是常量。
一个为线性约束系数矩阵。当您的预测模型在运行时没有改变时,此矩阵是常数。
b和f是向量。
在每个控制间隔的开始,控制器进行计算H,f,一个,b.如果H或一个为常量时,控制器检索它们的预计算值。
模型预测控制工具箱™软件支持两种内置算法来解决QP问题。金宝app两个求解器都要求Hessian矩阵是正定的。
Active-set求解器-这个求解器可以在单精度和双精度下为小规模和中等规模的优化问题提供快速和健壮的性能。active-set求解器使用的KWIK算法[1].要使用active-set求解器,请设置优化器。算法
属性的MPC“激活集”
.要配置算法设置,请使用优化器。一个ctiveSetOptions
属性。
内点求解器——这种求解器可以为大规模优化问题提供卓越的性能,如MPC应用程序,在大的预测和控制范围内强制约束。这个内点求解器使用一个带有Mehrotra预测-校正器的原始对偶算法。要使用内点求解器,请设置优化器。算法
属性的MPC“内点”
.要配置算法设置,请使用优化器。InteriorPointOptions
属性。
在为您的应用程序选择和配置QP求解器时,请考虑以下问题:
MPC问题的大小和配置会影响内置QP解决程序的性能。要确定哪个求解器最适合您的应用程序,请考虑使用两个QP求解器在多个模拟场景中模拟您的控制器。
内点求解器对求解器参数比活动集求解器更敏感。因此,需要进行更多的调整,以便在性能和健壮性之间找到最佳平衡。
当测试最佳解决方案时,活动设置求解器也使用不可调节的公差。你可以调整内点解算器的最优公差。
由于数值四舍五入误差,可能会轻微违反一个或多个线性约束。这样的违规是正常的,不会产生警告消息。若要调整可接受的约束违反的容忍度,请使用ConstraintTolerance
设置为活动设置或内部点求解器。
寻找QP解是一个迭代的过程。对于任何一个求解器,您都可以使用相应的MaxIterations
设置。当迭代次数达到最大值时,算法终止。
活动设置求解器的默认最大迭代次数为
,在那里nc和nv分别为整个预测范围内的约束和优化变量的数量。对于某些控制器配置,这个值可能非常大,这会使QP求解器看起来停止响应。这个值的下界是120
.
内点求解器的默认最大迭代次数为50
.
如果你的MPC问题在转换为QP问题后包含硬约束,那么QP不等式约束可以不可行(不满足)。如果QP求解器检测到不可行,它将立即终止。
当求解器检测到一个不可行的问题或达到最大的迭代次数而没有找到最优解时,控制器保留最后成功的控制输出。有关更多信息,请参见mpcmove
.您可以检测异常结果,并根据需要覆盖默认行为。
在第一个控制步骤中,QP求解器使用a冷启动,其中初始猜想为中所描述的无约束解无约束模型预测控制.如果x满足约束条件时,为最优QP解,算法终止。否则,至少一个线性不等式约束必须满足一个等式,求解器计算最优解。后续控制步骤:
活动设置求解器使用温暖的开始其中,在前一个控制步骤中确定的主动约束集成为初始猜想。
内点求解器继续使用冷启动。
对于给定的带有约束条件的MPC应用程序,无法预测需要多少次QP求解迭代才能找到最优解。此外,在实时应用程序中,从一个控制间隔到下一个控制间隔的迭代次数可能会发生显著变化。在这种情况下,最坏情况下的执行时间可能会超过硬件平台上允许的、由控制器采样时间决定的限制。
通过在优化迭代次数超过指定的最大值后应用次优解决方案,可以为MPC控制器设置一个保证的最坏情况执行时间。要设置最坏情况的执行时间,首先通过在标称条件下使用控制器进行试验,确定单个优化迭代所需的时间。然后,设置每个控制间隔的迭代次数的上限。例如,如果硬件上每次迭代的计算时间为1ms左右,控制器采样时间为10ms,则最大迭代次数设置为不大于10
.
MPCobj.Optimizer.ActiveSetOptions.MaxIterations = 10;
默认情况下,MPC控制器对象的下界为120
激活集求解器的最大迭代次数。
默认情况下,当求解器达到无最佳解决方案的最大求解迭代次数时,控制器将保持操纵变量的以前值。为了使用最后一次迭代后的次最优解,设置UseSuboptimalSolution
选项真正的
.
MPCobj.Optimizer.UseSuboptimalSolution = true;
虽然解决方案不是最优的,但MPC控制器调整解决方案,以满足所有指定的约束条件。
不能保证次优解决方案的性能比保持控制器输出常数更好。您可以使用这两种方法模拟系统,并选择提供更好控制器性能的配置。
例如,请参见在快速MPC应用中使用次优解决方案.
要访问需要解决在线QP问题的应用程序的QP解决程序,请使用mpcActiveSetSolver
和mpcInteriorPointSolver
函数,这对:
先进的MPC应用程序,超出了模型预测控制工具箱软件的范围。
自定义QP应用程序,包括需要生成代码的应用程序。
模型预测控制工具箱软件允许您为MPC控制器指定自定义QP求解器。此求解器在每个控制间隔内被调用,以代替内置求解器。这个选项适用于:
验证模拟结果或使用您信任的内部第三方求解器生成代码。
内置解决程序不能为特定问题提供令人满意的性能的应用程序。
您可以为模拟或代码生成定义一个自定义求解器。在这两种情况下,您都可以使用自定义函数定义自定义求解器,并将控制器配置为使用此自定义函数。
任务 | 自定义求解函数 | MATLAB的影响®功能 | 受影响的仿真软件金宝app®块 |
---|---|---|---|
模拟 集
|
金宝app支持:
|
|
|
代码生成 集
|
金宝app支持:
|
|
要用自定义QP求解器模拟MPC控制器,请执行以下步骤。
复制解算器模板文件到您的工作文件夹或MATLAB路径上的任何地方,并重命名它mpcCustomSolver.m
.要将解算器模板复制到当前工作文件夹,请在MATLAB命令行中输入以下命令。
src = (“mpcCustomSolver.txt”);dest = fullfile (pwd,“mpcCustomSolver.m”);拷贝文件(src,桌子,“f”);
修改mpcCustomSolver.m
通过添加您自己的自定义求解器。你的求解器必须能够在MATLAB中运行,并在MATLAB脚本或MEX文件中实现。
配置MPC控制器MPCobj
使用自定义求解器。
MPCobj.Optimizer.CustomSolver = true;
该软件现在使用您的自定义求解器模拟代替内置的QP KWIK求解器。
模拟控制器。有关更多信息,请参见模拟.
例如,请参见用自定义QP求解器模拟MPC控制器.
您可以为MPC控制器生成代码,使用自定义QP求解器编写的C/ c++代码或适合代码生成的MATLAB代码。
要在命令行中这样做,您必须拥有MATLAB编码器™软件
要在Simulink中这金宝app样做,你必须有金宝app仿真软件编码器或金宝app仿真软件PLC编码器™软件
要为使用自定义QP求解器的MPC控制器生成代码,请执行以下步骤。
复制解算器模板文件到您的工作文件夹或MATLAB路径上的任何地方,并重命名它mpcCustomSolverCodeGen.m
.要将MATLAB代码模板复制到当前工作文件夹,请在MATLAB命令行中输入以下命令。
src = (“mpcCustomSolverCodeGen_TemplateEML.txt”);dest = fullfile (pwd,“mpcCustomSolverCodeGen.m”);拷贝文件(src,桌子,“f”);
或者,您可以使用C模板。
src = (“mpcCustomSolverCodeGen_TemplateC.txt”);dest = fullfile (pwd,“mpcCustomSolverCodeGen.m”);拷贝文件(src,桌子,“f”);
修改mpcCustomSolverCodeGen.m
通过添加您自己的自定义求解器。
配置MPC控制器MPCobj
使用自定义求解器。
MPCobj.Optimizer.CustomSolverCodeGen = true;
该软件现在使用您的自定义求解器来代替内置的QP KWIK求解器来生成代码。
为控制器生成代码。有关更多信息,请参见生成代码和部署控制器到实时目标.
例如,请参见用自定义QP求解器模拟和生成MPC控制器代码.
您可以为模拟和代码生成实现相同的自定义QP求解器。这样做:
设置两个优化器。CustomSolver
和优化器。CustomSolverCodeGen
来真正的
.
创建两个mpcCustomSolver.m
和mpcCustomSolverCodeGen.m
.
在模拟过程中,控制器使用mpcCustomSolver.m
自定义函数。对于代码生成,控制器使用mpcCustomSolverCodeGen.m
自定义函数。
如果代码适合于代码生成,可以在两个自定义求解器函数中指定相同的MATLAB代码。
如果你实现mpcCustomSolverCodeGen.m
使用C/ c++代码,使用代码创建MEX文件。然后可以调用这个MEX文件mpcCustomSolver.m
.有关创建和使用MEX文件的更多信息,请参见C MEX文件应用程序.
当您实现自定义QP求解器时,您的自定义函数必须具有以下签名之一:
自定义求解器模拟:
函数[x,状态]= mpcCustomSolver (H, f, A, b, x0)
代码生成的自定义求解器:
函数[x,状态]= mpcCustomSolverCodeGen (H, f, A, b, x0)
对于模拟和代码生成,您的自定义求解器具有以下输入和输出参数。
H
是一个Hessian矩阵,指定为n——- - - - - -n对称正定矩阵,其中n为优化变量的个数。
f
目标函数的乘数是否为线性项,指定为长度的列向量n.
一个
矩阵的线性不等式约束系数,指定为米——- - - - - -n矩阵,米为约束的数量。
b
不等式约束方程的右侧,是否指定为长度的列向量米.
x0
是解的初始猜想,指定为长度的列向量吗n.
x
最优解是否以长度列向量的形式返回n.
状态
是解决方案有效性指示器,返回为整数,如下表所示。
价值 | 描述 |
---|---|
> 0 |
x 是最优的。状态 表示优化期间执行的迭代次数。 |
0 |
在没有找到最优解的情况下,迭代次数达到最大值。解决方案 如果 |
-1 |
这个问题似乎是不可行的,也就是说,不能满足约束条件。 |
-2 |
发生了一个不可恢复的数值错误。 |
请注意
MPC控制器期望自定义求解函数在线性不等式约束下求解QP问题
.如果您的自定义求解器使用
,你必须改变两个符号一个
和b
在将它们传递给您的自定义求解器代码之前。
quadprog
自定义QP求解器可以配置MPC对象来使用active-set求解器quadprog
(优化工具箱)功能作为一个自定义QP求解器。
自动配置MPC对象mpcobj
使用quadprog
作为模拟和代码生成的自定义QP求解器,您可以使用setCustomSolver
函数。特别是在MATLAB命令提示符处,输入以下内容。
setCustomSolver (mpcobj quadprog)
mpcCustomSolver.m
和mpcCustomSolverCodeGen.m
,在内部调用quadprog
(优化工具箱).然后,它集mpcobj.Optimizer.CustomSolver
和mpcobj.Optimizer.CustomSolverCodeGen
来真正的
.
您还可以进一步定制这些功能,例如通过调整求解器选项,提供您使用活动设置求解器(因为其他quadprog
解决方案不支持MPC问题)。金宝app
回复mpcobj
中指定的内置算法mpcobj.Optimizer.Algorithm
对于模拟和代码生成,调用setCustomSolver
如下。
setCustomSolver (mpcobj quadprog)
mpcobj.Optimizer.CustomSolver
和mpcobj.Optimizer.CustomSolverCodeGen
来假
.
您可以使用FORCESPRO,一个实时嵌入式优化软件工具,由博英威公司开发,模拟和生成代码的MPC控制器设计使用模型预测控制工具箱软件。从FORCESPRO 2.0开始,Embotech提供了一个插件,利用模型预测控制工具箱软件的设计能力和FORCESPRO的计算性能。使用该插件,您可以生成一个定制的QP解决方案,允许部署在实时硬件上,并根据您的特定MPC问题进行高度优化,以实现令人满意的实时性能。特别是长期的MPC问题可以非常有效地解决。
有关使用FORCESPRO求解器和模型预测控制工具箱软件的信息,请参阅使用Embotech FORCESPRO Solvers实现MPC控制器.
施密德上校和比格勒中尉。约简Hessian SQP的二次规划方法。计算机与化学工程18日,没有。9(1994年9月):817-32。E0001-4 https://doi.org/10.1016/0098 - 1354 (94).
货币政策委员会
|mpcmove
|mpcActiveSetSolver
|mpcInteriorPointSolver