跳到正文
格致开物MATHWIKI

状态转移矩阵

状态转移矩阵(state transition matrix)是把线性动力系统在一个时刻的状态映射到另一个时刻的矩阵。它的每一列,表示一个单位初始分量在系统演化后变成什么;任意初始状态的轨迹则由这些列按初始分量加权组合。

时变系统中,这个矩阵不仅取决于总经过时间,还取决于各段动力作用的先后。例如先沿水平方向剪切,再沿竖直方向剪切,与交换两段次序会产生不同终点。状态转移矩阵记录的正是这种带时间顺序的演化,而不是简单把各时刻的系数平均。

定义与列的含义

考虑实线性系统 x˙(t)=A(t)x(t),x(t)∈ℝn. 先设 A:I→ℝn×n 在区间 I 上连续。对每个初始时刻 s∈I,定义 Φ(t,s) 为矩阵初值问题的唯一解: ∂tΦ(t,s)=A(t)Φ(t,s),Φ(s,s)=In. 初始状态为 x(s)=xs 时,解为 x(t)=Φ(t,s)xs。代回方程并在 t=s 检查,就验证了这条表示。若 ej 是第 j 个标准基向量,第 j 列就是初值 ej 的解。连续时间的定义及输入响应可参见 Dahleh 等人的教材。[1]

若系数分段连续、每个有限区间只有有限个跳点,仍可定义连续、分段可微的状态转移矩阵,微分方程在各连续区间成立,整体满足积分方程。后面的切换例子使用这一情形,不在切换瞬间要求左右导数相等。

基本矩阵与可逆性

设 Y(t) 的列是 n 个齐次解,在某个时刻线性无关,称为基本矩阵。它在整个区间上都可逆。证明可以只用线性初值问题的唯一性:若在某个 t∗ 有 Y(t∗)c=0,则 Y(t)c 是在 t∗ 取零的解。零解有同一初值,故两者在整个区间相同;在原本线性无关的时刻便推出 c=0。因此不存在非零核。

为了使初始矩阵等于单位矩阵,只需归一化: Φ(t,s)=Y(t)Y(s)−1. 一般基本矩阵 Y(t) 未必满足 Y(s)=In,所以不能在未检查初始归一化时直接把它当作 Φ(t,s)。基本矩阵及其可逆性的教学推导见 Orloff 讲义。[2]

由这个表达式可得三个直接用于计算的恒等式: Φ(s,s)=In,Φ(t,r)Φ(r,s)=Φ(t,s),Φ(t,s)−1=Φ(s,t). 中间一式表示先从 s 走到 r,再从 r 走到 t,后发生的映射乘在左边。它与矩阵乘法作用于列向量的次序一致。

对连续系数,还可对起始时刻求导。由 (Y−1)′=−Y−1Y′Y−1 得 ∂sΦ(t,s)=−Φ(t,s)A(s). 注意 A(s) 在右侧,而对终止时刻求导时 A(t) 在左侧。一般矩阵并不交换,这两个式子的次序有实质区别。

常系数与时间顺序

当 A 不随时间改变时, Φ(t,s)=eA(t−s),eAτ=In+Aτ+A2τ22!+⋯. 逐项求导可验证定义,τ=0 时为单位矩阵。时变情形则一般不能写成 e∫stA(r)dr。如果不同时刻的 A 两两交换,这个写法是可用的;缺少交换性时,矩阵乘积会保留被积分总和丢失的时间顺序。

考虑两段各持续一单位时间的系统: A(t)={A1=(0100),0≤t<1,A2=(0010),1≤t≤2. 因为 A12=A22=0,指数级数只剩两项: eA1=(1101),eA2=(1011). 所以先 A1 后 A2 的总映射为 Φ(2,0)=eA2eA1=(1112). 若把两段的发生次序交换,则得到另一套系统的总映射 eA1eA2=(2111). 例如初始状态 (1,0)𝖳 在原次序下先保持不动,再到达 (1,1)𝖳;交换次序时先到 (1,1)𝖳,再到 (2,1)𝖳。

同一初始向量在两种切换次序下到达不同终点
起点 (1,0)。原次序中第一段不动、第二段沿竖直方向到 (1,1);交换次序时先竖直到 (1,1),再水平到 (2,1)。虚线箭头标明后一段。

原系统的逆向转移则是 Φ(0,2)=Φ(2,0)−1=(2−1−11), 它不是交换两段正向动力作用的矩阵。逆向回推必须把每一段都逆转,并倒转组合次序。

如果只把系数积分再取指数,由 ∫02A(t)dt=A1+A2,会得到 eA1+A2=(cosh⁡1sinh⁡1sinh⁡1cosh⁡1), 其第一列约为 (1.5431,1.1752)𝖳,与上述两个真实终点都不同。这是一个可直接复算的反例。

两列组成的几何映射

同一切换系统在中间时刻的矩阵是 Φ(t,0)={(1t01),0≤t≤1,(11t−1t),1≤t≤2. 两段在 t=1 都等于 (1101),所以状态不会跳变。终点矩阵的两列为 (1,1)𝖳 与 (1,2)𝖳;初始单位正方形变成由这两个向量张成的平行四边形。

单位正方形经两次剪切变为平行四边形,面积保持一
虚线为初始单位正方形,实线为 Φ(2,0) 的像。边向量就是矩阵两列,行列式为一,所以面积不变;形状和向量长度并不保持。

面积变化可以推广到一般线性系统。设 d(t)=det⁡Φ(t,s),由行列式求导及可逆性, d′=dtr⁡(Φ−1AΦ)=dtr⁡A. 其中 tr 为对角元素之和。结合 d(s)=1 得 det⁡Φ(t,s)=exp⁡(∫sttr⁡A(r)dr)>0. 本例每一段的迹为零,故面积始终为一。一般情况下行列式不为零说明有限时间转移可逆,却不保证数值求逆不放大误差。

可运行的两段计算

下列 Python 对上述两种剪切计算原次序的终点。输入为两个有限状态分量和两段非负持续时间,输出为新的二元组,不修改原状态。每段按自己的方程精确推进,所需时间和额外空间均为常数;它是这个具体系统的计算,不是任意矩阵指数求解器。

Python 3
import math


def switching_flow(x0, first_duration=1.0, second_duration=1.0):
    x1, x2 = map(float, x0)
    a, b = float(first_duration), float(second_duration)
    if not all(math.isfinite(v) for v in (x1, x2, a, b)):
        raise ValueError("finite inputs required")
    if min(a, b) < 0:
        raise ValueError("durations must be nonnegative")
    after_first = (x1 + a * x2, x2)
    result = (after_first[0], after_first[1] + b * after_first[0])
    if not all(math.isfinite(v) for v in result):
        raise OverflowError("intermediate or result outside floating-point range")
    return result


print(switching_flow((1, 0)))  # (1.0, 1.0)
print(switching_flow((0, 1)))  # (1.0, 2.0)
print(switching_flow((2, 3), 0, 0))  # (2.0, 3.0)

读者可把初态改成 (2,3)𝖳:一单位第一段得到 (5,3)𝖳,一单位第二段得到 (5,8)𝖳。它也等于 (1112)(2,3)𝖳。两段时间都为零时必须返回原状态,这也是代码的边界核验。

外部输入与非线性系统

加入输入 b(t) 后,连续系数初值问题的解为 x(t)=Φ(t,s)xs+∫stΦ(t,r)b(r)dr. 对它求时间导数,积分上限产生 Φ(t,t)b(t)=b(t),其余各项共同产生 A(t)x(t),于是得到原方程。这是参数变易法的状态空间形式。

对非线性系统 x′=f(t,x),整体初值到终值的映射一般不是矩阵。若 f 对状态足够光滑,在一条参考轨迹 x∗(t) 附近可用变分方程 δx′=Dxf(t,x∗(t))δx 描述一阶微小扰动;其状态转移矩阵描述局部灵敏度,不能当作对任意大扰动都精确的全局映射。稳定与不稳定还需考察长期转移和适当范数,不能只由某个时刻矩阵的可逆性判定。

参考资料

  1. ↑ Mohammed Dahleh, Munther A. Dahleh, George Verghese. Lectures on Dynamic Systems and Control,第 11 章,尤其 §11.2。
  2. ↑ Jeremy Orloff. Fundamental matrix, variation of parameters,MIT ES.1803,2024,§19.5。