动态模态分解
动态模态分解(dynamic mode decomposition,DMD)从成对状态观测中拟合一个线性推进算子,再用它的特征值与模态描述衰减、增长或振荡。它关注状态怎样随时间变化;与只按数据能量寻找方向的本征正交分解不同,DMD使用相邻时刻之间的配对关系。
从连续快照到推进矩阵
设状态 在等时间间隔 下观测,组成 希望找到矩阵 使 接近 。以平方误差拟合,选择 其中 为摩尔—彭若斯伪逆。这个表达式始终给出一个最小二乘解;若 不满行秩,最小化矩阵可能不唯一, 是其中Frobenius范数最小的解。[1]
最小二乘理由。 矩阵 是样本坐标空间中的正交投影。因为 , 右边两项在Frobenius内积下正交,第一项不随 变化。取 使第二项为零,因而最优。一般解还可加上 ,它在已观测状态张成的空间上不起作用;该项与 正交,故范数最小的选择是使它为零。
一个可以手算的两状态序列
令 于是 逐项相乘给出 。两个模态方向是坐标轴,特征值分别为 、。每推进一步,两个分量分别缩小为原来的一半和四分之一,因此
低维谱计算
当 很大时,不必显式构造 的推进矩阵。设 是保留全部非零奇异值的紧致SVD,秩为 ,其中 表示共轭转置。定义 若 且 ,可取精确DMD模态 。乘法次序给出 而 不可能为零,否则 ,矛盾。因此它确为非零特征向量。模态乘非零常数不改变方向,本文取的尺度与文献中的 等价。
若只保留最大的若干奇异值,同样公式计算的是截断后的拟合算子的谱,未必是未截断 的精确谱。取 则称投影模态,一般也不等于精确模态。零特征值要单独处理,不能用含 的公式硬算。
下面实现保留全部数值非零奇异值,面向有限实矩阵输入,返回拟合矩阵、非零DMD特征值及对应模态,不改写输入。数值零由所设容差和谱尺度决定,因而会受数据精度影响。
import numpy as np
def exact_dmd(X, Y, rtol=1e-12):
X = np.asarray(X, dtype=float)
Y = np.asarray(Y, dtype=float)
if X.ndim != 2 or X.shape != Y.shape or min(X.shape) == 0:
raise ValueError("require equally shaped nonempty matrices")
if not np.isfinite(X).all() or not np.isfinite(Y).all():
raise ValueError("data must be finite")
if not np.isfinite(rtol) or not 0 < rtol < 1:
raise ValueError("rtol must lie in (0,1)")
U, s, Vh = np.linalg.svd(X, full_matrices=False)
rank = int(np.sum(s > rtol * s[0]))
if rank == 0:
raise ValueError("X must have positive numerical rank")
U, s, Vh = U[:, :rank], s[:rank], Vh[:rank, :]
B = (Y @ Vh.T) / s
A = B @ U.T
eigenvalues, W = np.linalg.eig(U.T @ B)
tolerance = rtol * max(1.0, float(np.max(np.abs(eigenvalues))))
nonzero = np.abs(eigenvalues) > tolerance
return A, eigenvalues[nonzero], B @ W[:, nonzero]
X = np.array([[1, 0.5], [1, 0.25]])
Y = np.array([[0.5, 0.25], [0.25, 0.0625]])
A, values, modes = exact_dmd(X, Y)
print(np.round(A, 12)) # [[0.5, 0.], [0., 0.25]]
print(np.sort(values)) # [0.25, 0.5]
assert np.allclose(A @ modes, modes * values)
assert np.allclose(A @ Y[:, -1], [0.125, 0.015625])
若 ,完整稠密SVD的时间量级为 ,另有秩 的矩阵乘法和 特征分解。代码为了教学还构造并返回 的 ,故额外含 空间;大规模实现应去掉这个返回项,直接使用低秩因子。
可辨认范围与预测边界
要使 精确成立,必须有 :同一个线性组合若把输入快照消成零,也必须把输出消成零。反过来,此条件使 ,因而最小二乘残差为零。若所有输入快照相同而输出不同,这一条件就失败,任何单一线性矩阵都无法精确解释全部配对。[2]
变式只观测 、。它们只能确定横轴上的推进,不能从中知道纵向倍率;伪逆给出的最小范数矩阵会将未被激发的纵向作用设为零。这是缺少信息,不是发现真实纵向动力为零。
若把非零特征值写成连续时间速率 ,复对数分支和采样间隔会影响频率解释。训练快照残差小,也不保证长期外推准确;噪声、未观测输入和状态范围变化都可能改变拟合关系。用于非线性系统时,DMD首先仍是所选观测量上的线性拟合,不能据此把原系统宣布为全局线性。
参考文献
- ↑ Jonathan H. Tu、Clarence W. Rowley、Dirk M. Luchtenburg、Steven L. Brunton、J. Nathan Kutz(2014):On Dynamic Mode Decomposition: Theory and Applications,Journal of Computational Dynamics,1(2):391–421,§2.2,定义2、算法2及定理1。
- ↑ Tu等,同上,§2.2,定义3与定理2“linear consistency”。