拉格朗日建模到LQR
从拉格朗日动力学到 LQR 控制:完整理论推导
记录从广义坐标选取、拉格朗日建模、平衡点线性化、状态空间建立,到哈密顿矩阵法求解 CARE 方程、计算 LQR 反馈增益 K K K 的完整理论链路。以底部铰接匀质杆为简单实例,公式逐步展开。
目录
1. 广义坐标的选取:从约束与自由度出发
1.1 完整约束与自由度
对于由 N N N 个质点组成的系统,在三维空间中共有 3 N 3N 3N 个直角坐标。若受到 m m m 个完整约束(几何约束,可积分为仅含坐标和时间的方程 f ( r , t ) = 0 f(\mathbf{r}, t)=0 f(r,t)=0,r为质点的坐标),则系统的自由度为:
n = 3 N − m n = 3N - m n=3N−m
当系统为平面机构时,可采用 n = 3 N (不含机架) − 2 p l − p h n = 3N(不含机架) - 2p_l - p_h n=3N(不含机架)−2pl−ph 快速计算( p l p_l pl 为低副数, p h p_h ph 为高副数),典型为机械臂
广义坐标的数目必须等于自由度 n n n。选取一组相互独立、且能完整描述系统位形的变量 q 1 , q 2 , … , q n q_1, q_2, \dots, q_n q1,q2,…,qn,使得所有直角坐标均可表示为广义坐标的函数:
r i = r i ( q 1 , q 2 , … , q n , t ) \mathbf{r}_i = \mathbf{r}_i(q_1, q_2, \dots, q_n, t) ri=ri(q1,q2,…,qn,t)
约束一定是要不冗余的,即若一个约束可由其他约束推导出来,则它不独立,不能计入 m m m。完整约束又分为时变与不变的, f ( r , t ) = 0 f(\mathbf{r}, t)=0 f(r,t)=0均为完整约束
1.2 选取原则
- 独立性:各广义坐标之间不存在函数关系,即满足约束后彼此独立变化。
- 完备性:给定一组广义坐标的数值,能唯一确定系统在该时刻的空间位形。
- 便利性:优先选取与实际几何运动直接对应的变量,使动能 T T T 和势能 V V V 的表达式最简。
1.3 示例:底部铰接的匀质杆
考虑一根质量为 m m m、长度为 l l l 的匀质杆,一端通过铰链固定于支点,在竖直平面内转动。
若用直角坐标描述杆上各点,需引入大量坐标与约束(杆长固定、端点固定)。但直接取杆与竖直向上方向的夹角 θ \theta θ 作为广义坐标,即可完整描述位形,且动能、势能表达式简洁。
系统仅 1 个自由度,广义坐标取:
q = θ q = \theta q=θ
2. 拉格朗日动力学建模
2.1 动能与势能
以底部铰接匀质杆为例,绕端点转动惯量 I = 1 3 m l 2 I = \frac{1}{3}ml^2 I=31ml2。
动能:
T = 1 2 I θ ˙ 2 T = \frac{1}{2} I \dot{\theta}^2 T=21Iθ˙2
势能(以支点水平面为零点,质心在杆中点):
V = m g l 2 cos θ V = mg \frac{l}{2} \cos\theta V=mg2lcosθ
2.2 拉格朗日量
L = T − V = 1 2 I θ ˙ 2 − m g l 2 cos θ \mathcal{L} = T - V = \frac{1}{2} I \dot{\theta}^2 - mg\frac{l}{2}\cos\theta L=T−V=21Iθ˙2−mg2lcosθ
2.3 欧拉-拉格朗日方程
广义坐标 q = θ q = \theta q=θ,广义力为控制力矩 τ \tau τ:
d d t ( ∂ L ∂ θ ˙ ) − ∂ L ∂ θ = τ \frac{d}{dt}\left(\frac{\partial \mathcal{L}}{\partial \dot{\theta}}\right) - \frac{\partial \mathcal{L}}{\partial \theta} = \tau dtd(∂θ˙∂L)−∂θ∂L=τ
计算各项:
- ∂ L ∂ θ ˙ = I θ ˙ \frac{\partial \mathcal{L}}{\partial \dot{\theta}} = I \dot{\theta} ∂θ˙∂L=Iθ˙
- d d t ( ⋅ ) = I θ ¨ \frac{d}{dt}(\cdot) = I \ddot{\theta} dtd(⋅)=Iθ¨
- ∂ L ∂ θ = m g l 2 sin θ \frac{\partial \mathcal{L}}{\partial \theta} = mg\frac{l}{2}\sin\theta ∂θ∂L=mg2lsinθ
得到非线性动力学方程:
I θ ¨ − m g l 2 sin θ = τ (1) {I \ddot{\theta} - mg\frac{l}{2}\sin\theta = \tau} \tag{1} Iθ¨−mg2lsinθ=τ(1)
符号说明:当 θ > 0 \theta > 0 θ>0(杆向右偏)时,重力矩 m g l 2 sin θ mg\frac{l}{2}\sin\theta mg2lsinθ 使杆向右加速( θ ¨ > 0 \ddot{\theta}>0 θ¨>0),故重力矩项取正号。
3. 平衡点线性化
目标:使杆稳定在竖直向上位置( θ = 0 \theta = 0 θ=0)。在平衡点附近小角度近似:
sin θ ≈ θ \sin\theta \approx \theta sinθ≈θ
代入 (1):
I θ ¨ − m g l 2 θ = τ (2) {I \ddot{\theta} - mg\frac{l}{2}\theta = \tau} \tag{2} Iθ¨−mg2lθ=τ(2)
这是线性化的动力学方程。注意 θ > 0 \theta > 0 θ>0(杆向右偏)时,重力矩 m g l 2 θ mg\frac{l}{2}\theta mg2lθ 使杆继续偏离,说明倒立平衡是不稳定的。
4. 状态空间表示
取状态变量:
- x 1 = θ x_1 = \theta x1=θ(角度)
- x 2 = θ ˙ x_2 = \dot{\theta} x2=θ˙(角速度)
控制输入 u = τ u = \tau u=τ(力矩)。
由 (2) 得状态方程:
{ x ˙ 1 = x 2 x ˙ 2 = m g l 2 I x 1 + 1 I u \begin{cases} \dot{x}_1 = x_2 \\[4pt] \dot{x}_2 = \frac{mgl}{2I} x_1 + \frac{1}{I} u \end{cases} {x˙1=x2x˙2=2Imglx1+I1u
重力矩项与 θ 同号,使角加速度进一步增大,体现开环不稳定性。
写成 x ˙ = A x + B u \dot{\mathbf{x}} = A\mathbf{x} + Bu x˙=Ax+Bu 形式。为简化书写,定义:
a = m g l 2 I , b = 1 I a = \frac{mgl}{2I}, \quad b = \frac{1}{I} a=2Imgl,b=I1
则系统矩阵为:
A = ( 0 1 a 0 ) , B = ( 0 b ) A = \begin{pmatrix} 0 & 1 \\ a & 0 \end{pmatrix}, \quad B = \begin{pmatrix} 0 \\ b \end{pmatrix} A=(0a10),B=(0b)
5. LQR 最优控制问题描述
对于线性时不变系统 x ˙ = A x + B u \dot{\mathbf{x}} = A\mathbf{x} + Bu x˙=Ax+Bu,LQR 寻找使如下二次性能指标最小化的控制律:
J = ∫ 0 ∞ ( x ⊤ Q x + R u 2 ) d t J = \int_0^\infty \left( \mathbf{x}^\top Q \mathbf{x} + Ru^2 \right) dt J=∫0∞(x⊤Qx+Ru2)dt
其中:
- Q Q Q 为 2 × 2 2 \times 2 2×2 半正定状态权重矩阵,通常取对角阵。
- R > 0 R > 0 R>0 为控制权重标量, R R R 越大表示越"省力",收敛越慢。
最优控制律的形式:
u = − K x u = -K\mathbf{x} u=−Kx
其中反馈增益矩阵:
K = R − 1 B ⊤ P (3) {K = R^{-1} B^\top P} \tag{3} K=R−1B⊤P(3)
而 P P P 是连续时间代数 Riccati 方程(黎卡提方程简称为CARE)的唯一半正定解:
A ⊤ P + P A − P B R − 1 B ⊤ P + Q = 0 (4) {A^\top P + PA - PBR^{-1}B^\top P + Q = 0} \tag{4} A⊤P+PA−PBR−1B⊤P+Q=0(4)
6. 哈密顿矩阵法解 CARE 方程
6.1 构造哈密顿矩阵
定义 S = B R − 1 B ⊤ S = BR^{-1}B^\top S=BR−1B⊤( 2 × 2 2 \times 2 2×2 矩阵),构造 4 × 4 4 \times 4 4×4 的哈密顿矩阵:
H = ( A − S − Q − A ⊤ ) (5) { H = \begin{pmatrix} A & -S \\ -Q & -A^\top \end{pmatrix} } \tag{5} H=(A−Q−S−A⊤)(5)
6.2 关键性质
哈密顿矩阵 H H H 的特征值关于虚轴对称分布:恰好有 n n n 个(此处 n = 2 n=2 n=2)特征值位于左半平面(稳定), n n n 个位于右半平面(不稳定)。
6.3 算法步骤
Step 1:对 H H H 进行特征值分解:
H ( V 1 V 2 ) = ( V 1 V 2 ) Λ H \begin{pmatrix} V_1 \\ V_2 \end{pmatrix} = \begin{pmatrix} V_1 \\ V_2 \end{pmatrix} \Lambda H(V1V2)=(V1V2)Λ
其中 Λ \Lambda Λ 为特征值对角阵, ( V 1 V 2 ) \begin{pmatrix}V_1\\V_2\end{pmatrix} (V1V2) 为对应的 4 × 4 4 \times 4 4×4 特征向量矩阵(分块上、下各 2 2 2 行)。
Step 2:筛选稳定特征值。选取 H H H 的 2 2 2 个具有负实部的特征值,对应特征向量组成 4 × 2 4 \times 2 4×2 矩阵,分块为 V 1 ( s ) V_1^{(s)} V1(s)(上半, 2 × 2 2 \times 2 2×2)和 V 2 ( s ) V_2^{(s)} V2(s)(下半, 2 × 2 2 \times 2 2×2)。
Step 3:若 V 1 ( s ) V_1^{(s)} V1(s) 可逆,则 CARE 的解为:
P = V 2 ( s ) ( V 1 ( s ) ) − 1 (6) {P = V_2^{(s)} \bigl(V_1^{(s)}\bigr)^{-1}} \tag{6} P=V2(s)(V1(s))−1(6)
Step 4:代回 (3) 计算增益 K K K:
K = R − 1 B ⊤ P K = R^{-1}B^\top P K=R−1B⊤P
闭环系统矩阵: A c l = A − B K A_{\mathrm{cl}} = A - BK Acl=A−BK,其特征值恰好就是 H H H 的那 2 2 2 个稳定特征值。
哈密顿矩阵特征值有反对称性,即在实矩阵下,若λ为特征值,-λ,λ*(共轭),-λ* 均为特征值
7. 数值实例与 Python 实现
以下给出可直接运行的 Python 代码,同时展示"直接调用求解器"与"手动哈密顿矩阵法"两种途径。
import numpy as np
from scipy.linalg import solve_continuous_are, eig
# ==================== 1. 物理参数:底部铰接匀质杆 ====================
m = 1.0 # 质量 [kg]
l = 1.0 # 长度 [m]
g = 9.81 # 重力加速度 [m/s^2]
I = (1.0 / 3.0) * m * l**2 # 绕端点转动惯量
# ==================== 2. 状态空间矩阵 ====================
a = m * g * l / (2.0 * I)
b = 1.0 / I
A = np.array([[0, 1],
[a, 0]])
n = A.shape[0] # 状态维数,此处为2
B = np.array([[0],
[b]])
# ==================== 3. LQR 权重 ====================
Q = np.diag([10, 1]) # 惩罚角度、角速度
R = np.array([[1]]) # 控制力矩权重
# ==================== 方法 A: 直接求解 CARE ====================
P_direct = solve_continuous_are(A, B, Q, R)
K_direct = (1.0 / R[0, 0]) * B.T @ P_direct
print("===== 方法 A: scipy 直接求解 =====")
print("P =\n", P_direct)
print("K =", K_direct.round(4))
# ==================== 方法 B: 哈密顿矩阵法 ====================
S = B @ (1.0 / R) @ B.T
H = np.block([[A, -S],
[-Q, -A.T]])
# 特征值分解
eigvals, eigvecs = eig(H)
# 选取左半平面特征值 (稳定)
stable_mask = np.real(eigvals) < 0
V_stable = eigvecs[:, stable_mask] # 直接取,形状 (4, n)
V1 = V_stable[:n, :] # 上半块
V2 = V_stable[n:, :] # 下半块
P_ham = V2 @ np.linalg.inv(V1)
K_ham = (1.0 / R[0, 0]) * B.T @ P_ham
print("\n===== 方法 B: 哈密顿矩阵法 =====")
stable_ev = eigvals[stable_mask]
print("稳定特征值:", np.round(stable_ev, 4))
print("P =\n", P_ham)
print("K =", K_ham.round(4))
# ==================== 4. 闭环验证 ====================
A_cl = A - B @ K_direct
eig_cl = np.linalg.eigvals(A_cl)
print("\n===== 闭环极点 =====")
print("闭环特征值:", np.round(eig_cl, 4))
典型输出解释
- K K K 矩阵: 1 × 2 1 \times 2 1×2 向量。 k 1 k_1 k1 为正且较大,意味着当 θ > 0 \theta > 0 θ>0(杆右偏)时,控制量 u = − K x u = -K\mathbf{x} u=−Kx 产生负力矩,使杆向左回正。
- 闭环特征值:2 个复数(或实数)均具有负实部,且恰好等于哈密顿矩阵 H H H 左半平面的 2 个特征值。
8. 总结与调参备忘
| 阶段 | 核心公式/操作 | 物理/数学意义 |
|---|---|---|
| 广义坐标选取 | n = 3 N − m n = 3N - m n=3N−m,独立、完备、便利 | 从约束与自由度出发,避免冗余坐标 |
| 拉格朗日建模 | L = T − V \mathcal{L}=T-V L=T−V,代入欧拉-拉格朗日方程 | 从能量出发,避免繁琐受力分析 |
| 线性化 | 小角度近似 sin θ ≈ θ \sin\theta \approx \theta sinθ≈θ | 在目标平衡点附近用线性系统逼近,复杂模型可采用泰勒一阶展开 |
| 状态空间 | x ˙ = A x + B u \dot{\mathbf{x}} = A\mathbf{x} + Bu x˙=Ax+Bu | 高阶 ODE(常微分方程) 转为一阶矩阵形式 |
| LQR 指标 | J = ∫ ( x ⊤ Q x + R u 2 ) d t J = \int (\mathbf{x}^\top Q \mathbf{x} + Ru^2) \, dt J=∫(x⊤Qx+Ru2)dt | 二次型权衡收敛速度与控制代价 |
| CARE | A ⊤ P + P A − P B R − 1 B ⊤ P + Q = 0 A^\top P + PA - PBR^{-1}B^\top P + Q = 0 A⊤P+PA−PBR−1B⊤P+Q=0 | 最优控制核心代数约束 |
| 哈密顿矩阵 | H = ( A − S − Q − A ⊤ ) H = \begin{pmatrix} A & -S \\ -Q & -A^\top \end{pmatrix} H=(A−Q−S−A⊤) | 将 Riccati 方程求解转化为特征值问题 |
| 增益 K K K | K = R − 1 B ⊤ P K = R^{-1}B^\top P K=R−1B⊤P | 状态反馈映射,闭环极点即 H H H 稳定特征值 |
Q Q Q 对角元增大 → \rightarrow → 对应状态收敛更快
R R R 增大 → \rightarrow → 控制更保守、更"柔"、收敛更慢
Q Q Q 与 R R R 的数量级差异决定系统整体响应性格
“闭环极点即 H 稳定特征值”是建立在 (A,B) 可镇定且 Q 半正定、 R 正定的前提下,对于这个例子成立
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)