QP求解器

模型预测控制器QP求解器将MPC优化问题转换为常规表单QP问题

m 一世 N X 1 2 X H X + F X

受线性不等式限制

一种 X B.

在哪里

  • X是解决方案矢量。

  • H是黑森州的矩阵。在没有在线重量的情况下使用隐式MPC时,该矩阵是恒定的。

  • 一种是线性约束系数的矩阵。使用隐式MPC时,该矩阵是恒定的。

  • B.F是矢量。

在每个控制间隔的开始时,控制器计算HF一种, 和B.或者,如果它们是常量,则检索其预先计算的值。

工具箱使用KWIK算法[1]解决QP问题,这要求奇森人成为积极的明确。在第一个控制步骤中,kwik使用了一个冷启动,其中初始猜测是描述的无约束解决方案不受约束的模型预测控制。如果X满足约束,它是最佳的QP解决方案,X*,算法终止。否则,至少一个线性不等式约束必须满足于平等。在这种情况下,KWIK使用高效的数字鲁棒策略来确定满足标准优化条件的活动约束集。在以下控制步骤中,kwik使用了一个温暖的开始。在这种情况下,在先前的控制步骤中确定的活动约束集成为接下来的初始猜测。

虽然KWIK是强大的,但请考虑以下内容:

  • 由于数值圆偏差误差,可以略微违反一个或多个线性约束。工具箱采用不可调试的相对容差。这种宽容允许约束违规10-6乘以每个术语的幅度。此类违规是正常的,不会生成警告消息。

  • 在测试最佳解决方案时,工具箱还使用非可调节公差。

  • 搜索活动约束集是一个迭代过程。如果迭代达到问题依赖性最大值,则算法终止。对于某些控制器配置,默认的最大迭代可能非常大,可以使QP解算器似乎停止响应(参见MPC.)。

  • 如果您的问题包括硬约束,则可以是不可行(不可能满足)。如果算法检测到不可行,则会立即终止。

在最后两种情况下,通过对搜索的异常结果,控制器保留了最后一个成功的控制输出。有关更多信息,请参阅MPCMOVE.命令。您可以根据需要检测异常结果并覆盖默认行为。

次优QP解决方案

对于具有约束的给定MPC应用程序,无法预测查找最佳解决方案需要多少QP求解器迭代。此外,在实时应用程序中,迭代的数量可以从一个控制间隔到下一个控制间隔急剧变化。在这种情况下,最坏情况的执行时间可能超过硬件平台上允许的限制,并由控制器采样时间确定。

在优化迭代次数超过指定的最大值后,可以保证MPC控制器的最坏情况执行时间。要设置最坏情况的执行时间,首先通过在标称条件下尝试控制器来确定单个优化迭代所需的时间。然后,在每个控制间隔设置迭代次数的上限。例如,如果需要大约1 ms以计算硬件上的每个迭代,并且控制器采样时间为10 ms,则设置不大于的最大迭代次数10.

mpcobj.optimizer.maxiter = 10;

默认情况下,MPC控制器对象具有下限120.在最大迭代次数。

默认情况下,当求解器达到没有最佳解决方案的求解器迭代的最大数量时,控制器将操纵变量保持在以前的值。要使用最终迭代后达到的次优溶液,请设置使用imeryuboptimalsolution.选择真的

mpcobj.optimizer.usesuboptimalsolutizer = true;

虽然解决方案不是最佳的,但在应用时,它满足您所有指定的约束。

无法保证次优解决方案比保持控制器输出常数更好。您可以使用这两种方法模拟系统,然后选择提供更好控制器性能的配置。

例如,看到在快速MPC应用中使用次优解

自定义QP应用程序

要访问内置kwik求解器,以获取需要解决在线QP问题的应用程序,请使用MPCQPSolver.命令。此选项可用:

  • 高级MPC应用程序,超出了模型预测控制工具箱™软件的范围。

  • 自定义QP应用程序,包括需要代码生成的应用程序。

定制QP求解器

模型预测控制工具箱软件允许您为MPC控制器指定自定义QP求解器。该求解器被调用替代内置的qpkwik.每个控制间隔的求解器。此选项可用:

  • 使用第三方求解器验证您的模拟结果或生成代码。

  • 内置kwik求解器的大MPC问题慢慢运行或无法找到可行的解决方案。

您可以定义用于模拟或代码生成的自定义求解器。在任何一种情况下,使用自定义函数定义自定义求解器,并配置控制器以使用此自定义功能。

自定义求解器功能 受影响的matlab.®功能 受影响的Simul金宝appink.®

模拟

优化器.Customsolver真的

Optimizer.CustomsolverCodegen.被忽略了。

mpccustomsolver.m

金宝app支持:

  • MATLAB代码

  • MEX文件

  • SIM

  • MPCMOVE.

  • mpcmoveadaptive

  • mpcmovemultiple

  • mpcmovecodegeneration.

  • MPC控制器

  • 自适应MPC控制器

  • 多个MPC控制器

代码生成

Optimizer.CustomsolverCodegen.真的

优化器.Customsolver被忽略了。

mpccustomsolvercodegen.m.

金宝app支持:

  • MATLAB代码适用于代码生成

  • C / C ++代码

  • mpcmovecodegeneration.

实现自定义求解器进行仿真

使用自定义QP求解器模拟MPC控制器:

  1. 将Solver模板文件复制到工作文件夹或MATLAB路径上的任何位置,并重命名mpccustomsolver.m。要将Solver模板复制到当前工作文件夹,请在MATLAB命令行中键入以下内容。

    src =哪个('mpccustomsolver.txt');dest = fullfile(pwd,'mpccustomsolverm');COPYFILE(SRC,DEST,'F');
  2. 调整mpccustomsolver.m通过添加您自己的自定义求解器。您的求解器必须能够在MATLAB中运行,并在MATLAB脚本或MEX文件中实现。

  3. 配置MPC控制器mpcobj.使用自定义求解器。

    mpcobj.optimizer.customsolver = true;

    该软件现在使用自定义求解器进行仿真代替内置QP kwik求解器。

  4. 模拟你的控制器。有关更多信息,请参阅模拟

例如,看到使用自定义QP求解器模拟MPC控制器

为代码生成实现自定义求解器

您可以为MPC控制器生成代码,用于使用以C / C ++代码或MATLAB代码编写的自定义QP求解器,适用于代码生成。这样做:

  • 在命令行需要Matlab Coder™软件。

  • 在Si金宝appmulink需要金宝appSimulink编码器要么金宝appSimulink PLC编码器™软件。

为使用自定义QP求解器生成MPC控制器的代码:

  1. 将Solver模板文件复制到工作文件夹或MATLAB路径上的任何位置,并重命名mpccustomsolvercodegen.m.。要将MATLAB代码模板复制到当前工作文件夹,请在MATLAB命令行中键入以下内容。

    src =哪个('mpccustomsolvercodegen_templateEml.txt');dest = fullfile(pwd,'mpccustomsolvercodegen.m');COPYFILE(SRC,DEST,'F');

    或者,您可以使用C模板。

    src =哪个('mpccustomsolvercodegen_templatec.txt');dest = fullfile(pwd,'mpccustomsolvercodegen.m');COPYFILE(SRC,DEST,'F');
  2. 调整mpccustomsolvercodegen.m.通过添加您自己的自定义求解器。

  3. 配置MPC控制器mpcobj.使用自定义求解器。

    mpcobj.optimizer.customsolvercodegen = true;

    该软件现在使用您的自定义求解器进行代码生成代替内置QP kwik求解器。

  4. 为控制器生成代码。有关更多信息,请参阅生成代码并将控制器部署到实时目标

例如,看到使用自定义QP求解器模拟和生成MPC控制器的代码

实现用于仿真和代码生成的自定义求解器

您可以为模拟和代码生成实现相同的自定义QP求解器。为此,您必须:

  • 设置两者优化器.CustomsolverOptimizer.CustomsolverCodegen.真的

  • 创建两者mpccustomsolver.mmpccustomsolvercodegen.m.

在模拟期间,您的控制器使用mpccustomsolver.m自定义功能。对于代码生成,您的控制器使用mpccustomsolvercodegen.m.自定义功能。

只要代码适用于代码生成,您可以在自定义求解器功能中指定相同的MATLAB代码。

如果你实施mpccustomsolvercodegen.m.使用C / C ++代码,使用代码创建MEX文件。然后,您可以从此调用此MEX文件mpccustomsolver.m。有关创建和使用MEX文件的详细信息,请参阅C MEX文件应用程序(matlab)。

自定义求解器参数描述

实现自定义QP求解器时,您的自定义函数必须具有以下签名之一:

  • 使用自定义求解器进行仿真:

    功能[x,状态] = MPCCSTOMSolver(H,F,A,B,X0)
  • 使用自定义求解器进行代码生成:

    功能[x,status] = mpccustomsolvercodegen(h,f,a,b,x0)

在这两种情况下,您的自定义求解器都具有以下输入和输出参数:

  • H是一个黑森州矩阵,指定为一个N-经过-N对称正定矩阵,在哪里N是优化变量的数量。

  • F是目标函数线性术语的乘数,指定为长度的列向量N

  • 一种是线性不等式约束系数的矩阵,指定为m-经过-N矩阵,其中m是约束的数量。

  • B.是不等式约束方程的右侧,指定为长度的列向量m

  • X0.是解决方案的初始猜测,指定为长度的列向量N

  • X是最佳解决方案,作为长度的柱矢量返回N

  • 地位是解决方案有效性指示符,根据以下内容返回整数:

    价值 描述
    > 0 X是最佳的。地位表示在优化期间执行的迭代次数。
    0.

    达到最大迭代次数而不找到最佳解决方案。解决方案,X,可能是次优或不可行的。

    如果是优化器.Usesuboptimalsolution.控制器的属性是真的,控制器使用次优解决方案X什么时候地位0.

    -1 问题似乎是不可行的,即约束 一种 X B. 不能满意。
    -2 发生了不可恢复的数值错误。

参考

[1] Schmid,C.和L.T.Biegler,“减少黑森州SQP的二次编程方法”电脑与化学工程,卷。18,第9,1994号,第817-832页。

也可以看看

||

相关话题