LQR 学习路径
从状态空间到最优控制,系统掌握 LQR 的核心原理、求解方法与实践技巧。本路径分为三层递进框架,适合不同阶段的读者。
💡 0. 核心理念
为什么先学 LQR?
- MPC 的前身:MPC 代价函数就是 LQR 代价的有限时域截断 + 约束
- 终端代价 P:MPC 的终端权重矩阵 P 正是由 LQR 的 Riccati 方程给出
- 最优控制范式:代价函数 \(x^T Q x + u^T R u\) 是现代控制设计的标准语言
- 有封闭解:不需要迭代求解,能直观分析 Q/R 对闭环特性的影响
三层递进框架
1 第一层:基础铺垫(1-2 周)
1.1 状态空间基础
LQR 是状态空间设计方法,必须先把状态空间工具用好。
必须掌握的核心概念:
- 能控性:LQR 能控制的前提是 (A, B) 能控。如果系统不可控,LQR 只能稳定能控子空间。
- 能观性:如果要用观测器,需要 (A, C) 能观。
- 极点与稳定性:理解特征值如何决定系统动态。
1.2 PID 的局限
理解为什么需要 LQR,先要知道 PID 不够用在哪里:
| 对比项 | PID | LQR |
|---|---|---|
| 设计方法 | 经验试凑 (Z-N / 整定) | 模型驱动的优化求解 |
| MIMO 支持 | 需解耦,每个环独立设计 | 天然支持,一次性设计所有增益 |
| 性能指标 | 间接(超调、上升时间) | 直接(代价函数最小化) |
| 最优性 | 不保证 | 保证在代价函数下全局最优 |
| 约束处理 | 积分饱和 / 限幅 | 不支持(需要 MPC) |
| 适用系统 | SISO 为主 | MIMO 无压力 |
1.3 最优控制思想
LQR 属于最优控制理论。理解最优控制的核心思维:
- 定义一个代价函数:量化什么叫做"好控制"
- 求解最优策略:在系统动力学约束下最小化代价
- 实施反馈:得到显式反馈律 \(u = -Kx\)
1. 变分法 → Euler-Lagrange 方程
2. Pontryagin 极小值原理 → 两点边值问题
3. 动态规划 → Hamilton-Jacobi-Bellman 方程
LQR 的特殊之处在于:用动态规划能得到闭式解析解(Riccati 方程),不需要数值迭代。
1.4 自查清单
- ✅ 能写出任意线性系统的状态空间表示
- ✅ 会用能控性矩阵判据判别能控性
- ✅ 能解释 PID 和 LQR 的根本区别
- ✅ 理解"代价函数"和"最优"的含义
2 第二层:LQR 核心(2-3 周)
这是最关键的阶段。目标:手推 Riccati 方程 + 手写 LQR 控制器 + 理解 Q/R 的物理含义。
2.1 代价函数
连续 LQR 代价:
离散 LQR 代价:
Q 矩阵 — 状态权重
\(Q \succeq 0\)(半正定),惩罚状态偏差。Q 越大 → 状态收敛越快 → 需要更大的控制力。
R 矩阵 — 控制权重
\(R \succ 0\)(正定),惩罚控制能量。R 越大 → 控制越平缓 → 状态收敛越慢。
Q/R 比值的物理含义:
固定 R、增大 Q ⟹ 更激进的控制(更快收敛,更大超调)
固定 Q、增大 R ⟹ 更保守的控制(更慢收敛,更省能量)
\(Q/R\) 的比值决定了系统的主导时间常数
Q/R 调参经验(Bryson's Rule)
通过对角元素归一化,使不同量纲的状态/控制量在代价函数中有可比性。
Q/R 对闭环极点的影响
2.2 Riccati 方程
LQR 的核心。通过求解 ARE(Algebraic Riccati Equation)得到最优控制器。
连续 ARE (CARE):
离散 ARE (DARE):
最优反馈增益:
2.3 求解方法
直接求解法
使用 `scipy.linalg.solve_continuous_are` / `care` / `dlqr`
迭代求解法
Riccati 差分方程:从 \(P_N=Q\) 反向迭代到收敛
特征向量法
构造 Hamilton 矩阵,取稳定特征子空间
LMI 方法
将 ARE 转化为线性矩阵不等式,用凸优化求解
\(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 设计完成后,必须分析闭环系统:
LQR 的重要理论保证:
- 稳定性:如果 (A, B) 能控,(A, Q^{1/2}) 能观,则闭环系统渐近稳定
- 相位裕度:连续 LQR 有无限增益裕度(\(1/2 \to \infty\))和 60° 相位裕度
- 最优性:LQR 是唯一的使代价函数最小的线性反馈控制器
2.5 从零手写 LQR
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 自查清单
- ✅ 理解 \(J = \int (x^T Q x + u^T R u) dt\) 每一项的含义
- ✅ 能用手写出 2×2 系统的 ARE(至少理解结构)
- ✅ 用 Python/Matlab 求解 LQR 并仿真闭环
- ✅ 能解释增大 Q/R 分别对闭环响应有什么影响
- ✅ 理解 LQR 的稳定性保证和幅值裕度
3 第三层:LQR 拓展(2-3 周)
实际工程中很少用到原始 LQR(调节到原点),更多是其变体。第三层把这些工程常用变体讲透。
3.1 LQR 跟踪 (LQT)
目标:跟踪参考信号 \(r(t)\),而非回到原点。
解的形式变为:
其中前馈增益 \(K_f\) 需要额外计算。对阶跃参考,\(K_f = -(C (A - BK)^{-1} B)^{-1}\)(1-DOF)或通过增广系统(2-DOF)。
3.2 积分 LQR (LQI)
原始 LQR 没有积分项,存在稳态误差(有模型误差时)。LQI 引入积分作用消除稳态误差。
增广系统:
在增广系统上设计 LQR,得到控制律:
对应到 MP 中,这就是为什么 MPC 可以用"增量形式"(\(\Delta u\))自动获得积分作用。
3.3 时变 LQR (TVLQR / Time-Varying LQR)
当系统沿参考轨迹变化时(如火箭入轨、机器人轨迹跟踪),使用时变增益:
\(K(t)\) 通过对时变 Riccati 方程反向积分得到。TVLQR 是 LQR 到 MPC 的桥梁:
- TVLQR 在有限时域上求解时变增益(离线计算)
- MPC 在每个时刻重新求解(在线优化)
- 两者的代价函数形式几乎相同
3.4 LQG 与分离原理
当状态不可测时,使用 Kalman 滤波器估计状态,再用 LQR 增益,组合成 LQG 控制器。
分离原理:LQR 和 Kalman 滤波器可以独立设计,组合后闭环仍然稳定。这是一个非常重要的理论结果。
3.5 输出反馈 LQR
直接用输出 y 而非状态 x 做反馈:\(u = -K_y y\)。这是次优的(因为输出通常维度小于状态),需要求解输出反馈 Riccati 方程,通常用迭代 LMI 求解。
3.6 自查清单
- ✅ 能写出 LQR 跟踪问题的控制律结构
- ✅ 理解 LQI 的增广状态方法
- ✅ 理解分离原理的基本内容
- ✅ 能解释为什么 LQR 在工程中直接用不够
- ✅ 理解 LQR 各变体分别解决什么问题
4 第四层:深入理论(可选)
第四层面向学术研究和追求理论深度的读者。
4.1 稳定性与 Lyapunov
LQR 的最优控制律天然是一个 Lyapunov 函数:
这说明 LQR 闭环系统是 Lyapunov 稳定的。这个联系也是 MPC 稳定性证明的出发点:
- MPC 把最优代价作为 Lyapunov 函数
- LQR 给了 MPC 的终端代价 \(V_f(x) = x^T P x\)
- LQR 的 Riccati 解 P 保证了终端代价是局部 Lyapunov 函数
4.2 鲁棒性与增益裕度
连续时间 LQR 有优秀的鲁棒性保证:
- 无穷增益裕度:在任意通道上增大增益 \(K \to \infty K\),闭环稳定
- 1/2 增益衰减裕度:增益减小到 1/2,闭环仍稳定
- ±60° 相位裕度:任意通道上有 60° 相位延迟仍稳定
这些特性只在连续 LQR 中成立。离散 LQR 没有这些保证。
此外,LQG 没有这些鲁棒性保证,必须用 LTR 恢复。
4.3 H₂ / H∞ 的联系
LQR 本质上是 H₂ 最优控制的一个特例:
如果选择 \(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(因为计算机实现)。需要注意:
- 离散 LQR 的 Riccati 方程是 DARE(非线性矩阵方程)
- 离散 LQR 的稳定性条件是闭环极点都在单位圆内
- 离散 LQR 没有连续 LQR 的增益/相位裕度保证
- 采样周期 \(T_s\) 的选择会影响 LQR 性能
📅 5. 学习计划与资源
5.1 建议时间线
5.2 推荐书目
| 书名 | 作者 | 难度 | 推荐理由 |
|---|---|---|---|
| Modern Control Systems | Dorf & Bishop | 入门 | 经典控制教材,前 10 章覆盖状态空间和 LQR 基础 |
| Linear Systems Theory and Design | Chen | 基础 | 线性系统理论圣经,讲透了状态空间方法 |
| Optimal Control Theory: An Introduction | Kirk | 基础 | 最优控制入门经典,LQR 推导非常详尽 |
| Applied Optimal Control | Bryson & Ho | 进阶 | 老派经典,LQR + 轨迹优化的实用方法 |
| Robust and Optimal Control | Zhou, 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:
| 概念 | LQR | MPC |
|---|---|---|
| 时域 | 无限 \((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\) |
| 终端权重 P | Riccati 解 | Riccati 解(与 LQR 相同) |
| 最优性 | 全局最优 | 约束下最优 |
| 计算 | 微秒级(矩阵乘法) | 毫秒级(QP 求解) |
❓ 6. 常见问题
极点配置:直接指定闭环极点位置→唯一确定 K。优点是直观;缺点是不知道"什么样的极点最优",且 MIMO 系统极点不唯一对应 K。
LQR:通过 Q,R 间接影响极点位置。优点是有理论最优性保证,有稳定裕度;缺点是需要调 Q,R。
建议:如果需要快速满足时域指标且经验丰富,用极点配置。如果追求最优性和鲁棒性,用 LQR。两者通常配合使用:先用 LQR 得到初步设计,再微调。
有几种常用策略:
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 作为优化变量,加入时域约束(上升时间、超调量)
不一样。即使同样的 Q,R,离散 LQR 的增益通常不同。
- 如果采样周期 \(T_s\) 足够小(远小于系统时间常数),两者结果接近
- 离散 LQR 没有连续 LQR 的鲁棒性保证(增益/相位裕度)
- 工程建议:直接用离散模型设计离散 LQR,与实际实现一致
直接回答: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 稳定性的理论基础:终端代价保证了预测时域外的代价被正确估计。
几个方向:
1. 基于辨识的 LQR:用系统辨识得到模型(ARX、子空间法)
2. 鲁棒 LQR:考虑模型不确定性,用 Riccati 不等式 / LMI 设计
3. 自适应 LQR:在线更新模型,重新求解 ARE
4. LQG + LTR:通过 Loop Transfer Recovery 恢复鲁棒性
5. 改用 MPC:MPC 对模型误差有一定的鲁棒性(滚动优化 + 反馈校正)
取决于你的应用场景:
只用 LQR 就够了:
- 系统运行在固定工作点(线性化有效)
- 约束不活跃或可以通过限幅处理
- 计算资源有限(MEMS、嵌入式 MCU)
- 系统简单(SISO,弱耦合)
必须学 MPC:
- 有显式约束要处理(安全边界、执行器饱和)
- 系统有强耦合(MIMO)
- 需要预测未来的参考变化(自动驾驶路径跟踪)
- 系统非线性强或有大范围变化
但无论哪种情况,LQR 都是 MPC 的必修前置课。