4. 能控性判据(秩判据):能控性矩阵的构造,秩判据的推导与证明思路
好,咱们接着聊能控性。前面我们讲了能控性的基本概念,说白了就是「输入能不能把状态拉到任何想去的地方」。但光有概念不够,工程上你得有个可操作的工具,一眼就能判断系统能不能控。这就是我们今天要讲的——秩判据。
我个人习惯,拿到一个系统,第一件事就是算它的能控性矩阵。为什么?因为快,而且可靠。你想想看,一个 n 阶系统,你只要把 A 矩阵和 B 矩阵拼一拼,算个秩,结果就出来了。比解微分方程、做仿真试来试去要高效得多。
4.1 能控性矩阵的构造
先看定义。对于离散系统:
x(k+1) = A x(k) + B u(k)
其中 x ∈ Rⁿ,u ∈ Rᵐ。能控性矩阵长这样:
Qc = [B AB A²B ... Aⁿ⁻¹B]
注意,这是一个 n × (n·m) 的矩阵。什么意思?就是把 B、AB、A²B……一直到 Aⁿ⁻¹B 这些矩阵横着拼起来。
我记得刚学的时候,有个同学问我:「为什么只拼到 Aⁿ⁻¹B?再往后拼不行吗?」
好问题。答案是:再往后拼是冗余的。根据 Cayley-Hamilton 定理,Aⁿ 可以表示为 I, A, A², …, Aⁿ⁻¹ 的线性组合。所以 AⁿB 其实已经被前面的列张成了。拼再多也不会增加新的信息。
核心要点:能控性矩阵的列数可以很多,但行数固定为 n。我们关心的是它的行秩是否等于 n。
4.2 秩判据的正式表述
秩判据很简单,就一句话:
离散系统完全能控的充要条件是:rank(Qc) = n
也就是能控性矩阵是满行秩的。
这里有个细节要注意:如果系统是单输入(m=1),Qc 是 n×n 的方阵,满秩等价于行列式不为零。如果是多输入(m>1),Qc 是 n×(n·m) 的「胖」矩阵,我们只看行秩。
| 输入个数 m | Qc 的尺寸 | 判据形式 |
|---|---|---|
| m = 1(单输入) | n × n | det(Qc) ≠ 0 |
| m > 1(多输入) | n × (n·m) | rank(Qc) = n |
避坑指南:我曾经在项目里犯过一个低级错误——多输入系统里,我直接用 det(Qc) 去判断,结果报错说矩阵不是方阵。嗯,后来才意识到,多输入情况下 Qc 是「胖」的,得用 rank 函数。
4.3 证明思路:为什么秩判据成立?
秩判据不是凭空冒出来的。它的背后有清晰的逻辑。我来给你捋一捋证明思路。
我们从能控性的定义出发:对于任意初始状态 x(0) 和任意目标状态 x(n),存在输入序列 u(0), u(1), …, u(n-1),使得 x(n) 等于目标值。
写出状态递推:
x(1) = A x(0) + B u(0)
x(2) = A x(1) + B u(1) = A² x(0) + A B u(0) + B u(1)
...
x(n) = Aⁿ x(0) + [B AB A²B ... Aⁿ⁻¹B] · [u(n-1) u(n-2) ... u(0)]ᵀ
你看,最后一项就是 Qc 乘以一个由输入组成的列向量。我们把输入向量记作 U:
x(n) - Aⁿ x(0) = Qc · U
现在问题变成了:对于任意给定的右边,方程是否有解?
线性代数告诉我们:方程 Qc · U = b 对任意 b 有解的充要条件是 Qc 的列空间张满整个 Rⁿ。而列空间张满 Rⁿ 等价于 rank(Qc) = n。
说白了,就是 Qc 的列必须能「覆盖」所有可能的方向。如果缺了一个方向,那这个方向上的状态你就永远到不了。
直观理解:能控性矩阵的每一列代表一个「控制方向」。如果这些方向能组合出 n 维空间里的任意向量,系统就能控。否则,存在「盲区」。
4.4 一个简单的例子
来看个具体例子。假设系统是:
A = [1 1; 0 2]
B = [1; 0]
这是一个二阶系统(n=2),单输入(m=1)。
计算能控性矩阵:
AB = A·B = [1 1; 0 2] · [1; 0] = [1; 0]
Qc = [B AB] = [1 1; 0 0]
算一下秩:第二行全是 0,所以 rank(Qc) = 1 < 2。系统不能控。
为什么?你看第二行全是零,意味着状态变量 x₂ 永远不受输入影响。你无论怎么加 u,x₂ 都只能按自己的规律演化。这就是典型的「盲区」。
注意:这个例子也提醒我们,能控性不是「系统能不能稳定」的问题。即使系统不稳定,只要 rank(Qc)=n,你仍然可以通过反馈控制把它稳住。但如果你连控都控不了,那就真的没办法了。
4.5 知识体系总览
下面这张图总结了秩判据的核心逻辑:
4.6 工程中的实用技巧
在实际项目中,我一般会这样做:
- 先算阶数 n:看看系统有多少个状态变量。
- 构造 Qc:从 B 开始,逐次左乘 A,拼起来。注意不要拼过头,到 Aⁿ⁻¹B 就停。
- 算秩:用 MATLAB 的
rank(Qc)或者 Python 的np.linalg.matrix_rank(Qc)。 - 对比 n:如果 rank = n,万事大吉;如果 rank < n,说明有不可控模态。
小技巧:如果 rank(Qc) < n,你可以进一步做能控性分解,把系统拆成能控部分和不能控部分。这样至少能知道哪些状态是「救得回来」的,哪些是「听天由命」的。
嗯,秩判据就讲到这里。它简单、直接、可靠,是判断能控性的首选工具。下次你拿到一个系统,不妨先算算它的能控性矩阵——说不定一眼就能看出问题所在。
公众号:蓝海资料掘金营,微信deep3321