预测控制理论

Model Predictive Control

MPC(模型预测控制)是一种基于在线优化的先进控制策略,通过在每个采样时刻求解有限时域优化问题来处理约束和非线性,广泛应用于工业过程控制、自动驾驶、机器人等领域。

📖 1. 概述

MPC(Model Predictive Control,模型预测控制)是一种滚动优化的控制方法。其核心思想是:在每个控制时刻,基于系统模型预测未来一段时间内的系统行为,求解一个有限时域优化问题,只实施第一个控制动作,然后在下一时刻重新优化。

🔮

预测模型

利用系统模型预测未来状态演化

📈

滚动优化

每个时刻求解有限时域最优控制问题

⚙️

约束处理

显式处理输入/状态/输出约束

🔄

反馈校正

利用当前测量值修正预测,形成闭环

💡
核心优势:MPC 能够在优化过程中直接处理各种约束(输入约束、状态约束、输出约束),这是 LQR、PID 等传统方法难以实现的。

MPC 控制循环架构

① 系统建模 建立预测模型 ② 优化求解 求解有限时域 OCP ③ 实施控制
施加第一个 \(u^*\)
④ 系统响应 被控对象执行 ⑤ 状态测量
获取 \(x(t_k)\)
反馈校正 重新优化 滚动优化 每个采样周期重复上述循环 ✓ 仅实施第一个控制动作 ✓ 下一时刻重新优化 ✓ 滚动时域在线优化

🔧 2. 问题建模

2.1 MPC 优化问题

MPC 在每个时刻 \(t_k\) 求解以下有限时域最优控制问题:

$$\min_{u_{k},...,u_{k+N-1}} J = \sum_{i=0}^{N-1} \ell(x_{k+i|k}, u_{k+i|k}) + V_f(x_{k+N|k})$$

约束条件:

$$x_{k+i+1|k} = f(x_{k+i|k}, u_{k+i|k}), \quad i = 0,...,N-1$$ $$x_{\min} \leq x_{k+i|k} \leq x_{\max}, \quad i = 1,...,N$$ $$u_{\min} \leq u_{k+i|k} \leq u_{\max}, \quad i = 0,...,N-1$$ $$x_{k|k} = x(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\))
  • 减小决策变量数量,降低计算复杂度

预测时域滚动优化示意图

滚动优化过程 (N=5) k=0 u₀ u₁ u₂ u₃ u₄ u₅ → 预测时域 k=1 u₀ u₁' u₂' u₃' u₄' u₅' u₆' → 窗口右移 k=2 u₀ u₁' u₂'' u₃'' u₄'' u₅'' u₆'' u₇'' → 继续滚动 实施 已实施 预测 每个时刻重新求解,仅实施第一个控制动作 u*

典型代价函数形式

线性系统 + 二次代价(QMPC)
$$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}$$

这是最常见的 MPC 形式,每步求解一个二次规划 (QP) 问题。

带参考轨迹跟踪
$$J = \sum_{i=0}^{N-1} \left[ \|x_{k+i|k} - x_{ref}\|_Q^2 + \|u_{k+i|k} - u_{ref}\|_R^2 \right] + \|x_{k+N|k} - x_{ref}\|_P^2$$
含终端代价与终端约束
$$J = \sum_{i=0}^{N-1} \ell(x_{k+i|k}, u_{k+i|k}) + V_f(x_{k+N|k})$$

终端代价 \(V_f\) 和终端约束 \(x_{k+N|k} \in \mathcal{X}_f\) 用于保证闭环稳定性。

📝 3. 公式推导

3.1 线性 MPC 推导

考虑线性时不变系统:

$$x_{k+1} = Ax_k + Bu_k$$

Step 1: 将优化问题转化为 QP

定义决策变量 \(\mathbf{u} = [u_0^T, u_1^T, ..., u_{N-1}^T]^T\),将预测状态表示为 \(\mathbf{u}\) 的函数:

$$\begin{aligned} x_1 &= Ax_0 + Bu_0 \\ x_2 &= A^2x_0 + ABu_0 + Bu_1 \\ x_3 &= A^3x_0 + A^2Bu_0 + ABu_1 + Bu_2 \\ &\vdots \\ x_N &= A^Nx_0 + \sum_{i=0}^{N-1} A^{N-1-i}Bu_i \end{aligned}$$

Step 2: 构造矩阵形式

定义预测矩阵:

$$\mathbf{x} = \mathcal{A} x_0 + \mathcal{B} \mathbf{u}$$

其中:

$$\mathcal{A} = \begin{bmatrix} A \\ A^2 \\ \vdots \\ A^N \end{bmatrix}, \quad \mathcal{B} = \begin{bmatrix} B & 0 & \cdots & 0 \\ AB & B & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ A^{N-1}B & A^{N-2}B & \cdots & B \end{bmatrix}$$

Step 3: 代价函数的 QP 形式

对于二次代价:

$$J = \sum_{i=0}^{N-1}(x_i^TQx_i + u_i^TRu_i) + x_N^TPx_N$$

定义:

$$\bar{Q} = \text{diag}(\underbrace{Q,...,Q}_{N}, P), \quad \bar{R} = \text{diag}(\underbrace{R,...,R}_{N})$$

代入预测方程 \(\mathbf{x} = \mathcal{A}x_0 + \mathcal{B}\mathbf{u}\):

$$J = \frac{1}{2}\mathbf{u}^T H \mathbf{u} + f^T \mathbf{u} + \text{const}$$

其中:

$$H = \mathcal{B}^T \bar{Q} \mathcal{B} + \bar{R}, \quad f = \mathcal{B}^T \bar{Q} \mathcal{A} x_0$$

约束条件转化为 \(\mathbf{A}_{ineq} \mathbf{u} \leq \mathbf{b}_{ineq}\)。

Step 4: 求解 QP

在每个采样时刻,测量当前状态 \(x(t_k)\),求解:

$$\min_{\mathbf{u}} \frac{1}{2}\mathbf{u}^T H \mathbf{u} + f(x_k)^T \mathbf{u} \quad \text{s.t.} \quad \mathbf{A}_{ineq}\mathbf{u} \leq \mathbf{b}(x_k)$$

取第一个最优控制动作 \(u^*_0\) 施加到系统。

QP 构造流程图

线性 MPC → QP 构造流程 状态空间方程
\(x_{k+1} = Ax_k + Bu_k\)
展开预测
\(\mathbf{x} = \mathcal{A}x_0 + \mathcal{B}\mathbf{u}\)
构造代价函数
\(J = \mathbf{x}^T\bar{Q}\mathbf{x} + \mathbf{u}^T\bar{R}\mathbf{u}\)
代入预测方程
\(J = \frac{1}{2}\mathbf{u}^T H \mathbf{u} + f^T \mathbf{u}\)
约束转化
\(\mathbf{A}_{ineq}\mathbf{u} \leq \mathbf{b}_{ineq}\)
标准 QP 形式
\(\min \frac{1}{2}\mathbf{u}^T H \mathbf{u} + g^T \mathbf{u}\)
求解器求解 OSQP / qpOASES

3.2 非线性 MPC (NMPC) 推导

对于非线性系统 \(\dot{x} = f(x, u)\)(连续)或 \(x_{k+1} = f(x_k, u_k)\)(离散):

连续时间 NMPC

$$\min_{u(\cdot)} \int_0^{T_p} \ell(x(t), u(t)) dt + V_f(x(T_p))$$

约束:

$$\dot{x}(t) = f(x(t), u(t)), \quad x(0) = x(t_k)$$ $$x(t) \in \mathcal{X}, \quad u(t) \in \mathcal{U}$$

离散时间 NMPC

$$\min_{u_0,...,u_{N-1}} \sum_{i=0}^{N-1} \ell(x_i, u_i) + V_f(x_N)$$

约束:

$$x_{i+1} = f(x_i, u_i), \quad x_0 = x(t_k)$$

求解方法

📉

直接法

将控制参数化后作为有限维优化问题求解(SQP、内点法)

🎯

间接法

基于 Pontryagin 极大值原理求解两点边值问题

🔄

多重打靶法

将轨迹分段,同时优化节点和控制

⚠️
计算挑战:NMPC 每步需要求解非线性优化问题,计算量远大于线性 MPC。实时应用需要高效求解器(如 ACADOS、CasADi + IPOPT)和合适的硬件。

⚖️ 4. 连续时间与离散时间处理

连续时间模型

$$\dot{x}(t) = f(x(t), u(t))$$

离散化方法

  • 零阶保持器 (ZOH)
  • 一阶保持器 (FOH)
  • 数值积分(RK4、Runge-Kutta)

离散时间模型

$$x_{k+1} = f(x_k, u_k)$$

直接用于 MPC 预测,无需额外处理。

零阶保持器 (ZOH) 离散化

对于线性系统 \(\dot{x} = Ax + Bu\),采样周期 \(T_s\):

$$A_d = e^{AT_s}, \quad B_d = \left(\int_0^{T_s} e^{A\tau} d\tau\right) B$$

离散化方法对比

方法精度计算量适用场景
ZOH一阶采样周期较小的系统
FOH二阶控制信号变化较快
RK4四阶中高非线性系统离散化
精确离散化精确高(需矩阵指数)线性系统、高精度要求
💡
选择建议:大多数 MPC 实现直接使用离散时间模型。若物理模型为连续形式,先进行离散化再设计 MPC。采样周期 \(T_s\) 的选择需兼顾控制性能和计算能力。

⚙️ 5. 求解算法

5.1 QP 求解器

线性 MPC 的核心是求解带约束的二次规划问题:

$$\min_{\mathbf{u}} \frac{1}{2}\mathbf{u}^T H \mathbf{u} + g^T \mathbf{u} \quad \text{s.t.} \quad \mathbf{A}_{eq}\mathbf{u} = \mathbf{b}_{eq}, \quad \mathbf{A}_{ineq}\mathbf{u} \leq \mathbf{b}_{ineq}$$

常用 QP 求解器

求解器算法特点适用场景
OSQPADMM开源、嵌入式友好中等规模问题
qpOASES在线活动集热启动、实时性好MPC 在线求解
Gurobi内点法/单纯形商业、高效大规模问题
HiGHS内点法开源、高效通用优化
CasADi + IPOPT内点法支持符号建模NMPC

5.2 线性 MPC Python 实现

使用 cvxpy 求解 MPCPython
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 冷启动对比

热启动加速效果 冷启动 (Cold Start) 迭代次数: ~15-20 收敛慢 热启动 (Warm Start) 迭代次数: ~3-5 快速收敛 上一步解
\(\mathbf{u}^*_{k-1}\) → 随机初始点
移位:
\(\mathbf{u}' = [u_2, u_3, ..., 0]\)
移位

🛠️ 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_{\min} \leq u_i \leq u_{\max} \quad \Leftrightarrow \quad \begin{bmatrix} -I \\ I \end{bmatrix} \mathbf{u} \leq \begin{bmatrix} -u_{\min} \mathbf{1} \\ u_{\max} \mathbf{1} \end{bmatrix}$$

状态约束(通过预测矩阵转化)

$$x_{\min} \leq \mathcal{A}x_0 + \mathcal{B}\mathbf{u} \leq x_{\max}$$ $$\Leftrightarrow \begin{bmatrix} -\mathcal{B} \\ \mathcal{B} \end{bmatrix}\mathbf{u} \leq \begin{bmatrix} \mathcal{A}x_0 - x_{\min} \\ x_{\max} - \mathcal{A}x_0 \end{bmatrix}$$

输入变化率约束

$$\Delta u_{\min} \leq u_i - u_{i-1} \leq \Delta u_{\max}$$

其中 \(u_{-1} = u(t_k - 1)\) 是上一时刻实际施加的控制量。

6.3 软约束

对于硬约束不可行的情况,引入松弛变量将其转化为软约束:

$$x_{\min} - \epsilon \leq x_k \leq x_{\max} + \epsilon, \quad \epsilon \geq 0$$

在代价函数中添加惩罚项 \(\rho \|\epsilon\|^2\),保证问题始终可行。

实践建议:对安全关键约束使用硬约束,对性能约束使用软约束(如障碍物距离)。松弛因子 \(\rho\) 应足够大以确保可行性优先。

约束类型可视化

约束类型几何表示 输入约束 (箱式) 可行域 \(u_{min} \leq u \leq u_{max}\) 状态约束 (椭圆) 可行域 平衡点 耦合约束 可行域 \(u_1\) 和 \(u_2\) 耦合 输入约束: 矩形/箱式 状态约束: 凸集 耦合约束: 一般凸集

🎯 7. 稳定性分析

7.1 无限时域 MPC 的稳定性

若预测时域 \(N \to \infty\),MPC 退化为 LQR,自然稳定。但有限时域 MPC 的稳定性需要额外保证。

7.2 保证稳定性的方法

终端代价 (Terminal Cost)

选择终端代价 \(V_f(x) = x^TPx\) 作为从终端状态出发到原点的最优代价的近似:

$$V_f(x) = x^TPx \quad \text{其中 } P \text{ 满足离散 Riccati 方程}$$

效果:保证从预测时域末端到无穷远的代价被正确估计。

终端约束 (Terminal Constraint)

强制终端状态进入一个不变集 \(\mathcal{X}_f\):

$$x_{k+N} \in \mathcal{X}_f$$

其中 \(\mathcal{X}_f\) 是围绕平衡点的一个控制不变集。

收缩约束 (Contraction Constraint)

要求预测时域末端的状态小于初始状态:

$$V_f(x_{k+N}) \leq V_f(x_k)$$

7.3 稳定性定理

定理:若满足以下条件,MPC 闭环系统渐近稳定:
1. 阶段代价 \(\ell(x,u) \geq \alpha(\|x\|)\)(正定)
2. 终端代价 \(V_f\) 是终端局部控制器的 Lyapunov 函数
3. 终端约束集 \(\mathcal{X}_f\) 是终端局部控制器的控制不变集
4. 优化问题在 \(x_k = 0\) 处可行

Lyapunov 函数单调下降示意

Lyapunov 函数沿轨迹下降 V(x) 时间步 k \(x_0\) → 0 \(V(x_{k+1}) \leq V(x_k) - \alpha(\|x_k\|)\) 保证渐近稳定

🔥 8. MPC 变体

8.1 稳态 MPC (Steady-State MPC)

在标准 MPC 中添加对稳态偏差的惩罚,确保闭环收敛到期望稳态:

$$J = \sum_{i=0}^{N-1} \left[\|x_{k+i|k} - x_s\|_Q^2 + \|u_{k+i|k} - u_s\|_R^2\right] + \|x_{k+N|k} - x_s\|_P^2$$

其中 \((x_s, u_s)\) 是通过在线优化得到的期望稳态。

8.2 鲁棒 MPC (Robust MPC)

考虑模型不确定性和扰动:

$$x_{k+1} = Ax_k + Bu_k + w_k, \quad w_k \in \mathcal{W}$$

Min-Max MPC:最坏情况优化:

$$\min_{\mathbf{u}} \max_{w \in \mathcal{W}} J(x, u, w)$$

8.3 随机 MPC (Stochastic MPC)

用概率约束替代确定性约束:

$$\Pr(x_k \in \mathcal{X}) \geq 1 - \epsilon \quad \text{(机会约束)}$$

8.4 显式 MPC (Explicit MPC)

离线求解参数化 QP,在线查表获得控制律:

$$u^*(x) = K_i x + d_i, \quad \text{当 } x \in \mathcal{R}_i$$

将状态空间划分为多面体区域 \(\mathcal{R}_i\),每个区域对应一个仿射控制律。

💡
适用场景:嵌入式系统、FPGA 实现、采样周期极短的场景。离线计算量大,在线计算极快(查表+矩阵乘法)。

8.5 约束线性化 MPC (C-LMPC)

在学习控制中,利用迭代学习逐步优化:

$$u_{k+1}(t) = u_k(t) + \gamma \cdot l_k(x_k(t))$$

其中 \(l_k\) 是学习到的修正项,\(\gamma \in (0, 1]\) 是学习率。

8.6 参数化 MPC

将控制输入参数化为基函数的线性组合:

$$u(t) = \sum_{j=1}^{n_p} \theta_j \phi_j(t)$$

决策变量从 \(N\) 维降至 \(n_p\) 维(\(n_p \ll N\))。

MPC 变体特性对比

MPC 变体特性雷达图 精度 实时性 鲁棒性 计算量 标准 MPC 精度 实时性 鲁棒性 计算量 NMPC 鲁棒 MPC 精度 实时性 鲁棒性 计算量 随机 MPC 显式 MPC

🚀 9. 应用场景

🚗 自动驾驶轨迹跟踪

状态:\([y, \dot{y}, \psi, \dot{\psi}]\)(横向误差、横向速度、航向误差、航向角速度)

Python 代码Python
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}]\)

Python 代码Python
# 无人机简化动力学
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(人形机器人、四足机器人)

典型应用系统架构

自动驾驶 MPC 系统架构 感知层 LiDAR/Camera 定位层 GPS/IMU融合 规划层 (MPC) 轨迹优化 + 约束处理 预测时域 N 步 控制层 PID/前馈 执行层 转向/油门/刹车 状态反馈 MPC 核心:在规划层实时求解带约束的优化问题 采样周期: 10-100ms | 预测时域: 20-50步 | 求解器: OSQP/qpOASES

📊 10. MPC vs LQR 对比

特性LQRMPC
优化方式离线求解 Riccati 方程在线求解优化问题
控制律状态反馈 \(u = -Kx\)每个时刻求解优化
约束处理不支持(无约束假设)显式处理约束
非线性仅限线性系统可处理非线性系统
计算量极低(矩阵乘法)较高(求解优化问题)
最优性全局最优(无限时域)局部最优(有限时域)
稳定性保证天然稳定需要额外设计
适用场景线性系统、无约束有约束、非线性系统

决策流程图

选型指南:

✅ 线性系统 + 无约束 + 需要最优 + 低计算量 → LQR
✅ 有约束 + 非线性 + 计算资源充足 → MPC
✅ 线性系统 + 有约束 + 计算资源有限 → 约束 LQR显式 MPC
✅ 需要在线优化 + 预测未来行为 → MPC
✅ 简单系统 + 快速部署 → PID
实践联系:当 MPC 的预测时域 \(N \to \infty\)、无约束、线性系统、二次代价时,MPC 退化为 LQR。因此 LQR 可以看作 MPC 的一个特例。

MPC vs LQR 控制结构对比

LQR vs MPC 控制结构 LQR (离线设计) 参考 r(t) K (固定) 系统 状态反馈 x(t) u = -Kx (矩阵乘法) 优点: 快速、稳定 缺点: 无约束处理 MPC (在线优化) 参考轨迹 在线优化
\(\min J \text{ s.t. 约束}\)
u* = argmin J (QP求解) 优点: 处理约束、非线性 缺点: 计算量大

🏗️ 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 调参示例

调参对比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()

参数影响关系图

MPC 参数影响关系 MPC 性能 跟踪精度 + 约束满足 Q 权重 + 跟踪 R 权重 - 控制 N 时域 + 稳定 Ts 采样 - 精度 P 终端 + 稳定 Nc 控制 + 灵活 ↑ 增大参数值 | + 正相关 | - 负相关 经验: Q=R=1 初始, 逐步调整; N=10~50; Ts 根据系统动态选择

12. 常见问题

12.1 MPC 不可行怎么办?

⚠️
常见原因及解决方案:
1. 约束过紧 → 放松约束或使用软约束
2. 预测时域过短 → 增大 \(N\) 或添加终端约束
3. 模型不匹配 → 添加鲁棒性设计
4. 初始状态不可行 → 检查初始条件,添加可行性保证

12.2 MPC 计算太慢?

⚠️
优化策略:
1. 减小时域:\(N\) 减小可显著降低计算量
2. 使用热启动:利用上一步解加速求解
3. 降低模型复杂度:使用简化的线性模型
4. 显式 MPC:离线计算,在线查表
5. 专用硬件:FPGA 或嵌入式优化

12.3 如何选择预测时域?

预测时域的选择需要权衡多个因素:

因素小 \(N\)大 \(N\)
计算量
稳定性可能不稳定更稳定
约束处理可能错过约束更好处理约束
响应速度
💡
经验法则:\(N\) 取系统主要动态时间常数的 2-5 倍(以采样周期为单位)。例如,若系统响应时间约 2 秒,\(T_s = 0.1s\),则 \(N \approx 20\sim50\)。

12.4 MPC 与 PID 的关系?

MPC 可以看作多变量 PID 的扩展:

12.5 终端代价和终端约束哪个更重要?

建议
- 稳定性优先:两者都使用
- 计算优先:至少使用终端代价
- 约束宽松:终端约束可放松
- 实际应用:终端代价更常用,实现更简单

📚 13. 参考文献

  1. Garcia, C. E., Prett, D. M., & Morari, M. (1989). Model predictive control: theory and practice—a survey. Automatica, 25(3), 335-348.
  2. Rawlings, J. B., Mayne, D. Q., & Diehl, M. (2017). Model Predictive Control: Theory, Computation, and Design. Nob Hill Publishing.
  3. Bemporad, A., & Morari, M. (1999). Robust model predictive control: A survey. Robustness in identification and control, 207-226.
  4. Camacho, E. F., & Bordons, C. (2013). Model Predictive Control (2nd ed.). Springer.
  5. 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