状态转移矩阵
状态转移矩阵(state transition matrix)是把线性动力系统在一个时刻的状态映射到另一个时刻的矩阵。它的每一列,表示一个单位初始分量在系统演化后变成什么;任意初始状态的轨迹则由这些列按初始分量加权组合。
时变系统中,这个矩阵不仅取决于总经过时间,还取决于各段动力作用的先后。例如先沿水平方向剪切,再沿竖直方向剪切,与交换两段次序会产生不同终点。状态转移矩阵记录的正是这种带时间顺序的演化,而不是简单把各时刻的系数平均。
定义与列的含义
考虑实线性系统 先设 在区间 上连续。对每个初始时刻 ,定义 为矩阵初值问题的唯一解: 初始状态为 时,解为 。代回方程并在 检查,就验证了这条表示。若 是第 个标准基向量,第 列就是初值 的解。连续时间的定义及输入响应可参见 Dahleh 等人的教材。[1]
若系数分段连续、每个有限区间只有有限个跳点,仍可定义连续、分段可微的状态转移矩阵,微分方程在各连续区间成立,整体满足积分方程。后面的切换例子使用这一情形,不在切换瞬间要求左右导数相等。
基本矩阵与可逆性
设 的列是 个齐次解,在某个时刻线性无关,称为基本矩阵。它在整个区间上都可逆。证明可以只用线性初值问题的唯一性:若在某个 有 ,则 是在 取零的解。零解有同一初值,故两者在整个区间相同;在原本线性无关的时刻便推出 。因此不存在非零核。
为了使初始矩阵等于单位矩阵,只需归一化: 一般基本矩阵 未必满足 ,所以不能在未检查初始归一化时直接把它当作 。基本矩阵及其可逆性的教学推导见 Orloff 讲义。[2]
由这个表达式可得三个直接用于计算的恒等式: 中间一式表示先从 走到 ,再从 走到 ,后发生的映射乘在左边。它与矩阵乘法作用于列向量的次序一致。
对连续系数,还可对起始时刻求导。由 得 注意 在右侧,而对终止时刻求导时 在左侧。一般矩阵并不交换,这两个式子的次序有实质区别。
常系数与时间顺序
当 不随时间改变时, 逐项求导可验证定义, 时为单位矩阵。时变情形则一般不能写成 。如果不同时刻的 两两交换,这个写法是可用的;缺少交换性时,矩阵乘积会保留被积分总和丢失的时间顺序。
考虑两段各持续一单位时间的系统: 因为 ,指数级数只剩两项: 所以先 后 的总映射为 若把两段的发生次序交换,则得到另一套系统的总映射 例如初始状态 在原次序下先保持不动,再到达 ;交换次序时先到 ,再到 。
原系统的逆向转移则是 它不是交换两段正向动力作用的矩阵。逆向回推必须把每一段都逆转,并倒转组合次序。
如果只把系数积分再取指数,由 ,会得到 其第一列约为 ,与上述两个真实终点都不同。这是一个可直接复算的反例。
两列组成的几何映射
同一切换系统在中间时刻的矩阵是 两段在 都等于 ,所以状态不会跳变。终点矩阵的两列为 与 ;初始单位正方形变成由这两个向量张成的平行四边形。
面积变化可以推广到一般线性系统。设 ,由行列式求导及可逆性, 其中 为对角元素之和。结合 得 本例每一段的迹为零,故面积始终为一。一般情况下行列式不为零说明有限时间转移可逆,却不保证数值求逆不放大误差。
可运行的两段计算
下列 Python 对上述两种剪切计算原次序的终点。输入为两个有限状态分量和两段非负持续时间,输出为新的二元组,不修改原状态。每段按自己的方程精确推进,所需时间和额外空间均为常数;它是这个具体系统的计算,不是任意矩阵指数求解器。
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)
读者可把初态改成 :一单位第一段得到 ,一单位第二段得到 。它也等于 。两段时间都为零时必须返回原状态,这也是代码的边界核验。
外部输入与非线性系统
加入输入 后,连续系数初值问题的解为 对它求时间导数,积分上限产生 ,其余各项共同产生 ,于是得到原方程。这是参数变易法的状态空间形式。
对非线性系统 ,整体初值到终值的映射一般不是矩阵。若 对状态足够光滑,在一条参考轨迹 附近可用变分方程 描述一阶微小扰动;其状态转移矩阵描述局部灵敏度,不能当作对任意大扰动都精确的全局映射。稳定与不稳定还需考察长期转移和适当范数,不能只由某个时刻矩阵的可逆性判定。
参考资料
- ↑ Mohammed Dahleh, Munther A. Dahleh, George Verghese. Lectures on Dynamic Systems and Control,第 11 章,尤其 §11.2。
- ↑ Jeremy Orloff. Fundamental matrix, variation of parameters,MIT ES.1803,2024,§19.5。