1. 为什么需要Koopman Operator
线性化能帮助我们简化处理很多非线性问题。常见线性化手段如在不动点(fixed-point)附近进行线性化能提供一个局部的线性化表达,但对于远离不动点的区域就无能为力了。而Koopman operator可以看做是一种全局的线性化手段,将有限维非线性问题转化为无限组非线性坐标的线性组合(可以想象用泰勒展开、傅里叶级数来逼近一个函数帮助理解)。在某些限制下, koopman operator与动态模态分解(DMD)与离散傅里叶变换(DFT)紧密相连。
2. 什么是 Koopman Operator
Koopman operator是能够将任何系统
g
(
x
)
g(x)
g(x) 推进一个时间步的无限维线性系统。
κ
t
g
=
g
∘
F
t
\kappa_t g = g \circ F_t
κtg=g∘Ft
这里的
κ
t
\kappa_t
κt 就是Koopman operator,
F
t
F_t
Ft代表将任何系统在时间上推进一步,中间的
∘
\circ
∘是复合算子(composition operator)。
可能有点抽象,我们以一个时间步为
Δ
t
\Delta t
Δt的离散系统为例:
κ
t
g
(
x
k
)
=
g
(
F
t
(
x
k
)
)
=
g
(
x
k
+
1
)
\kappa_t g(x_k) = g(F_t(x_k)) = g(x_{k+1})
κtg(xk)=g(Ft(xk))=g(xk+1)
- 第一项:将以第k个时间步的状态 x k x_k xk为自变量的函数 g ( x ) g(x) g(x) 通过乘上Koopman Operator κ t \kappa_t κt 在时间上步进一步
- 第二项: g ( F t ( x k ) ) = g ∘ F t g(F_t(x_k)) = g \circ F_t g(Ft(xk))=g∘Ft,也就是上一个式子复合算子的展开。这一项的含义是先将自变量 x k x_k xk 步进到 x k + 1 x_{k+1} xk+1再取 g ( x ) g(x) g(x)函数值
- 第三项: g ( x ) g(x) g(x)代入 x k + 1 x_{k+1} xk+1的函数值
对于连续系统,写法稍微有点不一样:
d
d
t
g
=
κ
g
\frac{d}{dt} g = \kappa g
dtdg=κg
其中的
κ
\kappa
κ 可以结合
κ
t
\kappa_t
κt 和微分的定义来理解:
d d t g = lim t → 0 g ( x k + 1 ) − g ( x k ) t = κ t g − g t = κ g \frac{d}{dt}g = \lim_{t \to 0} \frac{g(x_{k+1})-g({x_k})}{t} = \frac{\kappa_t g-g}{t} = \kappa g dtdg=t→0limtg(xk+1)−g(xk)=tκtg−g=κg
3. 如何计算、估计Koopman Operator
前面已经说过Koopman Operator是无限维的,那么在实际中的使用就要涉及到两步:
- 估计
- 截断(truncate)
当然, 如果是特定形式微分方程,已知方程,理论推导的情况下,可以将估计改为计算(如果我记得的话哪天补个例子)。
针对数据驱动(data-driven)问题,假设要建模的系统可以写成:
κ
t
g
(
x
k
)
=
g
(
x
k
+
1
)
\kappa_t g(x_k) =g(x_{k+1})
κtg(xk)=g(xk+1)
这里
κ
t
\kappa_t
κt其实是一个矩阵,我们很难直接求取这个矩阵本身,通常采用的方法是求取矩阵的特征值与特征向量。具体的估计方法通常是采用动态模态分解(Dynamical mode decomposition, DMD)(如果我记得的话哪天补个例子)。