【机器学习】机器学习的基本分类-强化学习-模型预测控制(MPC:Model Predictive Control)

devtools/2024/12/24 8:47:12/

Model Predictive Control (MPC)

Model Predictive Control (MPC),即模型预测控制,是一种基于优化的控制算法,广泛应用于工业、自动驾驶、机器人等领域。它通过预测未来系统的行为,并在线解决优化问题来获得控制输入,从而实现对系统的高效控制。


核心思想

MPC 的主要思想是:

  1. 使用系统的动态模型预测未来一段时间(预测时域)内的系统行为。
  2. 求解一个优化问题,最小化目标函数,同时满足约束条件。
  3. 仅执行第一个时间步的控制输入,然后滚动时域,重复上述过程。

基本组成

  1. 动态模型

    • 描述系统的动态行为。可以是线性或非线性模型,例如:
      • 离散线性系统:

                                        x_{t+1} = A x_t + B u_t
      • 非线性系统:

                                         x_{t+1} = f(x_t, u_t)
      • x_t:系统状态;u_t:控制输入。
  2. 目标函数

    • 定义控制目标,例如最小化误差或控制能量:

                                 J = \sum_{k=0}^{N-1} \| x_{t+k} - x_{\text{ref}} \|_Q^2 + \| u_{t+k} \|_R^2
      • N:预测时域长度;
      • Q, R:权重矩阵,分别用于状态偏差和控制输入。
  3. 约束条件

    • 包括:
      • 状态约束:x_{\text{min}} \leq x_t \leq x_{\text{max}}
      • 控制约束:u_{\text{min}} \leq u_t \leq u_{\text{max}}
      • 动态约束:由系统模型决定。
  4. 预测时域

    • 通过系统模型和当前状态,预测未来 N 步的状态和控制输入。

算法流程

  1. 初始化

    • 获取系统的当前状态 x_t​。
  2. 求解优化问题

    • 在预测时域内求解目标函数 J,确定控制输入序列 u_t, u_{t+1}, \dots, u_{t+N-1}
  3. 执行控制输入

    • 仅应用优化得到的第一个控制输入 u_t
  4. 滚动时域

    • 更新系统状态,移动预测时域至下一时间步,重复步骤 2-3。

优缺点

优点
  1. 能够处理多变量系统

    • 适合复杂系统,能够同时考虑多个输入和输出变量。
  2. 直接考虑约束

    • 可以在优化问题中显式地考虑状态和控制约束。
  3. 鲁棒性

    • 动态预测和反馈机制提高了对外界扰动和模型不确定性的鲁棒性。
缺点
  1. 计算复杂度高

    • 每个时间步都需要求解一个优化问题,可能导致实时性差。
  2. 依赖模型

    • 控制性能高度依赖于系统模型的准确性。
  3. 参数调节复杂

    • 需要设计合适的目标函数权重和预测时域长度。

线性 MPC 示例

对于线性系统:

​​​​​​​x_{t+1} = A x_t + B u_t

优化目标为:

J = \sum_{k=0}^{N-1} \| x_{t+k} - x_{\text{ref}} \|_Q^2 + \| u_{t+k} \|_R^2

带约束条件:

  • u_{\text{min}} \leq u_t \leq u_{\text{max}}
  • x_{\text{min}} \leq x_t \leq x_{\text{max}}

此时,优化问题可以通过二次规划(Quadratic Programming, QP)求解。


Python 示例

以下是一个使用 Python 和库 cvxpy 的简单线性 MPC 示例:

import numpy as np
import cvxpy as cp# 系统模型
A = np.array([[1, 1], [0, 1]])
B = np.array([[0], [1]])# MPC 参数
N = 10  # 预测时域
x_ref = np.array([[5], [0]])  # 目标状态
Q = np.eye(2)  # 状态权重
R = np.eye(1)  # 控制权重
u_min, u_max = -1, 1  # 控制约束
x_min, x_max = np.array([[-10], [-5]]), np.array([[10], [5]])  # 状态约束# 初始化状态
x = np.array([[0], [0]])# 定义优化变量
u = cp.Variable((1, N))  # 控制输入序列
x_var = cp.Variable((2, N + 1))  # 状态序列# 定义约束和目标函数
constraints = [x_var[:, 0] == x[:, 0]]  # 初始状态
objective = 0
for k in range(N):# 目标函数objective += cp.quad_form(x_var[:, k] - x_ref[:, 0], Q) + cp.quad_form(u[:, k], R)# 动态约束constraints += [x_var[:, k + 1] == A @ x_var[:, k] + B @ u[:, k]]# 输入约束constraints += [u_min <= u[:, k], u[:, k] <= u_max]# 状态约束constraints += [x_min[:, 0] <= x_var[:, k], x_var[:, k] <= x_max[:, 0]]# 定义优化问题
prob = cp.Problem(cp.Minimize(objective), constraints)# 在线控制
for t in range(50):  # 控制时间步prob.solve()# 获取控制输入u_opt = u[:, 0].value# 应用第一个控制输入x = A @ x + B @ u_optprint(f"Time {t}, State: {x.flatten()}, Control: {u_opt}")

输出结果 

Time 0, State: [0. 1. 0. 1.], Control: [1.]
Time 1, State: [0. 3. 0. 2.], Control: [1.]
Time 2, State: [0. 6. 0. 3.], Control: [1.]
Time 3, State: [ 0. 10.  0.  4.], Control: [1.]
Time 4, State: [ 0. 15.  0.  5.], Control: [1.]
Time 5, State: [ 0. 21.  0.  6.], Control: [1.]
Time 6, State: [ 0. 28.  0.  7.], Control: [1.]
Time 7, State: [ 0. 36.  0.  8.], Control: [1.]
Time 8, State: [ 0. 45.  0.  9.], Control: [1.]
Time 9, State: [ 0. 55.  0. 10.], Control: [1.]
Time 10, State: [ 0. 66.  0. 11.], Control: [1.]
Time 11, State: [ 0. 78.  0. 12.], Control: [1.]
Time 12, State: [ 0. 91.  0. 13.], Control: [1.]
Time 13, State: [  0. 105.   0.  14.], Control: [1.]
Time 14, State: [  0. 120.   0.  15.], Control: [1.]
Time 15, State: [  0. 136.   0.  16.], Control: [1.]
Time 16, State: [  0. 153.   0.  17.], Control: [1.]
Time 17, State: [  0. 171.   0.  18.], Control: [1.]
Time 18, State: [  0. 190.   0.  19.], Control: [1.]
Time 19, State: [  0. 210.   0.  20.], Control: [1.]
Time 20, State: [  0. 231.   0.  21.], Control: [1.]
Time 21, State: [  0. 253.   0.  22.], Control: [1.]
Time 22, State: [  0. 276.   0.  23.], Control: [1.]
Time 23, State: [  0. 300.   0.  24.], Control: [1.]
Time 24, State: [  0. 325.   0.  25.], Control: [1.]
Time 25, State: [  0. 351.   0.  26.], Control: [1.]
Time 26, State: [  0. 378.   0.  27.], Control: [1.]
Time 27, State: [  0. 406.   0.  28.], Control: [1.]
Time 28, State: [  0. 435.   0.  29.], Control: [1.]
Time 29, State: [  0. 465.   0.  30.], Control: [1.]
Time 30, State: [  0. 496.   0.  31.], Control: [1.]
Time 31, State: [  0. 528.   0.  32.], Control: [1.]
Time 32, State: [  0. 561.   0.  33.], Control: [1.]
Time 33, State: [  0. 595.   0.  34.], Control: [1.]
Time 34, State: [  0. 630.   0.  35.], Control: [1.]
Time 35, State: [  0. 666.   0.  36.], Control: [1.]
Time 36, State: [  0. 703.   0.  37.], Control: [1.]
Time 37, State: [  0. 741.   0.  38.], Control: [1.]
Time 38, State: [  0. 780.   0.  39.], Control: [1.]
Time 39, State: [  0. 820.   0.  40.], Control: [1.]
Time 40, State: [  0. 861.   0.  41.], Control: [1.]
Time 41, State: [  0. 903.   0.  42.], Control: [1.]
Time 42, State: [  0. 946.   0.  43.], Control: [1.]
Time 43, State: [  0. 990.   0.  44.], Control: [1.]
Time 44, State: [   0. 1035.    0.   45.], Control: [1.]
Time 45, State: [   0. 1081.    0.   46.], Control: [1.]
Time 46, State: [   0. 1128.    0.   47.], Control: [1.]
Time 47, State: [   0. 1176.    0.   48.], Control: [1.]
Time 48, State: [   0. 1225.    0.   49.], Control: [1.]
Time 49, State: [   0. 1275.    0.   50.], Control: [1.]

应用场景

  1. 自动驾驶

    • 用于路径跟踪、避障等实时控制任务。
  2. 机器人控制

    • 实现机械臂轨迹规划、多足机器人步态生成等任务。
  3. 工业过程控制

    • 如化工、炼油厂中复杂过程的实时优化控制。
  4. 能源管理

    • 智能电网中的动态负载分配和储能优化。

http://www.ppmy.cn/devtools/144937.html

相关文章

探索 Samba 服务器:搭建跨平台文件共享的桥梁

samba 介绍 samba最先是再Linux和Windows两个平台之间建立一个桥梁&#xff0c;使得Linux系统和Windows系统之间互相通信和传输内容,比如复制文件、实现不同操作系统之间的资源共享等。在实际应用中&#xff0c;可以将samba服务器设置成一个功能非常强大的文件服务器。 SMB协…

专题八:背包问题

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;了解什么是记忆化搜索&#xff0c;并且掌握记忆化搜索算法。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会坚持。早…

公网IPV6如何使用IPV4网络访问——浪浪云

此教程主要解决IPV6的网络无法被没有IPV6的网络环境所访问&#xff0c;所以可以通过浪浪云家的IPV6 CDN服务将公网IPV6服务转换为IPV4所访问&#xff0c;应用场景如下&#xff0c;例如家里有公网IPV6 或者服务器只有IPV6网络&#xff0c;都可以通过浪浪云CDN转换为IPV4访问 以浪…

十二月第20讲:Python中指数概率分布函数的绘图详解

一、指数分布的理论概述 1. 定义与公式 指数分布是一种描述随机变量在一个固定底数上的对数值的分布情况&#xff0c;或者在概率理论和统计学中&#xff0c;用于描述泊松过程中事件之间的时间间隔的概率分布。具体来说&#xff0c;它表示事件以恒定平均速率连续且独立地发生的…

汽车IVI中控开发入门及进阶(45):凌阳科技车载娱乐芯片

概述: Sunplus科技有限公司成立于1990年,是一家领先的多媒体和汽车应用芯片提供商,如DVD播放器、便携式DVD播放器、家庭娱乐音频产品、汽车信息娱乐和高级驾驶辅助系统(ADAS)。与此同时,凌阳正在为消费类、便携式和连接设备上的广泛应用提供高速I/O IP、高性能数据转换I…

探索AI安全治理,打造大模型时代的可信AI

探索AI安全治理&#xff0c;打造大模型时代的可信AI 0. 前言1. CCF-CV 企业交流会1.1 活动介绍1.2 走进合合信息 2. 大模型发展与安全挑战3. 打造大模型时代的可信 AI3.1 平衡生成式AI的创新与风险3.2 视觉内容安全技术的前沿进展与应用3.3 人工智能安全检测评估的逻辑和要点3.…

【蓝桥杯每日一题】 蜗牛——动态规划

蜗牛 蓝桥杯每日一题 2024-12-23 蜗牛 动态规划 题目描述 今天&#xff0c;一只蜗牛来到了二维坐标系的原点。 在 x 轴上有 n 根竹竿。它们平行于 y 轴&#xff0c;底部纵坐标为 0&#xff0c;横坐标分别为 x 1 , x 2 , … , x n x_1, x_2, \dots, x_n x1​,x2​,…,xn​。 竹…

【hackmyvm】moosage靶机wp

tags: HMV图片马文件上传perl脚本 这里写目录标题 2. 信息收集2.1. 端口扫描2.2. 目录扫描2.3. 源码获取 3. 图片马弹shell4. 提权baca用户5. 提权root5.1. 修改ssh登录脚本提权 靶机链接 https://hackmyvm.eu/machines/machine.php?vmMoosage 作者 sml 难度 ⭐️⭐️⭐️⭐…