C++ 中的模型预测控制(01/2)

目录

  • 一、说明
  • 二、MPC原理说明
  • 三、分解算法的来源并显示关键特征,
  • 四、C++ 实现说明
  • 五、平衡 Q 和 R
  • 六、资源下载地址

一、说明

   以下文章介绍了应用模型预测控制器的简单控制系统方法。本文讨论了这种控制的基本机制,该机制适用于各种工程领域。

   MPC 涉及对未来系统行为的预测(由一组方程描述的模型)。在优化过程中实现物理模型的所需位置(成本函数)。

   您可以想象,具有系统动态模型(线性时不变 (LTI) 系统中的矩阵 A)的 MPC 模拟或预测模型在未来的位置或行为。然后,控制器计算一系列控制输入,以最小化预定义的成本函数,同时考虑所需的目标和约束。

   出于本文的目的,我在 C++ 中准备了简单的模拟。其目的是展示可以轻松复制的原理,用于更高级的模型动力学。

二、MPC原理说明

   我在C++中完全应用的标准模型预测控制(MPC)公式可以定义如下:

   考虑一个具有以下状态空间表示的离散时间线性系统:
x k + 1 = A ⋅ x k + B ⋅ u k y k = C ⋅ x k x_{k+1}=A \cdot x_k+B \cdot u_k \\ y_k=C\cdot x_k xk+1=Axk+Bukyk=Cxk

这里

  • x k x_k xk 是时间步长 k 的状态向量,

  • U K UK UK 是时间步长 K 的控制输入向量,

  • y k y_k yk 是时间步长 k 的输出向量,

  • A 是状态转移矩阵(模型动力学),

  • B 是控制输入矩阵,

  • C 是输出矩阵。
       模型预测控制 (MPC) 的目标是在满足系统约束的同时,在有限预测范围 N 上最小化成本函数。成本函数通常包括一个二次项,用于惩罚与参考轨迹和控制输入的偏差: 在这里插入图片描述
    这里

  • N 是预测范围,

  • Q 是输出权重矩阵,

  • R 是控制输入权重矩阵,

  • r k + i r_{k+i} rk+i 是时间步长 k+i 的参考轨迹。

  • MPC问题被表述为优化问题,

在这里插入图片描述

   在这里,控制输入 u 和状态 x 位于下限和上限之下。

   这个公式概述了线性离散时间系统的标准模型预测控制的数学结构,我在 C++ 模拟中应用了它。
   在实践中(检查源代码),我们在每个时间步解决这个优化问题,以计算预测范围内的最优控制输入,然后将第一个控制输入应用于系统。
在这里插入图片描述

MPC 概述(作者)

三、分解算法的来源并显示关键特征,

  1. 海森矩阵 (H):通常,黑森矩阵是一个与二阶导数相关的数学概念,它提供有关多元函数曲率的信息。
       在优化的情况下,我们使用 Hassian 来分析临界点(最小值或最大值)附近的目标函数的行为。在我们的特殊情况下,Hessian 对状态和控制输入偏差的二次惩罚进行编码。
  2. 成本向量 (F):向量是预测状态与所需参考状态的偏差和控制输入偏差的零值的组合。该向量表示成本函数的线性项,并指导优化过程以最小化成本。
  3. 优化过程:优化过程旨在找到控制输入的变化,使成本函数最小化。在二次优化问题的上下文中,这是通过求解由优化问题的最优条件产生的一组线性方程来实现的。
       我们求解由最优条件形成的线性方程。此操作计算应应用于当前控制输入的控制输入的最佳变化,以便使系统状态更接近所需的基准电压源,同时将成本降至最低。

四、C++ 实现说明

   请务必仔细查看我的 C++ 实现并考虑这一行,

Eigen::VectorXd control_input_delta = H.colPivHouseholderQr().solve(-f);

   这行代码正在求解 H x = − f Hx=-f Hx=f 形式的线性方程,其中 H 是矩阵,f 是向量。该操作使用QR分解和列枢轴执行,这是一种求解线性系统的数值方法。以下是分步分解:

  1. 矩阵 H 和向量 f:
    H 是表示线性方程组的方阵。
    f 是一个向量,运算涉及它的否定 (-f),它用作线性方程的右侧。
  2. 列旋转QR分解:
    colPivHouseholderQr()计算矩阵 H 的 QR 分解与列透视。
    在 QR 分解中,矩阵 H 被分解为两个矩阵 Q 和 R,其中 Q 是正交矩阵(意味着 Q T ⋅ Q = I Q^T\cdot Q=I QTQ=I其中 I I I是单位矩阵),R 是上三角矩阵。

   列枢轴是一种用于提高分解的数值稳定性的技术,特别是对于接近奇异或条件不良的矩阵。

  1. 求解线性系统:
       该运算用于使用 H 的 QR 分解求解线性系统 Hx = −f。.solve(-f)
    从数学上讲,解 x 可以通过以下方式找到:
    x = Q − 1 ⋅ R − 1 ( − f ) x=Q^{-1}\cdot R^{-1}(-f) x=Q1R1(f)

   由于 Q 是正交的, Q − 1 = Q T Q^{-1}= Q^{T} Q1=QT

   简化计算。解 x 被赋值给变量control_input_delta ,其类型为Eigen::VectorXd

  1. 数学表示:
       整个运算在数学上可以表示为使用QR分解和列枢轴求解方程 H x = − f Hx = −f Hx=f中的x:

x = H − 1 ( − f ) x=H^{-1} (−f) x=H1(f)

   或者更明确地说:
x = ( Q ⋅ R ) − 1 ( − f ) x = ( R ) − 1 ⋅ Q T ( − f ) x=(Q \cdot R)^{-1}(-f) \\ x=(R )^{-1}\cdot Q^{T}(-f) x=(QR)1(f)x=(R)1QT(f)

  1. Q矩阵
    定义:Q 矩阵是一个方形、对称且通常为正的半定矩阵,用于 MPC 的成本函数,用于权衡跟踪参考状态或设定值的重要性。
    在成本函数中的作用:在 MPC 的目标函数中,Q 矩阵乘以状态误差(预测状态和期望状态之间的差值)。
    成本函数的这一部分通常写为 ( x − x r e f ) T Q ( x − x r e f ) (x−x_{ref})TQ(x−x_{ref}) xxrefTQxxref其中 x 是预测状态, x r e f x_{ref} xref 是期望状态或参考。
       目的:Q 矩阵旨在惩罚偏离期望状态的情况。通过调整 Q 中的权重,您可以指定状态向量的哪些方面更需要调节。例如,某些状态的 Q 权重较高意味着控制器将优先最小化这些状态中的错误。
  2. R矩阵
       定义:R 矩阵和 Q 一样,是一个正方形、对称且通常为正定矩阵。它在 MPC 成本函数中用于权衡控制工作量或控制输入。
       成本函数中的作用:R矩阵是涉及控制输入的目标函数项的一部分。这通常写成 uTRu,其中 u 是控制输入向量。
       目的:R矩阵的作用是惩罚过度的控制行为。R 中的权重越大,意味着对大控制输入的惩罚越大,鼓励控制器使用较小的输入,从而可能导致更平滑的控制操作。这对于防止执行器(电机驱动器)上的过多设置或对于不需要或不安全的大控制输入的系统非常重要。

五、平衡 Q 和 R

   Q 和 R 矩阵中的相对值定义了跟踪参考轨迹(状态精度)的重要性和最小化控制工作量之间的权衡。这种权衡是 MPC 控制器设计的核心:

   高 Q 值、低 R:将状态跟踪准确性置于控制工作之上,从而采取积极的控制措施。
   低 Q 值、高 R:优先考虑最大程度地减少控制工作,可能以牺牲跟踪性能为代价。
   下面,我提供了可以在机器上运行的模拟的输出。
   下面的第一个仿真提供了有关 MPC 如何执行以接近所需恒定位置(值)的信息。
在这里插入图片描述

   MPC 性能。模拟 1
   您可以运行的第二个仿真提供 MPC 性能输出,而所需的轨迹具有正弦函数的形状。成本函数(矩阵值 Q、R)的正确选择会影响状态以及系统如何随时间推移而稳定。在这里插入图片描述
MPC 性能。模拟 2MPC 性能。模拟 2。感谢您的阅读。

六、资源下载地址

本文相关的代码下载地址:
https://mp.csdn.net/mp_download/manage/download/UpDetailed

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MPLS VPN功能组件(3)

私网标签分配 通过MPBGP为VPNv4路由分配内层标签 PE从CE接收到IPv4路由后,对该路由加上相应VRF的RD(RD手动配置),使其成为一条VPNV4路由,然后在路由通告中更改下一跳属性为自己,通常是自己的Loopback地址…

[Java][算法 双指针]Day 02---LeetCode 热题 100---04~07

LeetCode 热题 100---04~07 第一题:移动零 思路 找到每一个为0的元素 然后移到数组的最后 但是需要注意的是 要在给定的数组原地进行修改 并且其他非零元素的相对顺序不能改变 我们采用双指针法 定义两个指针i和j i和j一开始分别都在0索引位置 然后判断j所…

PWM输入输出

PWM(Pulse Width Modulation)即脉冲宽度调制,在具有惯性的系统中,可以通过对一系列脉冲的宽度进行制,来等效地获得所需要的模拟参量,常应用于电机控速、开关电源等领域。 PWM参数 PWM 中有三个重要参数&…

关于CSDN的原力分增长规则,一点个人经验

本文章编写于 2024年2月9日 从2022年开始到现在,官方的原力分增减规则已经改过好几版了,有一些规则描述比较模糊,这里总结了一些个人经验。 原力值增长点: 1.每日发布文章一篇10分,两篇15分,上限15分&am…

Qt QML学习(一):Qt Quick 与 QML 简介

参考引用 QML和Qt Quick快速入门全面认识 Qt Widgets、QML、Qt Quick 1. Qt Widgets、QML、Qt Quick 区别 1.1 QML 和 Qt Quick 是什么关系? 1.1.1 从概念上区分 QML 是一种用户界面规范和标记语言,它允许开发人员创建高性能、流畅的动画和具有视觉吸引…

Red Panda Dev C++ Maker 使用说明

https://download.csdn.net/download/HappyStarLap/88804678https://download.csdn.net/download/HappyStarLap/88804678 下载https://download.csdn.net/download/HappyStarLap/88804678: ​ 这个,就是我们将运行的文件。 ​ 里面加了许多我…

解决“org.apache.catalina.startup.Catalina.stopServer 未配置关闭端口。通过OS信号关闭服务器。服务器未关闭“

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl 问题描述 项目部署至Tomcat服务器报错:org.apache.catalina.startup.Catalina.stopServer 未配置关闭端口。通过OS信号关闭服务 器。服务器未关闭;图…

分享90个行业PPT,总有一款适合您

分享90个行业PPT,总有一款适合您 90个行业PPT下载链接:https://pan.baidu.com/s/1bHvhk_42-IFAjNdjPPtMZw?pwd8888 提取码:8888 Python采集代码下载链接:采集代码.zip - 蓝奏云 学习知识费力气,收集整理更不易…

猫头虎分享已解决Bug || 备份失败(Backup Failures):BackupFailureException, DataBackupError ❌

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

熔断机制解析:如何用Hystrix保障微服务的稳定性

微服务与系统的弹性设计 大家好,我是小黑,在讲Hystrix之前,咱们得先聊聊微服务架构。想象一下,你把一个大型应用拆成一堆小应用,每个都负责一部分功能,这就是微服务。这样做的好处是显而易见的,更新快,容错性强,每个服务可以独立部署,挺美的对吧?但是,问题也随之而…

236. 二叉树的最近公共祖先 - 力扣(LeetCode)

题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以…

uni-app x,一个纯原生的Android App开发工具

uni-app x,下一代uni-app,一个神奇的产品。 用vue语法、uni的组件、api,以及uts语言,编译出了kotlin的app。不再使用js引擎和webview。纯纯的kotlin原生app。 uni-app x,让“跨平台开发性能不如原生”的这条曾广为流…

ad18学习笔记十八:如何放置丝印层敷铜?

我画板的时候,需要把板卡顶面丝印层的一个矩形区域,画成白色,但是这个区域内有好几个焊盘,丝印涂色的地方需要避开这几个焊盘,我觉得不能简单的在丝印层画一个矩形完事,最好让丝印层的这个区域,…

图书系统的Web实现(含源码)

源码地址https://gitee.com/an-indestructible-blade/project 注意事项: BorrowBooksWeb\src\main\resources路径下的application.yml文件里面的url,username,password这三个属性和自己的数据库保持一致。 浏览器访问url:http://127.0.0.1:…

Python环境下基于指数退化模型和LSTM自编码器的轴承剩余寿命预测

滚动轴承是机械设备中关键的零部件之一,其可靠性直接影响了设备的性能,所以对滚动轴承的剩余使用寿命(RUL)进行预测是十分必要的。目前,如何准确地对滚动轴承剩余使用寿命进行预测,仍是一个具有挑战的课题。对滚动轴承剩余寿命评估…

Java项目maven打包的包名设置(finalname标签的使用)

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

如何在 emacs 上开始使用 Tree-Sitter(windows)

文章目录 如何在emacs上开始使用Tree-Sitter(windows) 如何在emacs上开始使用Tree-Sitter(windows) 参考:“How to Get Started with Tree-Sitter”。 首先要有一个可运行的emacs,并且它支持Tree-Sitter&…

Django前后端分离之后端实践

django-admin startproject djweb 生成djweb项目 django-admin startapp news 生成news应用 配置models文件 class NewInfo(models.Model):title models.CharField(max_length30)content models.TextField()b_date models.DateField()read models.IntegerFie…

在windows的控制台实现贪吃蛇小游戏

欢迎来到博主的文章 博主id:代码小豪 前言:看懂这篇文章需要具有C语言基础,还要对单链表具有一定的理解。如果你只是想要试玩这个游戏,可以直接在文章末尾找到源码 由于实现贪吃蛇需要调用Win32 API函数,这些函数我会…

PneumoLLM:少样本大模型诊断尘肺病新方法

PneumoLLM:少样本大模型诊断尘肺病新方法 提出背景PneumoLLM 框架效果 提出背景 论文:https://arxiv.org/pdf/2312.03490.pdf 代码:https://github.com/CodeMonsterPHD/PneumoLLM/tree/main 历史问题及其背景: 数据稀缺性问题&a…