Model Predictive Control
MPC(模型预测控制)是一种基于在线优化的先进控制策略,通过在每个采样时刻求解有限时域优化问题来处理约束和非线性,广泛应用于工业过程控制、自动驾驶、机器人等领域。
📖 1. 概述
MPC(Model Predictive Control,模型预测控制)是一种滚动优化的控制方法。其核心思想是:在每个控制时刻,基于系统模型预测未来一段时间内的系统行为,求解一个有限时域优化问题,只实施第一个控制动作,然后在下一时刻重新优化。
预测模型
利用系统模型预测未来状态演化
滚动优化
每个时刻求解有限时域最优控制问题
约束处理
显式处理输入/状态/输出约束
反馈校正
利用当前测量值修正预测,形成闭环
MPC 控制循环架构
🔧 2. 问题建模
2.1 MPC 优化问题
MPC 在每个时刻 \(t_k\) 求解以下有限时域最优控制问题:
约束条件:
| 符号 | 含义 |
|---|---|
| \(N\) | 预测时域(Prediction Horizon) |
| \(\ell(x,u)\) | 阶段代价函数(Stage Cost) |
| \(V_f(x)\) | 终端代价函数(Terminal Cost) |
| \(x_{k+i|k}\) | 在 \(k\) 时刻对 \(k+i\) 时刻状态的预测 |
| \(f(x,u)\) | 系统动力学模型 |
2.2 预测时域与控制时域
预测时域 \(N\)
预测未来状态演化的时间步数,决定 MPC 的"远见"能力。
- 较大 \(N\):更好的稳定性,但计算量增大
- 较小 \(N\):计算快,但可能不稳定
控制时域 \(N_c\)
控制变量自由变化的时间步数,\(N_c \leq N\)。
- \(N_c < N\):\(u_{k+i} = u_{k+N_c-1}\)(\(i \geq N_c\))
- 减小决策变量数量,降低计算复杂度
预测时域滚动优化示意图
典型代价函数形式
这是最常见的 MPC 形式,每步求解一个二次规划 (QP) 问题。
终端代价 \(V_f\) 和终端约束 \(x_{k+N|k} \in \mathcal{X}_f\) 用于保证闭环稳定性。
📝 3. 公式推导
3.1 线性 MPC 推导
考虑线性时不变系统:
Step 1: 将优化问题转化为 QP
定义决策变量 \(\mathbf{u} = [u_0^T, u_1^T, ..., u_{N-1}^T]^T\),将预测状态表示为 \(\mathbf{u}\) 的函数:
Step 2: 构造矩阵形式
定义预测矩阵:
其中:
Step 3: 代价函数的 QP 形式
对于二次代价:
定义:
代入预测方程 \(\mathbf{x} = \mathcal{A}x_0 + \mathcal{B}\mathbf{u}\):
其中:
约束条件转化为 \(\mathbf{A}_{ineq} \mathbf{u} \leq \mathbf{b}_{ineq}\)。
Step 4: 求解 QP
在每个采样时刻,测量当前状态 \(x(t_k)\),求解:
取第一个最优控制动作 \(u^*_0\) 施加到系统。
QP 构造流程图
3.2 非线性 MPC (NMPC) 推导
对于非线性系统 \(\dot{x} = f(x, u)\)(连续)或 \(x_{k+1} = f(x_k, u_k)\)(离散):
连续时间 NMPC
约束:
离散时间 NMPC
约束:
求解方法
直接法
将控制参数化后作为有限维优化问题求解(SQP、内点法)
间接法
基于 Pontryagin 极大值原理求解两点边值问题
多重打靶法
将轨迹分段,同时优化节点和控制
⚖️ 4. 连续时间与离散时间处理
连续时间模型
离散化方法:
- 零阶保持器 (ZOH)
- 一阶保持器 (FOH)
- 数值积分(RK4、Runge-Kutta)
离散时间模型
直接用于 MPC 预测,无需额外处理。
零阶保持器 (ZOH) 离散化
对于线性系统 \(\dot{x} = Ax + Bu\),采样周期 \(T_s\):
离散化方法对比
| 方法 | 精度 | 计算量 | 适用场景 |
|---|---|---|---|
| ZOH | 一阶 | 低 | 采样周期较小的系统 |
| FOH | 二阶 | 中 | 控制信号变化较快 |
| RK4 | 四阶 | 中高 | 非线性系统离散化 |
| 精确离散化 | 精确 | 高(需矩阵指数) | 线性系统、高精度要求 |
⚙️ 5. 求解算法
5.1 QP 求解器
线性 MPC 的核心是求解带约束的二次规划问题:
常用 QP 求解器
| 求解器 | 算法 | 特点 | 适用场景 |
|---|---|---|---|
| OSQP | ADMM | 开源、嵌入式友好 | 中等规模问题 |
| qpOASES | 在线活动集 | 热启动、实时性好 | MPC 在线求解 |
| Gurobi | 内点法/单纯形 | 商业、高效 | 大规模问题 |
| HiGHS | 内点法 | 开源、高效 | 通用优化 |
| CasADi + IPOPT | 内点法 | 支持符号建模 | NMPC |
5.2 线性 MPC Python 实现
import numpy as np
import cvxpy as cp
def mpc_solve(A, B, Q, R, P, x0, N, x_min, x_max, u_min, u_max, x_ref=None):
"""
线性 MPC 求解器
A, B: 系统矩阵
Q, R, P: 代价权重(阶段/终端)
x0: 当前状态
N: 预测时域
x_min, x_max, u_min, u_max: 约束
x_ref: 参考轨迹(可选)
"""
n, m = B.shape
# 决策变量
x = cp.Variable((n, N+1))
u = cp.Variable((m, N))
# 参考
if x_ref is None:
x_ref = np.zeros(n)
# 代价函数
cost = 0
for i in range(N):
cost += cp.quad_form(x[:, i] - x_ref, Q)
cost += cp.quad_form(u[:, i], R)
cost += cp.quad_form(x[:, N] - x_ref, P)
# 约束
constraints = [x[:, 0] == x0]
for i in range(N):
constraints += [x[:, i+1] == A @ x[:, i] + B @ u[:, i]]
constraints += [x[:, i] >= x_min, x[:, i] <= x_max]
constraints += [u[:, i] >= u_min, u[:, i] <= u_max]
constraints += [x[:, N] >= x_min, x[:, N] <= x_max]
# 求解
prob = cp.Problem(cp.Minimize(cost), constraints)
prob.solve(solver=cp.OSQP)
return u.value[:, 0], x.value, u.value
5.3 热启动 (Warm Start)
MPC 的一个关键优势:相邻时刻的优化问题高度相似,可利用上一步解加速求解。
1. 将上一时刻的最优解 \(\mathbf{u}^*_{k-1}\) 移位后作为初始点
2. 使用活动集方法(如 qpOASES)利用上一步的活动约束集
3. 可减少 50%-80% 的求解时间
热启动 vs 冷启动对比
🛠️ 6. 约束处理
6.1 约束类型
输入约束
\(u_{\min} \leq u_k \leq u_{\max}\)(执行器饱和、物理限制)
状态约束
\(x_{\min} \leq x_k \leq x_{\max}\)(安全边界、工作范围)
变化率约束
\(\Delta u_{\min} \leq u_k - u_{k-1} \leq \Delta u_{\max}\)(防止剧烈变化)
耦合约束
多个输入/状态之间的约束关系
6.2 约束在 QP 中的表示
输入约束
状态约束(通过预测矩阵转化)
输入变化率约束
其中 \(u_{-1} = u(t_k - 1)\) 是上一时刻实际施加的控制量。
6.3 软约束
对于硬约束不可行的情况,引入松弛变量将其转化为软约束:
在代价函数中添加惩罚项 \(\rho \|\epsilon\|^2\),保证问题始终可行。
约束类型可视化
🎯 7. 稳定性分析
7.1 无限时域 MPC 的稳定性
若预测时域 \(N \to \infty\),MPC 退化为 LQR,自然稳定。但有限时域 MPC 的稳定性需要额外保证。
7.2 保证稳定性的方法
选择终端代价 \(V_f(x) = x^TPx\) 作为从终端状态出发到原点的最优代价的近似:
效果:保证从预测时域末端到无穷远的代价被正确估计。
强制终端状态进入一个不变集 \(\mathcal{X}_f\):
其中 \(\mathcal{X}_f\) 是围绕平衡点的一个控制不变集。
要求预测时域末端的状态小于初始状态:
7.3 稳定性定理
1. 阶段代价 \(\ell(x,u) \geq \alpha(\|x\|)\)(正定)
2. 终端代价 \(V_f\) 是终端局部控制器的 Lyapunov 函数
3. 终端约束集 \(\mathcal{X}_f\) 是终端局部控制器的控制不变集
4. 优化问题在 \(x_k = 0\) 处可行
Lyapunov 函数单调下降示意
🔥 8. MPC 变体
8.1 稳态 MPC (Steady-State MPC)
在标准 MPC 中添加对稳态偏差的惩罚,确保闭环收敛到期望稳态:
其中 \((x_s, u_s)\) 是通过在线优化得到的期望稳态。
8.2 鲁棒 MPC (Robust MPC)
考虑模型不确定性和扰动:
Min-Max MPC:最坏情况优化:
8.3 随机 MPC (Stochastic MPC)
用概率约束替代确定性约束:
8.4 显式 MPC (Explicit MPC)
离线求解参数化 QP,在线查表获得控制律:
将状态空间划分为多面体区域 \(\mathcal{R}_i\),每个区域对应一个仿射控制律。
8.5 约束线性化 MPC (C-LMPC)
在学习控制中,利用迭代学习逐步优化:
其中 \(l_k\) 是学习到的修正项,\(\gamma \in (0, 1]\) 是学习率。
8.6 参数化 MPC
将控制输入参数化为基函数的线性组合:
决策变量从 \(N\) 维降至 \(n_p\) 维(\(n_p \ll N\))。
MPC 变体特性对比
🚀 9. 应用场景
状态:\([y, \dot{y}, \psi, \dot{\psi}]\)(横向误差、横向速度、航向误差、航向角速度)
import numpy as np
import cvxpy as cp
# 自行车模型参数
dt = 0.1 # 采样周期
Vx = 15.0 # 车速
A = np.array([
[1, dt, 0, 0],
[0, 1, Vx*dt, 0],
[0, 0, 1, dt],
[0, 0, 0, 1]
])
B = np.array([
[0],
[0],
[0],
[Vx*dt]
])
n, m = B.shape
N = 20 # 预测时域
# 权重
Q = np.diag([100, 10, 100, 10])
R = np.diag([1.0])
P = Q # 终端代价
# 约束
u_max = np.deg2rad(35) # 最大转向角
x_min = np.array([-2, -1, -np.deg2rad(10), -1])
x_max = np.array([2, 1, np.deg2rad(10), 1])
# 当前状态
x0 = np.array([0.5, 0, np.deg2rad(3), 0])
# 求解 MPC
u_opt, x_pred, _ = mpc_solve(A, B, Q, R, P, x0, N, x_min, x_max, -u_max, u_max)
print(f"最优控制输入: {np.rad2deg(u_opt):.2f} deg")
四旋翼简化模型,状态:\([x, y, z, \dot{x}, \dot{y}, \dot{z}]\)
# 无人机简化动力学
A = np.block([
[np.eye(3), dt*np.eye(3)],
[np.zeros((3,3)), np.eye(3)]
])
B = np.block([
[0.5*dt**2*np.eye(3)],
[dt*np.eye(3)]
])
# 权重
Q = np.diag([100, 100, 100, 10, 10, 10]) # 位置误差权重高
R = np.diag([1, 1, 1]) # 力输入代价
# 约束
u_min = np.array([0, 0, 0.5]) # 最小推力(需克服重力)
u_max = np.array([10, 10, 20]) # 最大推力
MPC 最早且最成功的应用领域之一
- 应用:蒸馏塔、聚合反应器、结晶过程
- 优势:处理多变量耦合、约束、时滞
- 典型时域:几分钟到几小时
- 商业软件:DMCplus, RMPCT, APC+
考虑可再生能源不确定性的经济调度
- 发电机组启停约束
- 功率平衡约束
- 爬坡率约束
- 储能充放电约束
结合动力学约束的实时轨迹优化
- 关节角度/速度/力矩约束
- 碰撞 avoidance(障碍物约束)
- 全身动力学 MPC(人形机器人、四足机器人)
典型应用系统架构
📊 10. MPC vs LQR 对比
| 特性 | LQR | MPC |
|---|---|---|
| 优化方式 | 离线求解 Riccati 方程 | 在线求解优化问题 |
| 控制律 | 状态反馈 \(u = -Kx\) | 每个时刻求解优化 |
| 约束处理 | 不支持(无约束假设) | 显式处理约束 |
| 非线性 | 仅限线性系统 | 可处理非线性系统 |
| 计算量 | 极低(矩阵乘法) | 较高(求解优化问题) |
| 最优性 | 全局最优(无限时域) | 局部最优(有限时域) |
| 稳定性保证 | 天然稳定 | 需要额外设计 |
| 适用场景 | 线性系统、无约束 | 有约束、非线性系统 |
决策流程图
✅ 线性系统 + 无约束 + 需要最优 + 低计算量 → LQR
✅ 有约束 + 非线性 + 计算资源充足 → MPC
✅ 线性系统 + 有约束 + 计算资源有限 → 约束 LQR 或 显式 MPC
✅ 需要在线优化 + 预测未来行为 → MPC
✅ 简单系统 + 快速部署 → PID
MPC vs LQR 控制结构对比
🏗️ 11. 调参指南
11.1 核心参数
| 参数 | 影响 | 调节建议 |
|---|---|---|
| 预测时域 \(N\) | 稳定性、计算量 | 从 \(N=10\) 开始,逐步增大直到稳定 |
| 阶段代价 \(Q, R\) | 跟踪性能 vs 控制能量 | 使用 Bryson 法则初始化 |
| 终端代价 \(P\) | 稳定性、瞬态性能 | 取 ARE 的解或 \(P = Q\) |
| 采样周期 \(T_s\) | 离散化精度、计算频率 | 根据系统动态和计算能力选择 |
| 控制时域 \(N_c\) | 计算量、灵活性 | 取 \(N_c = N/2\) 或 \(N_c = 5\sim10\) |
11.2 调参流程
Step 1: 无约束调参
先忽略约束,调整 \(Q, R\) 使 MPC 表现接近 LQR
Step 2: 确定时域
逐步增大 \(N\),直到闭环行为不再明显改善
Step 3: 加入约束
逐步放松约束,从紧约束开始,观察可行性
Step 4: 软约束调整
对不可行约束添加松弛,调整惩罚权重
Step 5: 实时性验证
确保求解时间小于采样周期
11.3 Python 调参示例
import numpy as np
import matplotlib.pyplot as plt
# 质量-弹簧-阻尼系统
m, b, k = 1.0, 0.1, 1.0
dt = 0.1
A = np.array([[1, dt], [-k*dt/m, 1-b*dt/m]])
B = np.array([[0], [dt/m]])
def mpc_response(Q_diag, R_val, N, x0, T):
n, m = B.shape
Q = np.diag(Q_diag)
R = np.array([[R_val]])
P = Q
x_min, x_max = np.array([-5, -5]), np.array([5, 5])
u_min, u_max = np.array([-2]), np.array([2])
steps = int(T / dt)
x_history = np.zeros((n, steps))
x_history[:, 0] = x0
for i in range(1, steps):
u, _, _ = mpc_solve(A, B, Q, R, P, x_history[:, i-1], N, x_min, x_max, u_min, u_max)
x_history[:, i] = A @ x_history[:, i-1] + B.flatten() * u
return x_history
# 不同参数对比
fig, axes = plt.subplots(2, 2, figsize=(10, 8))
configs = [
({"Q_diag": [10, 1], "R_val": 0.1, "N": 5, "label": "N=5, R=0.1"}),
({"Q_diag": [10, 1], "R_val": 0.1, "N": 20, "label": "N=20, R=0.1"}),
({"Q_diag": [10, 1], "R_val": 1.0, "N": 20, "label": "N=20, R=1.0"}),
({"Q_diag": [100, 10], "R_val": 0.1, "N": 20, "label": "N=20, Q=10*Q"}),
]
for ax, cfg in zip(axes.flat, configs):
x = mpc_response(cfg["Q_diag"], cfg["R_val"], cfg["N"], np.array([2, 0]), 10)
t = np.arange(0, 10, dt)
ax.plot(t, x[0], label='Position')
ax.set_title(cfg["label"])
ax.legend(); ax.grid(True)
plt.tight_layout()
plt.savefig('mpc_tuning.png', dpi=150)
plt.show()
参数影响关系图
❓ 12. 常见问题
12.1 MPC 不可行怎么办?
1. 约束过紧 → 放松约束或使用软约束
2. 预测时域过短 → 增大 \(N\) 或添加终端约束
3. 模型不匹配 → 添加鲁棒性设计
4. 初始状态不可行 → 检查初始条件,添加可行性保证
12.2 MPC 计算太慢?
1. 减小时域:\(N\) 减小可显著降低计算量
2. 使用热启动:利用上一步解加速求解
3. 降低模型复杂度:使用简化的线性模型
4. 显式 MPC:离线计算,在线查表
5. 专用硬件:FPGA 或嵌入式优化
12.3 如何选择预测时域?
预测时域的选择需要权衡多个因素:
| 因素 | 小 \(N\) | 大 \(N\) |
|---|---|---|
| 计算量 | 低 | 高 |
| 稳定性 | 可能不稳定 | 更稳定 |
| 约束处理 | 可能错过约束 | 更好处理约束 |
| 响应速度 | 快 | 慢 |
12.4 MPC 与 PID 的关系?
MPC 可以看作多变量 PID 的扩展:
- PID 只利用当前误差,MPC 利用未来预测
- PID 难以处理约束,MPC 显式处理
- PID 是单回路,MPC 天然处理多变量耦合
- 在某些情况下,MPC 的稳态行为接近 PID
12.5 终端代价和终端约束哪个更重要?
- 稳定性优先:两者都使用
- 计算优先:至少使用终端代价
- 约束宽松:终端约束可放松
- 实际应用:终端代价更常用,实现更简单
📚 13. 参考文献
- Garcia, C. E., Prett, D. M., & Morari, M. (1989). Model predictive control: theory and practice—a survey. Automatica, 25(3), 335-348.
- Rawlings, J. B., Mayne, D. Q., & Diehl, M. (2017). Model Predictive Control: Theory, Computation, and Design. Nob Hill Publishing.
- Bemporad, A., & Morari, M. (1999). Robust model predictive control: A survey. Robustness in identification and control, 207-226.
- Camacho, E. F., & Bordons, C. (2013). Model Predictive Control (2nd ed.). Springer.
- Morari, M., & Lee, J. H. (1999). Model predictive control: past, present and future. Computers & Chemical Engineering, 23(4-5), 667-682.
← 返回首页 | Last updated: 2026-06-25 | Made with love for predictive control