模型预测控制:线性MPC

模型预测控制:线性MPC

模型预测控制(Model Predictive Control, MPC)是一种广泛应用于工业过程控制和自动驾驶等领域的先进控制技术。MPC通过在线解决优化问题来计算控制输入,从而实现系统的最优控制。本文将介绍线性MPC的系统模型、优化问题、LMPC算法,以及单输入系统和多输入系统的具体应用。

系统模型(离散时间线性时不变 (LTI) 系统)

在线性MPC中,系统模型通常假设为离散时间线性时不变(LTI)系统。LTI系统的状态空间模型可以表示为:

x k + 1 = A x k + B u k x_{k+1} = Ax_k + Bu_k xk+1=Axk+Buk

其中:

  • x k x_k xk是时间步 k k k的系统状态向量
  • u k u_k uk是时间步 k k k的控制输入向量
  • A A A 是状态转移矩阵
  • B B B 是输入矩阵

输出方程通常为:

y k = C x k + D u k y_k = Cx_k + Du_k yk=Cxk+Duk

其中:

  • y k y_k yk 是时间步 k k k的输出向量
  • C C C 是输出矩阵
  • D D D 是直接传输矩阵

优化问题

在MPC中,控制输入是通过解决一个在线优化问题来确定的。优化问题的目标是最小化一个代价函数(通常是一个二次型函数),并满足系统的约束条件。典型的代价函数包括以下两部分:

  1. 状态跟踪误差:衡量实际状态与目标状态之间的差距。
  2. 控制输入:控制输入的大小,避免过大的控制动作。

代价函数通常可以表示为:

J = ∑ i = 0 N − 1 ( x k + i ∣ k T Q x k + i ∣ k + u k + i ∣ k T R u k + i ∣ k ) + x k + N ∣ k T P x k + N ∣ k J = \sum_{i=0}^{N-1} \left( x_{k+i|k}^T Q x_{k+i|k} + u_{k+i|k}^T R u_{k+i|k} \right) + x_{k+N|k}^T P x_{k+N|k} J=i=0N1(xk+ikTQxk+ik+uk+ikTRuk+ik)+xk+NkTPxk+Nk

其中:

  • N N N是预测时域长度
  • Q Q Q 是状态误差权重矩阵
  • R R R 是控制输入权重矩阵
  • P P P 是终端状态权重矩阵

优化问题需要满足系统的动态方程和控制输入的约束:

x k + i + 1 ∣ k = A x k + i ∣ k + B u k + i ∣ k ∀ i = 0 , … , N − 1 x m i n ≤ x k + i ∣ k ≤ x m a x ∀ i = 1 , … , N u m i n ≤ u k + i ∣ k ≤ u m a x ∀ i = 0 , … , N − 1 \begin{align*} x_{k+i+1|k} &= A x_{k+i|k} + B u_{k+i|k} \quad \forall i = 0, \ldots, N-1 \\ x_{min} &\leq x_{k+i|k} \leq x_{max} \quad \forall i = 1, \ldots, N \\ u_{min} &\leq u_{k+i|k} \leq u_{max} \quad \forall i = 0, \ldots, N-1 \end{align*} xk+i+1∣kxminumin=Axk+ik+Buk+iki=0,,N1xk+ikxmaxi=1,,Nuk+ikumaxi=0,,N1

LMPC算法

线性模型预测控制(LMPC)算法的步骤如下:

  1. 状态估计:获取当前状态 x k x_k xk
  2. 优化求解:解决当前时刻的优化问题,得到预测时域内的最优控制输入序列 { u k ∣ k , u k + 1 ∣ k , … , u k + N − 1 ∣ k } \{u_{k|k}, u_{k+1|k}, \ldots, u_{k+N-1|k}\} {ukk,uk+1∣k,,uk+N1∣k}
  3. 应用控制:应用当前时刻的控制输入 u k = u k ∣ k u_k = u_{k|k} uk=ukk
  4. 滚动优化:将预测时域向前推进一个时间步长,重复以上步骤。

单输入系统

对于单输入单输出(SISO)系统,模型和控制输入的表示会更加简单。假设系统状态向量 x k x_k xk为一维向量,控制输入 u k u_k uk也是一维标量。系统模型可以表示为:

x k + 1 = a x k + b u k x_{k+1} = ax_k + bu_k xk+1=axk+buk

输出方程为:

y k = c x k + d u k y_k = cx_k + du_k yk=cxk+duk

优化问题与多输入系统相同,只是矩阵 A A A B B B C C C D D D变成了标量。

多输入系统

对于多输入多输出(MIMO)系统,状态向量 x k x_k xk、控制输入向量 u k u_k uk和输出向量 y k y_k yk均为多维向量。系统模型可以表示为:

x k + 1 = A x k + B u k x_{k+1} = A x_k + B u_k xk+1=Axk+Buk

输出方程为:

y k = C x k + D u k y_k = C x_k + D u_k yk=Cxk+Duk

MIMO系统的优化问题和单输入系统类似,只是需要处理更高维度的矩阵。

代码示例

以下是一个简单的Python代码示例,展示如何实现单输入单输出系统的线性MPC:

import numpy as np
from scipy.linalg import solve_discrete_are
import matplotlib.pyplot as plt# 定义系统模型
A = np.array([[1.0]])  # 状态转移矩阵
B = np.array([[1.0]])  # 控制输入矩阵
C = np.array([[1.0]])  # 输出矩阵
D = np.array([[0.0]])  # 直通项矩阵# 定义MPC参数
Q = np.array([[1.0]])  # 状态权重矩阵
R = np.array([[1.0]])  # 控制权重矩阵
N = 10  # 预测时域长度# 离散时间代数Riccati方程求解P矩阵
P = solve_discrete_are(A, B, Q, R)# 计算K矩阵
K = np.linalg.inv(B.T @ P @ B + R) @ (B.T @ P @ A)# 目标设置
x_target = np.array([[5]])  # 目标状态
u_target = 0  # 目标控制输入# 初始化状态
x = np.array([[0.0]])  # 初始状态# 仿真时间
T = 50
x_trajectory = []
u_trajectory = []for t in range(T):# 计算控制输入u = -K @ (x - x_target) + u_target# 应用控制输入并更新状态x = A @ x + B @ u# 记录状态和控制输入x_trajectory.append(x.item())u_trajectory.append(u.item())# 绘制结果
plt.figure(figsize=(12, 6))plt.subplot(2, 1, 1)
plt.plot(x_trajectory, label='State x')
plt.axhline(y=x_target.item(), color='r', linestyle='--', label='Target x')
plt.title('State Trajectory')
plt.xlabel('Time step')
plt.ylabel('State')
plt.legend()plt.subplot(2, 1, 2)
plt.plot(u_trajectory, label='Control Input u')
plt.axhline(y=u_target, color='r', linestyle='--', label='Target u')
plt.title('Control Input Trajectory')
plt.xlabel('Time step')
plt.ylabel('Control Input')
plt.legend()plt.tight_layout()
plt.show()

在这里插入图片描述

代码说明:

  1. 系统模型定义

    • ABCD 分别为状态转移矩阵、控制输入矩阵、输出矩阵和直通项矩阵。
    • 对于SISO系统,所有矩阵都是1x1的。
  2. MPC参数

    • QR 是权重矩阵,用于调整状态和控制输入在优化中的重要性。
    • N 是预测时域的长度,决定了MPC预测未来多少步。
  3. 离散时间代数Riccati方程求解

    • 使用scipy.linalg.solve_discrete_are函数求解P矩阵。
    • 计算反馈增益矩阵K
  4. 目标设置

    • x_target 是目标状态。
    • u_target 是目标控制输入。
  5. 初始化状态

    • x 是初始状态。
  6. 仿真循环

    • 在每个时间步t,计算控制输入u,更新状态x,并记录状态和控制输入的轨迹。
  7. 结果绘制

    • 使用matplotlib库绘制状态和控制输入的轨迹。

该代码实现了一个简单的MPC控制器,能根据给定的线性系统模型和MPC参数在预测时域内优化控制输入,以使系统状态逼近目标状态。
该代码定义了一个简单的SISO系统,并实现了线性MPC算法,最终绘制了系统状态随时间变化的图。

结论

线性MPC是一种强大的控制技术,能够处理复杂的控制问题,尤其是在存在约束和不确定性的情况下。通过在线解决优化问题,MPC可以实现系统状态的最优控制。本文介绍了线性MPC的基本概念、系统模型、优化问题、算法步骤,以及单输入和多输入系统的具体应用,并提供了一个简单的Python代码示例。

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

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

相关文章

融资担保行业数字化转型探索与实践

融资担保行业数字化转型探索与实践 随着全球经济的快速发展和科技的不断进步,数字化转型已成为各行各业提升竞争力和实现可持续发展的必然选择。融资担保行业作为金融体系中的重要组成部分,也在积极探索和实践数字化转型,以更好地服务中小微企…

海外媒体发稿:2个必选媒体宣发套餐引爆影响力-华媒舍

本文旨在介绍2个必选媒体宣发套餐的特点及其如何引爆影响力。 在当今竞争激烈的媒体环境中,有效的宣传和推广策略对于企业和个人的成功至关重要。这就是为什么选择正确的宣发套餐成为了一个关键的决策。 2. 媒体宣发套餐概述 媒体宣发套餐是一种综合性的宣传方案&…

14 卡尔曼滤波及代码实现

文章目录 14 卡尔曼滤波及代码实现14.0 基本概念14.1 公式推导14.2 代码实现 14 卡尔曼滤波及代码实现 14.0 基本概念 卡尔曼滤波是一种利用线性系统状态方程,通过系统输入输出观测数据,对系统状态进行最优估计的算法。由于观测数据包括系统中的噪声和…

【Linux】服务器被work32病毒入侵CPU占用99%

文章目录 一、问题发现二、问题解决2.1 清楚病毒2.2 开启防火墙2.3 修改SSH端口2.4 仅使用凭据登录(可选) 一、问题发现 我的一台海外服务器,一直只运行一项服务(你懂的),但是前不久我发现CPU占用99%。没在…

PTA:7-12 斐波那契数列

斐波那契数列 (FibonacciSequence),又称黄金分割数列,因数学家莱昂纳多斐波那契 (LeonardoFibonacci) 以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1,1,2,3,5,8,13,21,⋯ 在数学上,斐…

如何用Go语言,实现基于宏系统的解释器?

目录 一、Go语言介绍二、什么是宏系统三、什么是解释器四、如何用Go语言实现一个基于宏系统的解释器? 一、Go语言介绍 Go语言,又称为Golang,是一种由谷歌公司开发并开源的编程语言。Go语言的设计目标是提高程序员的生产力,同时具…

MFC扩展库BCGControlBar Pro v35.0新版亮点 - 工具栏、菜单全新升级

BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中,并为您节省数百个开发和调试时间。 BCGControlBar专业版 v35.0已全新发布了,这个版本改进类Visual Studio 2022的视觉主题、增强对多个…

算法力扣刷题记录 二十三【151.翻转字符串里的单词】

前言 字符串篇,继续。 记录 二十三【151.翻转字符串里的单词】 – 一、题目阅读 给你一个字符串 s ,请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 单词…

【04】从0到1构建AI生成思维导图应用 -- 创建 AI 工作流

【04】从0到1构建AI生成思维导图应用 – 创建 AI 工作流 大家好!最近自己做了一个完全免费的AI生成思维导图的网站,支持下载,编辑和对接微信公众号,可以在这里体验:https://lt2mind.zeabur.app/ 上一章:h…

centos7安装mysql8-zabbix6.4

MySQL rpm -qa | grep mysql #查看是否已经安装 Mysql rpm -qa | grep mariadb #查看是否已经安装 mariadb,CentOS 7可视化安装会默认安装该数据库,安装MySQL前需要卸载该数据库 rpm -e --nodeps mariadb-libs #删除mariadb数据库找到对应linux的版本进行下载 […

从零开始:Spring Boot 中使用 Drools 规则引擎的完整指南

规则引擎作用 规则引擎主要用于将业务逻辑从应用程序代码中分离出来,提高系统的灵活性和可维护性。规则引擎通过预定义的规则来处理输入数据并做出相应的决策,从而实现业务逻辑的自动化和动态调整。 例如 门店信息校验:美团点评在门店信息…

【高中数学之基本不等式】已知:a,b皆为正实数且1/a+1/(b+2)=1/2 求:a+b的最小值?

解:先从1/a1/(b2)1/2 入手,看能否化二为一(将两变量化成一个变量) 由1/a1/(b2)1/2 两边通分得(b2a)/a/(b2)1/2 交叉相乘得2a2b4ab2a 最后得到a24/b 所以ab24/bb 此时已经可以用基本不等式了 ab24/bb>22*根号下(4/b*b)22…

SpringBoot 3.3.1 + Minio 实现极速上传和预览模式

统一版本管理 <properties><minio.version>8.5.10</minio.version><aws.version>1.12.737</aws.version><hutool.version>5.8.28</hutool.version> </properties><!--minio --> <dependency><groupId>io.m…

Arduino - TM1637 4 位 7 段显示器

Arduino - TM1637 4 位 7 段显示器 Arduino-TM1637 4 位 7 段显示器 A standard 4-digit 7-segment display is needed for clock, timer and counter projects, but it usually requires 12 connections. The TM1637 module makes it easier by only requiring 4 connectio…

有哪些防爬虫的方法

防爬虫的方法有robots.txt文、user-agent过滤、ip限制、验证码、动态页面生成、频率限制、动态url参数和反爬虫技术等。详细介绍&#xff1a;1、robots.txt文件&#xff0c;用于告诉搜索引擎爬虫哪些页面可以访问&#xff0c;哪些页面禁止访问&#xff1b;2、ip限制&#xff0c…

关于vs code中Live Server插件安装后无法打开的问题

一、问题情况 安装好Live Server插件之后&#xff0c;点击open with live server只会出现界面右下角落的提示&#xff0c;但是不会跳转到浏览器的页面&#xff1a;如下所示&#xff1a; 二&#xff1a;解决步骤 1、首先进行扩展设置&#xff0c;默认将浏览器的设置为chrome浏览…

vue组件全局注册

描述&#xff1a; vue组件的注册分为局部和全局注册两部分&#xff0c;局部注册相对容易&#xff0c;不做赘述&#xff1b;而不同框架的注册方法又有所不同&#xff0c;下面针对vite框架和vue-cli框架的注册分别进行说明 vue组件全局注册 一、vite框架中全局组件注册二、Vue-cl…

-bash: /snap/bin/docker: 没有那个文件或目录

-bash: /snap/bin/docker: 没有那个文件或目录 解决办法 export PATH$PATH:/usr/bin/docker然后&#xff0c;重新加载配置文件 source ~/.bashrc

线程的等待通知机制

等待通知机制 之前所学到的join是等待线程结束,而此时的等待通知,等待代码给我们提示进行显示的通知(并不一定要结束),可以更加精细控制线程之间的执行顺序,在系统内部,线程是抢占式执行,随机调度,但是程序员也是有手段可以进行干预的,我们可以通过"等待"的方式让线…

【学术日记】关于读博,目标院校,意向导师,毕业要求,重要时间点

文章目录 一、目标院校二、重要时间点西安交通大学意向导师 华南理工大学意向导师 本文记录博主的科研日记。如果对博主的其他文章感兴趣&#xff0c;可以看这篇文章【CSDN文章】晚安66博客文章索引。 首次修改时间&#xff1a;2024年5月12日。当前修改时间&#xff1a;2024年5…