Model Predictive Control (MPC)
Model Predictive Control (MPC),即模型预测控制,是一种基于优化的控制算法,广泛应用于工业、自动驾驶、机器人等领域。它通过预测未来系统的行为,并在线解决优化问题来获得控制输入,从而实现对系统的高效控制。
核心思想
MPC 的主要思想是:
- 使用系统的动态模型预测未来一段时间(预测时域)内的系统行为。
- 求解一个优化问题,最小化目标函数,同时满足约束条件。
- 仅执行第一个时间步的控制输入,然后滚动时域,重复上述过程。
基本组成
-
动态模型
- 描述系统的动态行为。可以是线性或非线性模型,例如:
- 离散线性系统:
- 非线性系统:
- :系统状态;:控制输入。
- 离散线性系统:
- 描述系统的动态行为。可以是线性或非线性模型,例如:
-
目标函数
- 定义控制目标,例如最小化误差或控制能量:
- N:预测时域长度;
- Q, R:权重矩阵,分别用于状态偏差和控制输入。
- 定义控制目标,例如最小化误差或控制能量:
-
约束条件
- 包括:
- 状态约束:
- 控制约束:
- 动态约束:由系统模型决定。
- 包括:
-
预测时域
- 通过系统模型和当前状态,预测未来 N 步的状态和控制输入。
算法流程
-
初始化:
- 获取系统的当前状态 。
-
求解优化问题:
- 在预测时域内求解目标函数 J,确定控制输入序列 。
-
执行控制输入:
- 仅应用优化得到的第一个控制输入 。
-
滚动时域:
- 更新系统状态,移动预测时域至下一时间步,重复步骤 2-3。
优缺点
优点
-
能够处理多变量系统:
- 适合复杂系统,能够同时考虑多个输入和输出变量。
-
直接考虑约束:
- 可以在优化问题中显式地考虑状态和控制约束。
-
鲁棒性:
- 动态预测和反馈机制提高了对外界扰动和模型不确定性的鲁棒性。
缺点
-
计算复杂度高:
- 每个时间步都需要求解一个优化问题,可能导致实时性差。
-
依赖模型:
- 控制性能高度依赖于系统模型的准确性。
-
参数调节复杂:
- 需要设计合适的目标函数权重和预测时域长度。
线性 MPC 示例
对于线性系统:
优化目标为:
带约束条件:
此时,优化问题可以通过二次规划(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.]
应用场景
-
自动驾驶:
- 用于路径跟踪、避障等实时控制任务。
-
机器人控制:
- 实现机械臂轨迹规划、多足机器人步态生成等任务。
-
工业过程控制:
- 如化工、炼油厂中复杂过程的实时优化控制。
-
能源管理:
- 智能电网中的动态负载分配和储能优化。