MATLAB - MPC - QP Solvers

系列文章目录


前言

        模型预测控制器 QP 求解器将线性 MPC 优化问题转换为一般形式的 QP 问题

${\underset{x}{M i n} } (\frac{1}{2}x^{​{T}}H x+f^{​{T}}x)$

        受到线性不等式约束

$A x\leq b$

        其中

  • x 是解向量。
  • H 是黑森矩阵。当预测模型和调整权重在运行时不发生变化时,该矩阵保持不变。
  • A 是线性约束系数矩阵。当预测模型在运行时不发生变化时,该矩阵保持不变。
  • b 和 f 是向量。

        在每个控制区间开始时,控制器会计算 H、f、A 和 b。 如果 H 或 A 是常数,控制器会检索它们的预计算值。


一、内置的QP求解器

        模型预测控制工具箱 (Model Predictive Control Toolbox™) 软件支持两种解决 QP 问题的内置算法。这两种求解器都要求 Hessian 矩阵为正定(positive definite)矩阵。

  • 主动集求解器(Active-set solver) - 该求解器可以为单精度和双精度的中小型优化问题提供快速、稳健的性能。主动集求解器使用的是 [1] 中的 KWIK 算法。要使用主动集求解器,请将 MPC 控制器的 Optimizer.Algorithm 属性设置为 "主动集"。要配置算法设置,请使用控制器的 Optimizer.ActiveSetOptions 属性。
  • 内部点求解器(Interior-point solver) - 这种求解器可以为大规模优化问题提供卓越的性能,例如在大型预测和控制范围内执行约束的 MPC 应用程序。该内部点求解器使用带有 Mehrotra 预测器-校正器的基元-二元算法。要使用内部点求解器,请将 MPC 控制器的 Optimizer.Algorithm 属性设置为 "内部点"。要配置算法设置,请使用控制器的 Optimizer.InteriorPointOptions 属性。

1.1 求解器配置 

        在为您的应用选择和配置 QP 求解器时,请考虑以下几点:

  • MPC 问题的大小和配置会影响内置 QP 求解器的性能。要确定哪种求解器最适合您的应用,请考虑使用两种 QP 求解器在多个仿真场景中对控制器进行仿真。
  • 与主动集求解器相比,内点求解器对求解器参数更为敏感。因此,可能需要进行更多调整,才能在性能和鲁棒性之间找到最佳平衡。
  • 在测试最优解时,主动集求解器也会使用不可调整的公差。您可以调整内点求解器的优化公差。
  • 由于数值舍入误差,一个或多个线性约束可能会受到轻微违反。这种违规是正常的,不会产生警告信息。要调整可接受的约束条件违反容差,请使用主动集求解器或内部点求解器的约束条件容差设置。
  • 搜索 QP 解法是一个迭代过程。对于任一求解器,都可以使用相应的 MaxIterations 设置来指定最大迭代次数。如果迭代次数达到最大值,算法就会终止。
  • 主动集求解器的默认最大迭代次数为 $4(n_{c}+n_{c})$ 其中 nc 和 nv 分别是整个预测范围内的约束条件和优化变量的数量。对于某些控制器配置,该值可能非常大,从而导致 QP 求解器停止响应。该值的下限为 120。
  • 内点求解器的默认最大迭代次数为 50。
  • 如果您的 MPC 问题在转换为 QP 问题后包含硬约束,则 QP 不等式约束可能不可行(无法满足)。如果 QP 求解器检测到不可行,它会立即终止。

        当求解器检测到问题不可行或迭代次数达到最大值但未找到最优解时,控制器会保留上次成功的控制输出。更多信息,请参阅 mpcmove(mpcmove)。您可以检测异常结果,并根据需要覆盖默认行为。

        在第一个控制步骤中,QP 求解器使用冷启动,初始猜测是无约束模型预测控制中描述的无约束解(Unconstrained Model Predictive Control)。如果 x 满足约束条件,它就是最优 QP 解,算法终止。否则,至少有一个线性不等式约束必须满足相等条件,求解器将计算出最优解。对于后续控制步骤:

  • 主动集求解器使用热启动,上一个控制步骤中确定的主动约束集成为初始猜测。
  • 内点求解器继续使用冷启动。

1.2 自定义 QP 应用程序

        要为需要解决在线 QP 问题的应用访问 QP 求解器,可使用 mpcActiveSetSolver 和 mpcInteriorPointSolver 函数,它们在以下方面非常有用:

  • 超出模型预测控制工具箱软件范围的高级 MPC 应用程序。
  • 自定义 QP 应用程序,包括需要生成代码的应用程序。

二、自定义 QP 解算器

        模型预测控制工具箱软件可让您为 MPC 控制器指定自定义 QP 求解器。在每个控制区间,该求解器都会被调用,以替代内置求解器。该选项可用于

  • 验证仿真结果或使用您信任的内部第三方求解器生成代码。
  • 内置求解器无法为特定问题提供满意性能的应用。

        您可以为仿真或代码生成定义自定义求解器。无论在哪种情况下,您都可以使用自定义函数定义自定义求解器,并将控制器配置为使用该自定义函数。

TaskCustom Solver FunctionAffected MATLAB® FunctionsAffected Simulink® Blocks

Simulation

Set Optimizer.CustomSolver to true.

Optimizer.CustomSolverCodeGen is ignored.

mpcCustomSolver.m

Supports:

  • MATLAB code

  • MEX files

  • sim

  • mpcmove

  • mpcmoveAdaptive

  • mpcmoveMultiple

  • mpcmoveCodeGeneration

  • MPC Controller

  • Adaptive MPC Controller

  • Multiple MPC Controllers

Code Generation

Set Optimizer.CustomSolverCodeGen to true.

Optimizer.CustomSolver is ignored.

mpcCustomSolverCodeGen.m

Supports:

  • MATLAB code suitable for code generation

  • C/C++ code

  • mpcMoveCodeGeneration

自定义仿真求解器
要使用自定义 QP 求

2.1 自定义仿真求解器

        要使用自定义 QP 求解器模拟 MPC 控制器,请执行以下步骤。

  1. 将求解器模板文件复制到工作文件夹或 MATLAB 路径上的任意位置,并将其重命名为 mpcCustomSolver.m。
    src = which('mpcCustomSolver.txt');
    dest = fullfile(pwd,'mpcCustomSolver.m');
    copyfile(src,dest,'f');
  2. 修改 mpcCustomSolver.m,添加自己的自定义求解器。您的求解器必须能在 MATLAB 中运行,并在 MATLAB 脚本或 MEX 文件中实现。
  3. 配置 MPC 控制器 mpcobj 以使用自定义求解器。
    mpcobj.Optimizer.CustomSolver = true;
  4. 模拟控制器。更多信息,请参阅仿真(Simulation)。

        有关示例,请参阅使用自定义 QP 求解器模拟 MPC 控制器(Simulate MPC Controller with a Custom QP Solver)。

三、将 quadprog 用作自定义 QP 求解器

        可以将 MPC 对象配置为使用 quadprog(优化工具箱)函数提供的活动集求解器作为自定义 QP 求解器。

        要自动配置 MPC 对象 mpcobj 在仿真和代码生成中使用 quadprog 作为自定义 QP 求解器,可以使用 setCustomSolver 函数。具体来说,在 MATLAB 命令提示符下输入以下内容。

setCustomSolver(mpcobj,'quadprog')

        该命令将在当前文件夹下生成 mpcCustomSolver.m 和 mpcCustomSolverCodeGen.m 文件,它们在内部调用 quadprog(优化工具箱)。然后将 mpcobj.Optimizer.CustomSolver 和 mpcobj.Optimizer.CustomSolverCodeGen 设置为 true。
您还可以进一步自定义这些功能,例如调整求解器选项,前提是您使用的是 active-set 求解器(因为 MPC 问题不支持其他 quadprog 求解器)。

        要将 mpcobj 恢复为使用 mpcobj.Optimizer.Algorithm 中指定的内置算法进行仿真和代码生成,请调用 setCustomSolver,具体如下。

setCustomSolver(mpcobj,'quadprog')

        此命令将 mpcobj.Optimizer.CustomSolver 和 mpcobj.Optimizer.CustomSolverCodeGen 设置为 false。

四、与 FORCESPRO 仿真器积分器集成

        您可以使用由 Embotech AG 开发的实时嵌入式优化软件工具 FORCESPRO,为使用模型预测控制工具箱软件设计的 MPC 控制器进行仿真并生成代码。从 FORCESPRO 2.0 开始,Embotech 提供了一个插件,利用模型预测控制工具箱软件的设计功能和 FORCESPRO 的计算性能。使用该插件,您可以生成一个自定义 QP 求解器,该求解器允许部署在实时硬件上,并根据您的特定 MPC 问题进行了高度优化,以达到令人满意的实时性能。尤其是长跨度 MPC 问题可以得到非常高效的解决。

        有关将 FORCESPRO 求解器与模型预测控制工具箱软件结合使用的信息,请参阅 "使用 Embotech FORCESPRO 求解器实施 MPC 控制器"。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/229508.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Eclipse 自动生成注解,如果是IDEA可以参考编译器自带模版进行修改

IDEA添加自动注解 左上角选择 File -> Settings -> Editor -> File and Code Templates&#xff1b; 1、添加class文件自动注解&#xff1a; ​/*** <b>Function: </b> todo* program: ${NAME}* Package: ${PACKAGE_NAME}* author: Jerry* date: ${YEA…

介绍strncpy函数

strncpy函数需要引用#include <string.h>头文件 函数原型&#xff1a; char *_Dest 是字符串的去向 char *_Source是字符串的来源 size_t_Count是复制字符串的大小 #include <stdio.h> #include <string.h> int main() { char arr[128] { \0 }; …

【JAVA-Day69】抛出异常的精髓:深度解析 throw、throws 关键字,优雅处理异常问题

抛出异常的精髓&#xff1a;深度解析 throw、throws 关键字&#xff0c;优雅处理异常问题 &#x1f680; 抛出异常的精髓&#xff1a;深度解析 throw、throws 关键字&#xff0c;优雅处理异常问题 &#x1f680;一、什么是抛出异常 &#x1f60a;二、如何抛出异常 &#x1f914…

什么是计算机网络?计算机网络基础知识

1.网络的组成部分&#xff1a;由主机&#xff0c;路由器&#xff0c;交换机等组成 2.网络结构&#xff1a;网络的网络 3.信息交换方式&#xff1a;电路交换和分组交换 4.网络分层&#xff1a;分清职责&#xff0c;物理层&#xff0c;链路层&#xff0c;网络层&#xff0c;运…

IDEA中如何使用Vue

一、在IDEA中安装Vue插件 1.先点击File-->Settings-->Plugins 2.点击进去后在Marketplace下的搜索框搜索Vue.js插件进行下载&#xff0c;下载完后点击Install 3.上一步操作进行完后&#xff0c;点击Installed在其搜索框下搜索Vue插件并且进行勾选&#xff0c;勾选后点…

0x23 剪枝

0x23 剪枝 剪枝&#xff0c;就是减少搜索树规模&#xff0c;尽早排除搜索树中不必要的分支的一种手段。形象地看&#xff0c;就好像剪掉了搜索树的枝条&#xff0c;故被称为“剪枝”。在深度优先搜索中&#xff0c;有以下几类常见的剪枝方法&#xff1a; 1.优化搜索顺序 在一…

MetaAI语音翻译大模型Seamless登场,主打AI无缝同声传译

论文题目&#xff1a; Seamless: Multilingual Expressive and Streaming Speech Translation 论文链接&#xff1a; https://ai.meta.com/research/publications/seamless-multilingual-expressive-and-streaming-speech-translation/ 代码链接&#xff1a; GitHub - facebook…

DSP捕获输入简单笔记

之前使用stm32的大概原理是&#xff1a; 输入引脚输入一个脉冲&#xff0c;捕获1开始极性捕获&#xff0c;捕获的是从启动捕获功能开始计数&#xff0c;捕获的是当前的计数值&#xff1b; 例如一个脉冲&#xff0c;捕获1捕获上升沿&#xff0c;捕获2捕获下降沿&#xff1b;而两…

爬虫工作量由小到大的思维转变---<第十二章 Scrapy之sql存储与爬虫高效性的平衡艺术>

前言: (本文仅属于技术性探讨,不属于教文) 刚好&#xff0c;前阵子团队还在闲聊这个问题呢。你知道吗&#xff0c;在数据收集这个行当里&#xff0c;怎么存数据这问题就跟“先有鸡还是先有蓝”一样&#xff0c;没完没了的循环往复。老规矩&#xff0c;咱们先搞清楚我们的“鸡…

reactive数据不响应

我们知道&#xff0c;reactive函数用于创建对象等复杂数据的响应式代理对象&#xff0c;当该对象的属性发生变化时&#xff0c;会自动触发视图更新。 但在Vue 3中&#xff0c;当我们使用reactive创建的对象或数组进行赋值时&#xff0c;尽管能够完成正常的赋值操作&#xff0c…

Linux 系统开机启动流程

可能没有完全理解&#xff0c;后期整理完Linux的内容&#xff0c;应该理解会深入一些&#xff0c;试着用更简洁的方式和图形来记录&#xff0c;以及一些概念的完善 2023-12-14 一、开机流程 BIOS MBR/GPT 加载 BIOS 的硬件信息与进行自检&#xff0c;并依据设定取得第一个可…

TrustZone之调试、跟踪和分析

接下来,我们将查看系统中的调试和跟踪组件,如下图所示: 现代Arm系统包括支持调试和性能分析的广泛功能。在TrustZone中,我们必须确保这些功能不能被用来危害系统的安全性。 关于调试功能,考虑开发新的SoC。不同的开发人员被信任调试系统的不同部分。芯片公司的工程…

第十九章 : Spring Boot 集成RabbitMQ(三)

第十九章 : Spring Boot 集成RabbitMQ(三) 前言 本章节重点:RabbitMQ消息确认机制的代码示例:生产者消息确认机制、Return消息机制、消费端ACK和Nack机制3种消息确认模式。 Springboot 版本 2.3.2.RELEASE ,RabbitMQ 3.9.11,Erlang 24.2消息确认的场景 使用RabbitMQ很…

SearchWP WordPress高级网站内容搜索插件(包含所有专业扩展)

点击阅读SearchWP WordPress高级网站内容搜索插件(包含所有专业扩展)原文 SearchWP WordPress高级网站内容搜索插件是一个非常强大的工具&#xff0c;可以显着增强您网站的搜索功能。通过向网站访问者提供高度相关和精确的搜索结果&#xff0c;它可以有效地简化他们的搜索过程…

C语言使用posix正则表达式库

在C语言中&#xff0c;你可以使用 POSIX 正则表达式库&#xff08;regex.h&#xff09;来进行正则表达式的模式匹配。POSIX 正则表达式库提供了一组函数来编译、执行和释放正则表达式。 下面是使用 POSIX 正则表达式库的基本步骤&#xff1a; 包含头文件 <regex.h>&…

项目管理软件助力科研项目管理

作为一名研究人员&#xff0c;你可能会觉得你的成功取决于你的研究有多创新和你工作有多努力。实际上&#xff0c;创新和勤奋很重要&#xff0c;但聪明地工作也很重要。如果你是那种在早上打开电子邮件并开始自上而下的工作的人&#xff0c;你可能很快就会发现你的电子邮件多得…

论文降重宝同义词替换功能的优势与特点 PaperBERT

大家好&#xff0c;今天来聊聊论文降重宝同义词替换功能的优势与特点&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff0c;可以借助此类工具&#xff1a; 标题&#xff1a;论文降重宝同义词替换功能的优势与特…

C# WPF上位机开发(函数运行时间分析)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 上位机除了基本功能和稳定性之外&#xff0c;还有一个要注意的就是运行效率的问题。如果我们想提高软件的运行效率&#xff0c;单位时间做更多的工…

GoLand couldn‘t start listener: listen tcp 198.18.0.45:53638

项目场景&#xff1a; 使用Goland以Debug的方式运行&#xff0c;无法启动 问题描述 GoLand couldnt start listener: listen tcp 198.18.0.45:53638按照提示去查看端口发现并没有占用清除Goland缓存重启没有用下载安装Delve还是无法启动 原因分析&#xff1a; debug的过程中…

1.新入手的32位单片机资源和资料总览

前言&#xff1a; 学了将近1年的linux驱动和uboot&#xff0c;感觉反馈不足&#xff0c;主要是一直在学各种框架&#xff0c;而且也遇到了门槛&#xff0c;比如驱动部分&#xff0c;还不能随心所欲地编程&#xff0c;原因是有些外设的原理还不够深刻、有些复杂的底层驱动的代码…