模型预测控制:设定点跟踪(Set Point Tracking)

模型预测控制:设定点跟踪(Set Point Tracking)

模型预测控制(Model Predictive Control, MPC)不仅可以用于系统稳定性问题,还可以用于设定点跟踪问题(Set Point Tracking),即系统需要跟踪一个动态变化的参考输入。本文将介绍如何将设定点跟踪问题转化为稳定性问题,并使用MPC解决。

系统描述

首先,我们假设系统模型为一个离散时间线性时不变(LTI)系统:

x k + 1 = A x k + B u k x_{k+1} = A x_k + B u_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是输入矩阵

对于设定点跟踪问题,目标是让系统状态 x k x_k xk跟踪一个参考状态 x r x_r xr,同时控制输入 u k u_k uk跟踪一个参考输入 u r u_r ur

转化为稳定性问题

设定误差状态为:

e k = x k − x r e_k = x_k - x_r ek=xkxr

误差控制输入为:

v k = u k − u r v_k = u_k - u_r vk=ukur

将其代入系统状态方程:

e k + 1 = x k + 1 − x r = A x k + B u k − x r = A ( x k − x r ) + B ( u k − u r ) + A x r + B u r − x r e_{k+1} = x_{k+1} - x_r = A x_k + B u_k - x_r = A (x_k - x_r) + B (u_k - u_r) + A x_r + B u_r - x_r ek+1=xk+1xr=Axk+Bukxr=A(xkxr)+B(ukur)+Axr+Burxr

考虑到在稳态时 A x r + B u r = x r A x_r + B u_r = x_r Axr+Bur=xr,则有:

e k + 1 = A e k + B v k e_{k+1} = A e_k + B v_k ek+1=Aek+Bvk

这样,我们将设定点跟踪问题转化为误差状态的稳定性问题。

优化问题

优化问题的目标是最小化误差状态和控制输入的代价函数,同时满足系统的约束。代价函数可以表示为:

J = ∑ i = 0 N − 1 ( e k + i ∣ k T Q e k + i ∣ k + v k + i ∣ k T R v k + i ∣ k ) + e k + N ∣ k T P e k + N ∣ k J = \sum_{i=0}^{N-1} \left( e_{k+i|k}^T Q e_{k+i|k} + v_{k+i|k}^T R v_{k+i|k} \right) + e_{k+N|k}^T P e_{k+N|k} J=i=0N1(ek+ikTQek+ik+vk+ikTRvk+ik)+ek+NkTPek+Nk

其中:

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

约束条件为:

e k + i + 1 ∣ k = A e k + i ∣ k + B v k + i ∣ k ∀ i = 0 , … , N − 1 x m i n ≤ e k + i ∣ k + x r ≤ x m a x ∀ i = 1 , … , N u m i n ≤ v k + i ∣ k + u r ≤ u m a x ∀ i = 0 , … , N − 1 \begin{align*} e_{k+i+1|k} &= A e_{k+i|k} + B v_{k+i|k} \quad \forall i = 0, \ldots, N-1 \\ x_{min} &\leq e_{k+i|k} + x_r \leq x_{max} \quad \forall i = 1, \ldots, N \\ u_{min} &\leq v_{k+i|k} + u_r \leq u_{max} \quad \forall i = 0, \ldots, N-1 \end{align*} ek+i+1∣kxminumin=Aek+ik+Bvk+iki=0,,N1ek+ik+xrxmaxi=1,,Nvk+ik+urumaxi=0,,N1

Python代码示例

以下是一个简单的Python代码示例,展示如何实现设定点跟踪的线性MPC:

import numpy as np
from scipy.linalg import solve_discrete_are
from scipy.optimize import minimize
import matplotlib.pyplot as plt# Define the system model
A = np.array([[1.1]])
B = np.array([[1.0]])
Q = np.array([[1.0]])
R = np.array([[0.1]])
N = 10  # Prediction horizon# Define constraints
x_min = -10.0
x_max = 10.0
u_min = -1.0
u_max = 1.0# Terminal weight matrix P
P = solve_discrete_are(A, B, Q, R)# Initial state and reference state
x0 = np.array([0.0])
x_r = np.array([5.0])
u_r = np.array([0.5])def cost_function(v, x0, x_r, u_r):e = x0 - x_rcost = 0.0for i in range(N):e = A @ e + B * v[i]cost += e.T @ Q @ e + v[i] * R * v[i]cost += e.T @ P @ ereturn cost# Optimization
v0 = np.zeros(N)
constraints = [{'type': 'ineq', 'fun': lambda v: v + u_r - u_min},{'type': 'ineq', 'fun': lambda v: u_max - (v + u_r)}]result = minimize(cost_function, v0, args=(x0, x_r, u_r), constraints=constraints)
v_opt = result.x# Apply the optimal control input
x = x0
x_history = [x]
u_history = []
for v in v_opt:u = v + u_ru_history.append(u)x = A @ x + B * ux_history.append(x)# Convert x_history to a 1D array of scalars
x_history = [x.item() for x in x_history]# Plot results
plt.plot(range(N+1), x_history, label='State')
plt.axhline(y=x_r, color='r', linestyle='--', label='Reference state')
plt.xlabel('Time step')
plt.ylabel('State')
plt.title('Linear MPC for Set Point Tracking')
plt.legend()
plt.grid(True)
plt.show()plt.plot(range(N), u_history, label='Control input')
plt.axhline(y=u_r, color='r', linestyle='--', label='Reference input')
plt.xlabel('Time step')
plt.ylabel('Control input')
plt.title('Control Input for Set Point Tracking')
plt.legend()
plt.grid(True)
plt.show()

在这里插入图片描述
在这里插入图片描述

代码解释

  1. 系统模型和参数定义

    • 定义系统的状态矩阵 A A A和输入矩阵 B B B
    • 定义代价函数中的权重矩阵 Q Q Q R R R
    • 设置预测时域长度 N N N
    • 定义状态和控制输入的约束。
  2. 终端权重矩阵计算

    • 使用 solve_discrete_are 计算离散时间代数Riccati方程的解,得到终端权重矩阵 P P P
  3. 初始状态和参考状态

    • 定义系统的初始状态 x 0 x_0 x0和参考状态 x r x_r xr
    • 定义参考控制输入 u r u_r ur
  4. 代价函数

    • 定义代价函数 cost_function,用于计算给定误差控制输入序列 v v v 的代价。
  5. 优化

    • 使用 minimize 函数进行优化,得到最优误差控制输入序列 v o p t v_{opt} vopt
  6. 应用控制输入

    • 计算实际控制输入 u = v + u r u = v + u_r u=v+ur,并更新系统状态 x x x
    • 记录系统状态和控制输入的历史数据。
  7. 绘制结果

    • 绘制系统状态和参考状态的变化曲线。
    • 绘制控制输入和参考输入的变化曲线。

结论

通过将设定点跟踪问题转化为稳定性问题,MPC可以用于动态跟踪参考输入。本文介绍了设定点跟踪问题的基本概念、系统模型、优化问题和LMPC算法,并提供了一个简单的Python代码示例,展示了MPC在单输入系统中的应用。通过在线解决优化问题,MPC能够有效地实现系统状态的最优控制和参考输入的跟踪。

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

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

相关文章

计算机网络 —— 路由协议:RIP、OSPF、BGP、MPLS

路由协议 1. 定义2. IGP2.1 RIP2.2 OSPF 3. BGP4. MPLS 1. 定义 互联网中需要通过路由将数据发送至目标主机。 路由器根据**路由控制表(RoutingTable)**转发数据包,它根据所收到的数据包中目标主机的IP地址与路由控制表的比较得出下一个应该接收的路由器。 &…

前端通过ResizeObserver来监听dom大小动态渲染echarts

export const GlobalResizeObserver (function () {const ATTR_NAME global-resizeobserver-keyconst attrValueToCallback {}function antiShake(fn, delay, immediate false) {let timer null//不能用箭头函数return function () {//在时间内重复调用的时候需要清空之前…

常见的反爬手段和解决思路(爬虫与反爬虫)

常见的反爬手段和解决思路(爬虫与反爬虫) 学习目标1 服务器反爬的原因2 服务器长反什么样的爬虫(1)十分低级的应届毕业生(2)十分低级的创业小公司(3)不小心写错了没人去停止的失控小…

firewalld(2)安装、配置文件、规则查询

安装firewalld 我使用的操作系统是debian 12,并没有安装firewalld。 通过apt install firewalld安装firewalld firewalld 本身是一个服务(firewalld.service),可以通过 systemctl 进行启动、停止和重启,而iptables 本身并不是一个服务,而是一个用户空间工具,被用来配置底…

计算机人说学校-北京理工大学-计算机方向

1. 专长、特点、特色 北京理工大学(北理工)的计算机专业同样具有显著的优势和特点: 学术水平高:作为一所985高校,北理工在计算机科学与技术以及人工智能领域都有着较高的学术水平和教学资源。研究方向广泛&#xff1…

并发编程基础概念

相关概念 并行 并行是指同一个时刻,多个任务同时进行。只有在多核CPU下才会发生。 并发 并发是指单个CPU在不同任务之间来换切换工作,但是同一时刻只有一个任务在工作。由于CPU的切换速度很快,给人的感受是多个任务在一起运行。 串行 串行…

一年前 LLM AGI 碎片化思考与回顾系列⑧ · 穿越SystemⅡ未知之境

阅读提示: 本篇系列内容的是建立于自己过去一年在以LLM为代表的AIGC快速发展浪潮中结合学术界与产业界创新与进展的一些碎片化思考并记录最终沉淀完成,在内容上,与不久前刚刚完稿的那篇10万字文章 「融合RL与LLM思想,探寻世界模型…

期末C语言易错知识点整理

1.在定义多维数组时,除了最左边的维度,其余的维度必须明确指定大小 2.int m[1][4]{4}; 定义的是一个 1 行 4 列的二维数组,初始化时提供了一个元素 4,其余元素默认初始化为 0,因此是正确的。 3.二维数组 a[3][6] 中的索…

PKG打包sqlite3项目,如何添加node_sqlite3.node依赖

项目地址:https://github.com/helson-lin/pkg_sqlite 在ffandown项目内,由于项目使用了sqlite3,在跨平台打包的时候,除了本机外其他平台打包之后运行缺少node_sqlite3.node依赖。 为了解决问题,百度了很久&#xff0c…

分享一个导出数据到 Excel 的解决方案

前言 许多业务场景下需要处理和分析大量的数据,而 Excel 是广泛使用的文件格式,几乎所有人都能打开和查看 Excel 文件,因此将数据库中的原始数据处理后,导出到 Excel 是一个很常见的功能,对于数据管理、分析、备份、展…

【代码随想录】【算法训练营】【第45天】 [198]打家劫舍 [213]打家劫舍II [337]打家劫舍III

前言 思路及算法思维,指路 代码随想录。 题目来自 LeetCode。 day 45,周五,坚持不了一点~ 题目详情 [198] 打家劫舍 题目描述 198 打家劫舍 解题思路 前提:相邻两房屋不能连续盗窃 思路:动态规划, dp[i]: [0,…

【C语言】--操作符详解

🌭个人主页: 起名字真南 🍿个人专栏:【数据结构初阶】 【C语言】 目录 1 算术操作符1.1 和 -1.2 *1.3 /1.4 % 2 赋值操作符 :2.1 复合赋值符 3 单目操作符3.1 和- - 4 强制类型转换5 printf 和 scanf5.1 printf5.1.1 基本用法5.1.2 占位符5.…

Navicat连接Oracle出现Oracle library is not loaded的解决方法

目录 1. 问题所示2. 原理分析3. 解决方法1. 问题所示 使用Navicat链接Oracle的时候,出现如下提示:Oracle library is not loaded. 截图如下所示: 2. 原理分析 通常是由于缺少必需的 Oracle 客户端库或环境变量未正确配置所致 还有一种情况是 32位与64位的不匹配:Navica…

【数据可视化技术】1、如何使用Matplotlib和Seaborn库在Python中绘制热力图

热力图是一种数据可视化技术,可以显示变量之间的相关性。这个代码段是数据分析和可视化的常用方法,特别适合于展示变量之间的相关性,对于数据科学和机器学习项目非常有帮助。 1、 导入必要的库 首先,确保你已经安装了matplotlib…

javaSE知识点整理总结(上)

目录 一、面向对象 1. 类、对象、方法 2.面向对象三大特征 (1)封装 (2)继承 (3)多态 二、常用类 1.Object类 2.Array类 3.基本数据类型包装类 4.String类 5.StringBuffer类 6.Math类 7.Random…

WAIC2024 | 华院计算邀您共赴2024年世界人工智能大会,见证未来科技革新

在智能时代的浪潮汹涌澎湃之际,算法已成为推动社会进步的核心力量。作为中国认知智能技术的领军企业,华院计算在人工智能的广阔天地中,不断探索、创新,致力于将算法的潜力发挥到极致。在过去的时日里,华院计算不断探索…

Mac可以读取NTFS吗 Mac NTFS软件哪个好 mac ntfs读写工具免费

在跨操作系统环境下使用外部存储设备时,特别是当Windows系统的U盘被连接到Mac电脑时,常常会遇到文件系统兼容性的问题。由于Mac OS原生并不完全支持对NTFS格式磁盘的读写操作,导致用户无法直接在Mac上向NTFS格式的U盘或硬盘写入数据。下面我们…

SpringBoot:使用Spring Batch实现批处理任务

引言 在企业级应用中,批处理任务是不可或缺的一部分。它们通常用于处理大量数据,如数据迁移、数据清洗、生成报告等。Spring Batch是Spring框架的一部分,专为批处理任务设计,提供了简化的配置和强大的功能。本文将介绍如何使用Spr…

排序(冒泡排序、选择排序、插入排序、希尔排序)-->深度剖析(一)

欢迎来到我的Blog,点击关注哦💕 前言 排序是一种基本的数据处理操作,它涉及将一系列项目重新排列,以便按照指定的标准(通常是数值大小)进行排序。在C语言中,排序算法是用来对元素进行排序的一系…

【高性能服务器】服务器概述

🔥博客主页: 我要成为C领域大神🎥系列专栏:【C核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞👍收藏⭐评论✍️ 本博客致力于知识分享,与更多的人进行学习交流 ​ 服务器概述 服…