学习路径

LQR 学习路径

从状态空间到最优控制,系统掌握 LQR 的核心原理、求解方法与实践技巧。本路径分为三层递进框架,适合不同阶段的读者。



💡 0. 核心理念

一句话总结 LQR:LQR 是在无限时域上求解最优状态反馈控制律 \(u = -Kx\),使二次型代价最小。它是有解析解的、无约束的最优控制器。

为什么先学 LQR?

学习路径中的位置:LQR → 理解代价函数和 Q/R/P → MPC(加约束和滚动)→ NMPC(加非线性)。LQR 是第一块基石。

三层递进框架

第一层 基础铺垫 状态空间 + PID 局限 + 最优控制思想 1-2 周 第二层 LQR 核心 代价函数 → Riccati → 求解 → 闭环分析 2-3 周 第三层 拓展与进阶 跟踪 / 积分 / LQG / TVLQR 2-3 周 学完后你应能 从零写 LQR 控制器 · 理解 Q/R 物理含义 · 无缝过渡到 MPC

1 第一层:基础铺垫(1-2 周)

1.1 状态空间基础

LQR 是状态空间设计方法,必须先把状态空间工具用好。

$$\dot{x}(t) = A x(t) + B u(t) \quad \text{(连续)}$$ $$x_{k+1} = A_d x_k + B_d u_k \quad \text{(离散)}$$

必须掌握的核心概念

$$\text{能控性矩阵: } \mathcal{C} = \begin{bmatrix} B & AB & A^2B & \cdots & A^{n-1}B \end{bmatrix}$$ $$\text{能控充要条件: } \text{rank}(\mathcal{C}) = n$$
📝
练习:写出双积分器 \(\ddot{x} = u\)、倒立摆线性化模型、DC 电机模型的状态空间表示。判断能控性。

1.2 PID 的局限

理解为什么需要 LQR,先要知道 PID 不够用在哪里:

对比项PIDLQR
设计方法经验试凑 (Z-N / 整定)模型驱动的优化求解
MIMO 支持需解耦,每个环独立设计天然支持,一次性设计所有增益
性能指标间接(超调、上升时间)直接(代价函数最小化)
最优性不保证保证在代价函数下全局最优
约束处理积分饱和 / 限幅不支持(需要 MPC)
适用系统SISO 为主MIMO 无压力
⚠️
注意:PID 不"差",在很多单回路场景下 PID 仍然是最实用选择。LQR 解决了 PID 在多变量、最优性方面的根本局限。

1.3 最优控制思想

LQR 属于最优控制理论。理解最优控制的核心思维:

  1. 定义一个代价函数:量化什么叫做"好控制"
  2. 求解最优策略:在系统动力学约束下最小化代价
  3. 实施反馈:得到显式反馈律 \(u = -Kx\)
💡
最优控制的三种方法(按难度递增):
1. 变分法 → Euler-Lagrange 方程
2. Pontryagin 极小值原理 → 两点边值问题
3. 动态规划 → Hamilton-Jacobi-Bellman 方程

LQR 的特殊之处在于:用动态规划能得到闭式解析解(Riccati 方程),不需要数值迭代。

1.4 自查清单

2 第二层:LQR 核心(2-3 周)

这是最关键的阶段。目标:手推 Riccati 方程 + 手写 LQR 控制器 + 理解 Q/R 的物理含义

2.1 代价函数

连续 LQR 代价

$$J = \int_0^\infty \left( x(t)^T Q x(t) + u(t)^T R u(t) \right) dt$$

离散 LQR 代价

$$J = \sum_{k=0}^\infty \left( x_k^T Q x_k + u_k^T R u_k \right)$$
⚖️

Q 矩阵 — 状态权重

\(Q \succeq 0\)(半正定),惩罚状态偏差。Q 越大 → 状态收敛越快 → 需要更大的控制力。

R 矩阵 — 控制权重

\(R \succ 0\)(正定),惩罚控制能量。R 越大 → 控制越平缓 → 状态收敛越慢。

Q/R 比值的物理含义

固定 R、增大 Q ⟹ 更激进的控制(更快收敛,更大超调)

固定 Q、增大 R ⟹ 更保守的控制(更慢收敛,更省能量)

\(Q/R\) 的比值决定了系统的主导时间常数

Q/R 调参经验(Bryson's Rule)

$$Q_{ii} = \frac{1}{x_{i,\max}^2}, \quad R_{jj} = \frac{1}{u_{j,\max}^2}$$

通过对角元素归一化,使不同量纲的状态/控制量在代价函数中有可比性。

Q/R 对闭环极点的影响

Re Im 等阻尼线 开环极点 LQR (小Q) LQR (大Q) Q/R 对极点位置的影响 增大 Q(或减小 R)→ 极点左移 → 响应更快,但控制能量更大 LQR 保证闭环极点一定在左半平面

2.2 Riccati 方程

LQR 的核心。通过求解 ARE(Algebraic Riccati Equation)得到最优控制器。

连续 ARE (CARE)

$$A^T P + P A - P B R^{-1} B^T P + Q = 0$$

离散 ARE (DARE)

$$P = A^T P A - A^T P B (R + B^T P B)^{-1} B^T P A + Q$$

最优反馈增益

$$K_{\text{cont}} = R^{-1} B^T P \quad \text{(连续)}$$ $$K_{\text{disc}} = (R + B^T P B)^{-1} B^T P A \quad \text{(离散)}$$

2.3 求解方法

📉

直接求解法

使用 `scipy.linalg.solve_continuous_are` / `care` / `dlqr`

🔄

迭代求解法

Riccati 差分方程:从 \(P_N=Q\) 反向迭代到收敛

🧮

特征向量法

构造 Hamilton 矩阵,取稳定特征子空间

⚙️

LMI 方法

将 ARE 转化为线性矩阵不等式,用凸优化求解

理解迭代法:从 \(P_N = Q\) 开始,反向迭代:
\(P_{k} = A^T P_{k+1} A - A^T P_{k+1} B (R + B^T P_{k+1} B)^{-1} B^T P_{k+1} A + Q\)
当 \(k \to -\infty\) 时 \(P_k\) 收敛到稳态解。这个方法揭示了一个重要联系:MPC 的终端代价 P 正是 LQR 的稳态 Riccati 解

2.4 闭环分析

LQR 设计完成后,必须分析闭环系统:

$$\dot{x} = (A - B K) x \quad \text{(连续)}$$

LQR 的重要理论保证

  1. 稳定性:如果 (A, B) 能控,(A, Q^{1/2}) 能观,则闭环系统渐近稳定
  2. 相位裕度:连续 LQR 有无限增益裕度(\(1/2 \to \infty\))和 60° 相位裕度
  3. 最优性:LQR 是唯一的使代价函数最小的线性反馈控制器

2.5 从零手写 LQR

手写 LQR 控制器 — 双积分器示例Python
import numpy as np
from scipy.linalg import solve_continuous_are, inv
import matplotlib.pyplot as plt

# 系统:双积分器 (连续)
A = np.array([[0, 1], [0, 0]])
B = np.array([[0], [1]])

# LQR 权重
Q = np.array([[10, 0], [0, 1]])  # 位置权重 10,速度权重 1
R = np.array([[0.1]])            # 控制权重

# 求解连续 ARE → P
P = solve_continuous_are(A, B, Q, R)

# 最优反馈增益
K = inv(R) @ B.T @ P
print(f"K = {K}")  # K = [[3.16, 2.56]] (近似)

# 闭环系统
A_cl = A - B @ K
eigvals = np.linalg.eigvals(A_cl)
print(f"闭环极点 = {eigvals}")  # 都在左半平面

# 仿真
def simulate_lqr(x0, dt, steps):
    x = x0.copy()
    traj = [x.copy()]
    for _ in range(steps):
        u = -K @ x
        x = x + (A @ x + B @ u).flatten() * dt  # 欧拉积分
        traj.append(x.copy())
    return np.array(traj)

x0 = np.array([1.0, 0.0])  # 初始位置 1,速度 0
traj = simulate_lqr(x0, dt=0.01, steps=500)
进阶练习
1. 用不同的 Q, R 组合观察闭环极点的变化轨迹
2. 对比连续 LQR 和离散 LQR(使用 `dlqr`)的效果
3. 在一个 MIMO 系统上设计 LQR(如四旋翼简化模型)
4. 比较 LQR 和极点配置法设计的闭环响应差异

2.6 自查清单

3 第三层:LQR 拓展(2-3 周)

实际工程中很少用到原始 LQR(调节到原点),更多是其变体。第三层把这些工程常用变体讲透。

3.1 LQR 跟踪 (LQT)

目标:跟踪参考信号 \(r(t)\),而非回到原点。

$$J = \int_0^\infty \left( (x - x_r)^T Q (x - x_r) + (u - u_r)^T R (u - u_r) \right) dt$$

解的形式变为:

$$u = -K x + K_f r$$

其中前馈增益 \(K_f\) 需要额外计算。对阶跃参考,\(K_f = -(C (A - BK)^{-1} B)^{-1}\)(1-DOF)或通过增广系统(2-DOF)。

💡
重要:LQR 跟踪问题提醒我们:MPC 的参考跟踪代价也是从 LQT 来的。区别在于 MPC 可以预测未来的参考变化,而 LQT 是无限时域静态前馈。

3.2 积分 LQR (LQI)

原始 LQR 没有积分项,存在稳态误差(有模型误差时)。LQI 引入积分作用消除稳态误差。

增广系统

$$\dot{x}_I = r - y = r - C x \quad \text{(误差的积分)}$$ $$\begin{bmatrix} \dot{x} \\ \dot{x}_I \end{bmatrix} = \begin{bmatrix} A & 0 \\ -C & 0 \end{bmatrix} \begin{bmatrix} x \\ x_I \end{bmatrix} + \begin{bmatrix} B \\ 0 \end{bmatrix} u + \begin{bmatrix} 0 \\ I \end{bmatrix} r$$

在增广系统上设计 LQR,得到控制律:

$$u = -K_p x - K_I x_I$$

对应到 MP 中,这就是为什么 MPC 可以用"增量形式"(\(\Delta u\))自动获得积分作用。

联系:MPC 的增量形式 \(x_{k+1} = A x_k + B \Delta u_k\) 天然包含积分作用,等价于 LQI 的思想。这也是为什么就算模型有偏差,MPC 通常没有稳态误差。

3.3 时变 LQR (TVLQR / Time-Varying LQR)

当系统沿参考轨迹变化时(如火箭入轨、机器人轨迹跟踪),使用时变增益:

$$u(t) = -K(t) (x(t) - x_r(t)) + u_r(t)$$

\(K(t)\) 通过对时变 Riccati 方程反向积分得到。TVLQR 是 LQR 到 MPC 的桥梁:

3.4 LQG 与分离原理

当状态不可测时,使用 Kalman 滤波器估计状态,再用 LQR 增益,组合成 LQG 控制器。

LQR 增益 K Kalman 滤波 LQG 缺少鲁棒性 需要 Loop Transfer Recovery

分离原理:LQR 和 Kalman 滤波器可以独立设计,组合后闭环仍然稳定。这是一个非常重要的理论结果。

⚠️
重要警告:LQG 虽然理论上由分离原理保证,但实际中 LQG 的鲁棒性很差(Doyle 在 1978 年指出)。需要 LTR (Loop Transfer Recovery) 技术修正。这提醒我们:理论最优不等于工程鲁棒。

3.5 输出反馈 LQR

直接用输出 y 而非状态 x 做反馈:\(u = -K_y y\)。这是次优的(因为输出通常维度小于状态),需要求解输出反馈 Riccati 方程,通常用迭代 LMI 求解。

3.6 自查清单

4 第四层:深入理论(可选)

第四层面向学术研究和追求理论深度的读者。

4.1 稳定性与 Lyapunov

LQR 的最优控制律天然是一个 Lyapunov 函数:

$$V(x) = x^T P x$$ $$\dot{V}(x) = -x^T (Q + K^T R K) x \leq 0$$

这说明 LQR 闭环系统是 Lyapunov 稳定的。这个联系也是 MPC 稳定性证明的出发点:

4.2 鲁棒性与增益裕度

连续时间 LQR 有优秀的鲁棒性保证:

这些特性只在连续 LQR 中成立。离散 LQR 没有这些保证。

此外,LQG 没有这些鲁棒性保证,必须用 LTR 恢复。

4.3 H₂ / H∞ 的联系

LQR 本质上是 H₂ 最优控制的一个特例:

$$\text{LQR: } \min \int (x^T Q x + u^T R u) dt$$ $$\text{H₂: } \min \|G_{zw}\|_2 \quad \text{(从扰动 w 到性能输出 z 的 2-范数)}$$

如果选择 \(z = \begin{bmatrix} Q^{1/2} \\ 0 \end{bmatrix} x + \begin{bmatrix} 0 \\ R^{1/2} \end{bmatrix} u\),则 H₂ 控制退化为 LQR。

而 H∞ 控制考虑最坏情况扰动,对应 Riccati 方程中引入参数 γ,求解更一般的 Riccati 不等式。

4.4 离散 LQR 的更多细节

实际工程中大多使用离散 LQR(因为计算机实现)。需要注意:

💡
采样周期建议:\(T_s\) 应小于系统最小时间常数的 1/10。如果 LQR 在离散域表现不佳,先检查采样周期是否过大。

📅 5. 学习计划与资源

5.1 建议时间线

第1层 (1-2周) 第2层 (2-3周) 第3层 (2-3周) 第4层 (可选) 第1周 状态空间 + 能控性/能观性 第2周 最优控制思想 + PID 局限 第3-4周 Riccati 方程手推 + LQR 代码实现 第5-6周 LQT / LQI / TVLQR / LQG 逐个实现 毕业产出 你的 GitHub 仓库: 双积分器 LQR → 倒立摆 LQR → LQG 不要踩的坑 只调 Q/R 不懂背后原理

5.2 推荐书目

书名作者难度推荐理由
Modern Control SystemsDorf & Bishop入门经典控制教材,前 10 章覆盖状态空间和 LQR 基础
Linear Systems Theory and DesignChen基础线性系统理论圣经,讲透了状态空间方法
Optimal Control Theory: An IntroductionKirk基础最优控制入门经典,LQR 推导非常详尽
Applied Optimal ControlBryson & Ho进阶老派经典,LQR + 轨迹优化的实用方法
Robust and Optimal ControlZhou, Doyle & Glover进阶从 LQR 到 H₂/H∞ 的完整理论体系

5.3 代码资源

资源说明
`scipy.linalg.solve_continuous_are`Python 求解 CARE
`scipy.linalg.solve_discrete_are`Python 求解 DARE
Matlab `lqr(A, B, Q, R)`一行命令求解 LQR(连续)
Matlab `dlqr(A, B, Q, R)`一行命令求解离散 LQR
Matlab `lqi(sys, Q, R)`带积分的 LQR 设计
`control` Python library`control.lqr()` 直接可用

5.4 LQR → MPC 过渡

学完 LQR 后,以下是对照帮理解 MPC:

概念LQRMPC
时域无限 \((0, \infty)\)有限 \((k, k+N)\)
约束不支持显式处理
求解离线(ARE 解析解)在线(QP 求解器)
反馈律恒定增益 \(K\)时变(滚动优化)
代价函数\(J_\infty = \sum (\cdots)\)\(J_N = \sum_{i=0}^{N-1} (\cdots) + x_N^T P x_N\)
终端权重 PRiccati 解Riccati 解(与 LQR 相同)
最优性全局最优约束下最优
计算微秒级(矩阵乘法)毫秒级(QP 求解)
关键一句话:MPC = LQR + 约束 + 滚动时域。LQR 给 MPC 提供了代价函数结构和终端代价 P,MPC 在 LQR 基础上增加了约束处理能力和在线适应性。

6. 常见问题

Q1: LQR 和极点配置有什么区别?优缺点?

极点配置:直接指定闭环极点位置→唯一确定 K。优点是直观;缺点是不知道"什么样的极点最优",且 MIMO 系统极点不唯一对应 K。

LQR:通过 Q,R 间接影响极点位置。优点是有理论最优性保证,有稳定裕度;缺点是需要调 Q,R。

建议:如果需要快速满足时域指标且经验丰富,用极点配置。如果追求最优性和鲁棒性,用 LQR。两者通常配合使用:先用 LQR 得到初步设计,再微调。

Q2: Q 和 R 具体怎么选?有没有系统的方法?

有几种常用策略:
1. Bryson's Rule:\(Q_{ii}=1/x_{i,\max}^2,\; R_{jj}=1/u_{j,\max}^2\) — 最常用的起点
2. 试凑法:固定 R=I,调整 Q 的对角元。增大 Q_{11} 看对应状态是否收敛更快
3. 频率加权法:在代价函数中加入频率权重,抑制特定频段的响应
4. LMI 优化:将 Q,R 作为优化变量,加入时域约束(上升时间、超调量)

Q3: 连续 LQR 和离散 LQR 结果一样吗?

不一样。即使同样的 Q,R,离散 LQR 的增益通常不同。
- 如果采样周期 \(T_s\) 足够小(远小于系统时间常数),两者结果接近
- 离散 LQR 没有连续 LQR 的鲁棒性保证(增益/相位裕度)
- 工程建议:直接用离散模型设计离散 LQR,与实际实现一致

Q4: LQR 和 MPC 都讲代价函数,具体怎么衔接?

直接回答:MPC 的代价函数就是 LQR 代价的有限时域截断 + 终端代价。

MPC 的代价:$$J_N = \sum_{i=0}^{N-1} (x_i^T Q x_i + u_i^T R u_i) + x_N^T P x_N$$
LQR 的代价:$$J_\infty = \sum_{i=0}^{\infty} (x_i^T Q x_i + u_i^T R u_i)$$

终代价 P 就是 ARE 的解。当 N→∞,去掉约束,MPC 退化为 LQR。这是 MPC 稳定性的理论基础:终端代价保证了预测时域外的代价被正确估计。

Q5: LQR 需要系统模型,模型不准怎么办?

几个方向:
1. 基于辨识的 LQR:用系统辨识得到模型(ARX、子空间法)
2. 鲁棒 LQR:考虑模型不确定性,用 Riccati 不等式 / LMI 设计
3. 自适应 LQR:在线更新模型,重新求解 ARE
4. LQG + LTR:通过 Loop Transfer Recovery 恢复鲁棒性
5. 改用 MPC:MPC 对模型误差有一定的鲁棒性(滚动优化 + 反馈校正)

Q6: 学完 LQR 后到底要不要学 MPC?

取决于你的应用场景

只用 LQR 就够了
- 系统运行在固定工作点(线性化有效)
- 约束不活跃或可以通过限幅处理
- 计算资源有限(MEMS、嵌入式 MCU)
- 系统简单(SISO,弱耦合)

必须学 MPC
- 有显式约束要处理(安全边界、执行器饱和)
- 系统有强耦合(MIMO)
- 需要预测未来的参考变化(自动驾驶路径跟踪)
- 系统非线性强或有大范围变化

但无论哪种情况,LQR 都是 MPC 的必修前置课

目录