模型预测控制:线性MPC

news2024/11/26 5:22:15

模型预测控制:线性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.coloradmin.cn/o/1875875.html

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

相关文章

C# 实现websocket双向通信

🎈个人主页:靓仔很忙i 💻B 站主页:👉B站👈 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:C# 🤝希望本文对您有所裨益,如有不足之处&#xff…

【地理库 Turf.js】

非常全面的地理库 , 这里枚举一些比较常用,重点的功能, 重点功能 提供地理相关的类:包括点,线,面等类。 测量功能:点到线段的距离,点和线的关系等。 判断功能: 点是否在…

Ubuntu系统打包ISO镜像文件

本文以ubuntu20.04系统为例 1.Systemback简介 Systemback 是一个开源的系统备份和恢复工具,它主要用于 Linux 操作系统。Systemback 可以帮助用户创建完整的系统备份,包括操作系统、应用程序、用户数据等,并且可以在需要时将系统恢复到备份的…

5G频段简介

5G频段 5G网络一共有29个频段,主要被分为两个频谱范围,其中6GHz以下的频段共有26个(统称为Sub6GHz),毫米波频段有3个。目前国内主要使用的是Sub6GHz,包括n1/n3/n28/n41/n77/n78/n79共7个频段。具体介绍如下…

centos上部署Ollama平台,实现语言大模型本地部署

网上有很多大模型,很多都是远程在线调用ChatGPT的api来实现的,自己本地是没有大模型的,这里和大家分享一个大模型平台,可以实现本地快速部署大模型。 Ollama是一个开源项目,它提供了一个平台和工具集,用于部…

SerDes介绍以及原语使用介绍(2)OSERDESE2原语仿真

文章目录 前言一、SDR模式1.1、设计代码1.2、testbench代码1.3、仿真分析 二、DDR模式下2.1、设计代码2.2、testbench代码2.3、仿真分析 三、OSERDES2级联3.1、设计代码3.2、testbench代码3.3、代码分析 前言 上文通过xilinx ug471手册对OSERDESE有了简单的了解,接…

数字化那点事:一文读懂数字乡村

一、数字乡村的定义 数字乡村是指利用信息技术和数字化手段,推动乡村社会经济发展和治理模式变革,提升乡村治理能力和公共服务水平,实现乡村全面振兴的一种新型发展模式。它包括农业生产的数字化、乡村治理的智能化、乡村生活的现代化等方面…

智慧校园-医务管理系统总体概述

智慧校园医务管理系统,作为校园健康管理体系的智能化升级,深度融合信息技术与医疗服务,为师生构筑起一道全方位的健康守护网。医务管理系统以提升校园医疗服务水平、优化健康管理流程为核心目标,通过一系列创新功能,确…

29.9一份的烤鸭,抖音为什么卖不出去?

文 | 螳螂观察 作者 | 青月 这两年,我的抖音推荐里,越来越常出现附近几km内的美食推荐。 就在昨天晚上,当我惯常打开抖音,才刷了几个视频,就跳出了一家距离我只有1.6km的烤鸭店。 这个短视频中,烤鸭在滋…

Python数据分析案例47——笔记本电脑价格影响因素分析

案例背景 博主对电脑的价格和配置一直略有研究,正好最近也有笔记本电脑相关的数据,想着来做点分析吧,写成一个案例。基本上描述性统计,画图,分组聚合,机器学习,交叉验证,搜索超参数…

基于语音识别的智能电子病历(二)苹果端的语音接入

是2011年参与的,俺负责Wav文件处理、FTP通讯和一些后端部分。iPhone/iPad/iPod Recorder 前2年还在APP Store上 说明 Step-by-Step Procedure to Install App and Use the FnetRecorder Download the App from Apple Store Launch Apple Store and key in “fnetr…

SpringBoot学习05-[SpringBoot的嵌入式Servlet容器]

SpringBoot的嵌入式Servlet容器 嵌入式Servlet容器servlet容器-嵌入式servlet容器配置修改通过全局配置文件修改修改添加实现了WebServerFactoryCustomizer接口的bean来进行修改 servlet容器-注册servlet三大组件 嵌入式Servlet容器 SpringBoot包含对嵌入式Tomcat、Jetty、Und…

【案例分享】南通中远海运川崎船舶运动轨迹智能分析及预测

航运作为一种运量大、成本低的运输方式,在全球贸易货物运输中发挥着十分重要的作用。随着船舶数量的增加和船舶大型化发展,航运业面临着温室气体排放、人力成本增加、航行安全不足等诸多挑战。近年来,为应对上述挑战,目前航运业正…

已解决javax.xml.bind.MarshalException:在RMI中,参数或返回值无法被编组的正确解决方法,亲测有效!!!

已解决javax.xml.bind.MarshalException:在RMI中,参数或返回值无法被编组的正确解决方法,亲测有效!!! 目录 问题分析 出现问题的场景 服务器端代码 客户端代码 报错原因 解决思路 解决方法 1. 实现…

打造你的第一个STM32步进电机控制器:详细教程与实战技巧

1. 引言 步进电机因其精确的位置控制和较高的响应速度,在自动化设备、3D打印机、CNC机床等领域广泛应用。本文将详细介绍如何使用STM32微控制器来控制步进电机,从理论到实践,帮助读者全面掌握这一重要技术。 STM32系列微控制器以其强大的性…

从入口文件搭建php项目

入口文件index.php <?phprequire CallBack.php; // 处理回调请求逻辑 $bot new CallBack();// 请求方式 if (isset($_GET[method])) {$method $_GET[method];if (method_exists($bot, $method)) {return $bot->$method();} else {echo "没有该功能";die();…

多元时间序列分析——VAR(向量自回归模型)

VAR模型主要是考察多个变量之间的动态互动关系&#xff0c;从而解释各种经济冲击对经济变量形成的动态影响。这种动态关系可通过格兰杰因果关系、脉冲响应以及方差分解来进一步明确和可视化。VAR模型主要研究内生变量之间的关系&#xff0c;内生变量就是参与模型并由模型体系内…

SmartEDA革新来袭:融合Multisim与Proteus精髓,引领电子设计新纪元!

在电子设计领域&#xff0c;每一次技术的革新都如同春风化雨&#xff0c;滋润着设计师们的心田。今天&#xff0c;我们迎来了一个划时代的电子设计自动化&#xff08;EDA&#xff09;工具——SmartEDA&#xff0c;它不仅融合了业界知名的Multisim和Proteus的精华&#xff0c;更…

NPOI入门指南:轻松操作Excel文件的.NET库

目录 引言 一、NPOI概述 二、NPOI的主要用途 三、安装NPOI库 四、NPOI基本使用 六、性能优化和内存管理 七、常见问题与解决方案 八、结论 附录 引言 Excel文件作为数据处理的重要工具&#xff0c;广泛应用于各种场景。然而&#xff0c;在没有安装Microsoft Office的…

最近写javaweb出现的一个小bug---前端利用 form 表单传多项数据,后端 Servlet 取出的各项数据均为空

目录&#xff1a; 一. 问题引入二 解决问题 一. 问题引入 近在写一个 java web 项目时&#xff0c;遇到一个让我头疼了晚上的问题&#xff1a;前端通过 post 提交的 form 表单数据可以传到后端&#xff0c;但当我从 Servlet 中通过 request.getParameter(“name”) 拿取各项数…