状态空间能控性模拟器 返回
控制工程

状态空间可控性模拟器

针对二阶线性时不变系统 ẋ=Ax+Bu,判定仅凭输入 u 能否驱动状态空间所有方向(能控性)的工具。改变系统矩阵 A 和输入向量 B,即可实时查看能控性矩阵 𝒞=[B AB]、其行列式、秩与能控性判定。

参数设置
系统矩阵 A 的各元素。A=[[a11,a12],[a21,a22]] 决定状态 x 的自由运动(固有运动)。
a11(A 的第1行第1列)
a12(A 的第1行第2列)
a21(A 的第2行第1列)
a22(A 的第2行第2列)
输入向量 B=[b1,b2]。决定输入 u 沿哪个方向推动状态。
b1(B 的第1行)
b2(B 的第2行)
计算结果
能控性矩阵的行列式 det(𝒞)
秩 rank(𝒞)
AB 分量1
AB 分量2
能控性
|det(𝒞)|(能控性强度)
能控性矩阵的列向量 — 状态平面

从原点伸出的两支箭头是能控性矩阵的列向量 B 和 AB。若二者线性无关,绿色平行四边形可张成整个平面;若平行(线性相关),则重叠在红色直线上,系统不能控。

det(𝒞) 的灵敏度 — 扫描 b2
能控性矩阵的列向量分量
理论与主要公式

$$\dot{x}=Ax+Bu,\qquad \mathcal{C}=\begin{bmatrix}B & AB\end{bmatrix}$$

状态方程与能控性矩阵 𝒞。对于二阶系统,𝒞 是把 B 和 AB 作为列排成的 2×2 矩阵。AB 是矩阵 A 与向量 B 的乘积。

$$\text{能控}\iff \operatorname{rank}\mathcal{C}=n$$

卡尔曼能控性判据。n 为状态的阶数(本工具 n=2)。若 rank 小于 n 则不能控。对 2×2 而言,det(𝒞)≠0 与 rank(𝒞)=2 等价。

$$\det\mathcal{C}=b_1(AB)_2-b_2(AB)_1$$

2×2 能控性矩阵的行列式。对 n 阶系统,一般构造 𝒞=[B, AB, A²B, …, Aⁿ⁻¹B] 的 n×n 矩阵并考察其秩。

什么是能控性

🙋
“能控性”这个词在控制工程课上出现过……粗略地说,它到底是一种什么性质呢?
🎓
一句话概括,就是“仅靠输入 u,能否把系统的状态 x 自由地移动到想去的位置”这一性质。比如考虑小车上立着倒立摆的系统,状态有四个:小车位置、速度、摆角、角速度。如果系统能控,仅凭推小车的力就能把这四个量全部调到任意值;反之若不能控,无论怎么努力,总会剩下触碰不到的状态。
🙋
会剩下触碰不到的状态——那要怎么分辨呢?这个工具里有 A 和 B 的滑块。
🎓
这时就轮到“能控性矩阵”𝒞 登场了。对二阶系统,𝒞=[B AB],即把输入向量 B 和它左乘一次 A 得到的 AB 并排组成的 2×2 矩阵。B 表示输入直接推动的方向,AB 表示一步之后影响传播到的方向。这两个向量若能张成整个平面,系统就能控;张不成则不能控。右上方的画布展示的正是这两支箭头。
🙋
原来如此,是两支箭头!那“能否张成平面”具体是用行列式来判断吗?
🎓
对,2×2 的情形直接算 det(𝒞) 最快。若 B 与 AB 线性无关,行列式为非零值,秩为 2,即能控;若 B 与 AB 平行(线性相关),行列式恰好为 0,秩降到 1,系统不能控。把左侧的 b1 保持默认值 0、b2 保持默认值 1,就有 AB=[1,-2],det=-1。因为不为 0,这个系统能控——结果卡片上应该会这样显示。
🙋
行列式不为 0 就行,这一点我明白了。不过 |det| 的数值本身也有意义吗?卡片里有一项“能控性强度”。
🎓
问得好。能控还是不能控是“是否为 0”的 Yes/No 判定,但在实际工程中,“离 0 有多近”同样重要。|det| 很小的系统,纸面上虽然能控,数值上却几乎不能控:反馈增益会变得异常巨大,导致对噪声敏感、执行器饱和等问题。因此把 |det| 当作“能控性强度”的参考,就能大致判断设计是否现实。严格来说应使用格拉姆矩阵(Gramian)的奇异值,但要建立直觉,用 |det| 就足够了。
🙋
最后一个问题:系统能控,到底有什么好处呢?
🎓
系统能控就可以自由地进行“极点配置”,这是最大的好处。适当选择状态反馈 u=-Kx 的增益 K,就能把闭环系统的极点(特征值)放到任意位置。也就是说,即使是不稳定的系统,也能按预期设计响应速度和阻尼。反过来,如果存在不能控的模态,其极点无法通过 K 移动;若这个模态恰好不稳定,状态反馈无论如何都无法使系统稳定。所以控制系统设计的出发点,就是先检查能控性。

常见问题

能控性是指“给定适当的输入 u(t),能否在有限时间内把状态 x 移动到任意点”的性质。对 n 阶线性时不变系统 ẋ=Ax+Bu,构造能控性矩阵 𝒞=[B, AB, A²B, …, Aⁿ⁻¹B],若其 rank 等于 n 则判定为能控(卡尔曼能控性判据)。本工具处理二阶系统,故 𝒞=[B AB],只要其行列式不为 0(rank=2)即能控。
当 det(𝒞)=0 时,列向量 B 与 AB 位于同一直线上(线性相关),能控性矩阵的秩从 2 降到 1 以下。这意味着输入 u 只能驱动状态空间中的部分方向,即系统不能控。从物理上讲,此时存在无法由输入激励的模态,该方向的状态只能保持初值,或任由系统的固有运动支配。在本工具中,B 与 AB 会重叠显示在红色直线上。
没有直接关系。能控性关注“能否用输入驱动状态”,稳定性关注“放任不管是否会发散”,是两种不同的性质。存在不能控但稳定的系统,也存在能控但不稳定的系统。不过需要注意:若不能控的模态不稳定,就无法通过状态反馈使系统稳定。只要系统能控,就可以任意配置极点,把不稳定极点自由地移到左半平面。
|det(𝒞)| 离 0 越远,说明列向量 B 与 AB 越接近正交、彼此独立,可以粗略地作为“能控性强度”的参考。|det| 很小(接近 0)的系统在数值上接近不能控:反馈增益可能变得极端巨大,微小的模型误差就会使系统实质上不能控。严格的指标是能控性格拉姆矩阵的最小奇异值,本工具的 |det| 是一个直观的近似指标。

实际应用

倒立摆·小车系统的镇定:控制工程的经典对象倒立摆,用“位置、速度、角度、角速度”四阶状态建模。设计的第一步就是确认该系统是否能控。若能控,就可以用状态反馈配置极点,把不稳定的“倾倒”模态移到左半平面,使摆保持直立。本工具的二阶系统正是以最小配置体验这一判定逻辑。

多输入系统的执行器布置:在飞机姿态控制和四轮独立转向车辆中,把执行器(输入 B 的方向)布置在哪里会左右系统的能控性。设计阶段会针对多个 B 候选比较能控性矩阵的秩和 |det|,选择能以足够“强度”驱动所有模态的布置。传感器或执行器发生单点故障时系统是否会陷入不能控,这类容错设计也使用同样的判定。

现代控制(LQR·极点配置)的前提检查:基于 LQR 或极点配置的状态反馈设计,以对象能控(至少可镇定)为前提。MATLAB 的 ctrb / rank、Python python-control 的 ctrb 等,工程现场的工具链一定从能控性判定开始。若系统包含不能控的模态,设计者对该模态无从下手,需要重新考虑输入的选取或建模方式。

过程控制·电力系统:在化工厂的温度·浓度控制、电力系统的频率·电压控制等大规模系统中,能控性同样是判断“某个控制输入能否把整个系统引导到期望状态”的基础。把能控子空间与不能控子空间分离(卡尔曼分解),只把设计资源集中于可以控制的部分,这类策略也直接建立在能控性之上。

常见误解与注意事项

首先最常见的是“混淆能控性与稳定性”。能控性关注“能否用输入驱动状态”,稳定性关注“切断输入后状态是否不发散”,是完全不同的两种性质。能控但不稳定的系统(如倒立摆)极为常见,控制真正的用武之地恰恰在这里;反之,不能控但稳定的系统同样存在。请理解:本工具的 det(𝒞) 是能控性的指标,与 A 的特征值(稳定性)是两回事。即使 det(𝒞)≠0,也并不意味着系统稳定。

其次是“误以为数值上能控就没有实用问题”。即使 det(𝒞) 不为零,非常接近零的系统也“几乎不能控”。在这种状态下强行配置极点,反馈增益 K 会变得极端巨大,放大测量噪声,让执行器立即饱和,并对模型误差极度敏感。即便纸面上 rank=2,若 |det| 很小,也可能“设计得出来但现实中根本不能用”。工程实务的铁则是:能控性不仅要看 Yes/No,还要看“强度”。

最后是“对能控性矩阵的数值秩计算过度信任”。能控性矩阵 𝒞=[B, AB, …, Aⁿ⁻¹B] 在阶数 n 变大时,Aⁿ⁻¹B 项会大到(或小到)相差好几个数量级,矩阵的条件数变得极差。因此对高阶系统,不应使用行列式或朴素的秩计算,而要用奇异值分解(SVD)评估有效秩,或采用数值稳定的能控性格拉姆矩阵、阶梯形(staircase form)变换等方法。本工具是用于概念理解的二阶系统,这一问题不会显现;但在实际系统中,不要简单相信“算出秩=n 就能控”,还应确认条件数。

使用指南

  1. 用滑块或数值输入设置系统矩阵 A 的4个元素(a11, a12, a21, a22)。例如:a11=0, a12=1, a21=-2, a22=-3
  2. 设置输入向量 B 的2个元素(b1, b2)。例如:b1=0, b2=1
  3. 模拟器自动计算能控性矩阵 𝒞=[B AB],实时显示行列式、秩与能控性判定。|det(𝒞)|≠0 则能控,=0 则不能控

具体计算示例

对直流电机控制系统(a11=0, a12=1, a21=-10, a22=-5, b1=0, b2=1):能控性矩阵为 [0 1; 1 -5],det(𝒞)=-1,rank(𝒞)=2,完全能控。另一方面,改为 a21=0, a22=-5 时矩阵为 [0 1; 1 0],det(𝒞)=-1,仍然能控;但改成 b1=1, b2=0 后矩阵为 [1 0; 0 -5],det(𝒞)=-5。对串联RLC滤波器(a11=0, a12=1, a21=-1, a22=-2, b1=0, b2=1),det(𝒞)=-1(能控);若两个输入方向相同,则 det(𝒞)=0(不能控)

实务注意事项

  1. 能控性是状态反馈设计的前提条件。若数值计算得到的 det(𝒞) 在 10^-10 以下,请考虑浮点误差,改用矩阵的秩来判定
  2. 在飞机姿态控制等多变量系统中,单一输入可能导致系统不能控。请尝试改变输入向量 B 的方向
  3. |det(𝒞)| 数值很小时能控性虽然存在,但控制增益会变得非常大而难以实现。控制工程上通常以 |det(𝒞)|>0.5 为参考