3. 能控性判据(一):格拉姆矩阵判据,原理与计算步骤
能控性判据有好几种,我个人最喜欢先讲格拉姆矩阵判据。为什么?因为它最直观,也最接近物理本质。说白了,格拉姆矩阵判据就是在回答一个问题:系统的能量能不能通过输入传递到所有状态上?
3.1 格拉姆矩阵判据的核心思想
先回忆一下,对于一个线性时不变系统:
ẋ = Ax + Bu
y = Cx + Du
我们想知道:给定任意初始状态 x(0),能不能找到一个输入 u(t),让系统在有限时间内回到原点?
格拉姆矩阵判据的思路是这样的——构造一个能控性格拉姆矩阵 W_c,然后检查它是不是满秩的。如果满秩,系统就能控;否则,就有状态是「够不着」的。
我在项目中遇到过这样一个案例:一个四阶系统,用秩判据算出来能控,但实际仿真时总有一个状态调不回来。后来一查,是数值精度问题导致秩判据误判。从那以后,我养成了习惯——能控性分析至少用两种方法交叉验证。
3.2 格拉姆矩阵的定义
能控性格拉姆矩阵定义为:
W_c(t) = ∫₀ᵗ e^(Aτ) B B^T e^(A^T τ) dτ
对于稳定系统,我们通常考虑 t → ∞ 时的极限情况,即:
W_c = ∫₀^∞ e^(Aτ) B B^T e^(A^T τ) dτ
这个矩阵满足一个重要的李雅普诺夫方程:
A W_c + W_c A^T = - B B^T
嗯,这里要注意:这个方程只在系统矩阵 A 是稳定的时候才有唯一解。如果 A 有特征值在虚轴上或右半平面,积分可能发散。
3.3 计算步骤
实际工程中,我们不会真的去算那个积分。太慢了,而且容易出错。我建议用以下步骤:
- 写出系统矩阵 A 和输入矩阵 B
- 求解李雅普诺夫方程 A W_c + W_c A^T = - B B^T
- 检查 W_c 的秩,看是否等于系统阶数 n
在 MATLAB 中,一行代码就能搞定:
Wc = gram(sys, 'c');
rank(Wc)
如果你用的是 Python,可以用 scipy 的 solve_continuous_lyapunov:
from scipy.linalg import solve_continuous_lyapunov
import numpy as np
A = np.array([[0, 1], [-2, -3]])
B = np.array([[0], [1]])
Wc = solve_continuous_lyapunov(A, -B @ B.T)
rank = np.linalg.matrix_rank(Wc)
print(f"格拉姆矩阵的秩: {rank}")
3.4 一个完整的例子
来看一个二阶系统:
A = [[0, 1],
[-2, -3]]
B = [[0],
[1]]
手动算一下李雅普诺夫方程。设 W_c = [[w11, w12], [w12, w22]],代入方程:
A W_c + W_c A^T = -B B^T
展开后得到三个方程:
2w12 = 0
w22 - 2w11 - 3w12 = 0
2w12 - 6w22 = -1
解得:
w11 = 1/12, w12 = 0, w22 = 1/6
所以:
W_c = [[1/12, 0],
[0, 1/6]]
秩为 2,等于系统阶数,系统能控。
关键结论:格拉姆矩阵判据不仅告诉你系统能不能控,还能告诉你每个状态需要多少「控制能量」。W_c 的特征值越小,对应的状态方向就越难控制。
3.5 格拉姆矩阵的物理意义
你想想看,为什么这个矩阵叫「格拉姆矩阵」?其实它描述的是状态空间中各个方向上的能量分布。
具体来说:
- W_c 的特征值 λ_i 表示第 i 个能控方向上的「控制难度」
- 特征值越大,这个方向越容易控制
- 特征值为 0,说明这个方向完全不可控
我曾经调试过一个飞行器控制系统,发现某个模态的控制效果特别差。一查格拉姆矩阵,那个方向的特征值比其它方向小了三个数量级。后来调整了作动器布局,才把这个问题解决。
实用技巧:如果 W_c 的条件数很大(比如 > 10⁶),即使满秩,实际控制效果也可能很差。这时候要考虑重新配置传感器或执行器。
3.6 避坑指南
我曾经踩过的坑:
- 数值稳定性:对于高阶系统(n > 10),直接求解李雅普诺夫方程可能数值不稳定。我建议用
gram()函数,它内部用了更稳定的算法。 - 非稳定系统:如果 A 有右半平面极点,格拉姆矩阵积分发散。这时候要用有限时间格拉姆矩阵,或者改用 PBH 判据。
- 离散系统:离散系统的能控性格拉姆矩阵是 W_c = Σ_{k=0}^{∞} A^k B B^T (A^T)^k,求解的是离散李雅普诺夫方程。
3.7 知识体系总览
下面这张图总结了格拉姆矩阵判据的核心逻辑:
3.8 小结
格拉姆矩阵判据是能控性分析中最优雅的方法之一。它不仅有严格的数学基础,还能给出控制能量的定量信息。我个人建议:
- 理论分析:用格拉姆矩阵判据,物理意义清晰
- 工程计算:用 MATLAB 的
gram()或 Python 的solve_continuous_lyapunov - 交叉验证:配合秩判据或 PBH 判据,避免数值问题导致的误判
记住一点:能控性分析不是一次性的工作。系统参数变化、工作点迁移,都可能影响能控性。定期检查格拉姆矩阵的条件数,是个好习惯。
公众号:蓝海资料掘金营,微信deep3321