0%

Krylov Subspace Method for EXPV

背景

很多领域的很多问题,以及现实中的很多东西,都可以被建模为一个多元线性微分方程组。也就是说,一组变量随时间的变化率在任何时刻都由它们自身的线性组合决定。一般地,假设这组变量构成的向量是 x ,我们可以找到一个方阵 A ,使得

\frac{\partial x(t)}{\partial t} = Ax(t).

在此不推导求解过程,只给出如下结论:

x(t + \Delta t) = e ^ {A\Delta t} x(t).

为方便讨论,我们定义expm (A) \mathrel{\vcenter{:}}= e^A ,expv (A, x) \mathrel{\vcenter{:}}= e^Ax

x 的维数是 n 。现在,在通常数值精度的范围内计算expm最快的方式仍然需要 O(n^3) 的时间复杂度。但是通常,通过数值方法求解时,比起知道一个演化算符(即expm的结果),我们更关心一个具体的体系,在一个给定的初态下,将演化成什么样子,也就是求解expv。

成文时在一般条件下计算expv最快的方法仍然是Krylov子空间法。

何为Krylov子空间法?

熟悉数值计算的朋友们可能了解过共轭梯度CG优化算法等一系列其他问题上的Krylov子空间方法。其实Krylov子空间是一个比较泛的东西,他就是一个矩阵和一个向量在若干次矩阵乘法以内生成的线性空间。假设矩阵叫 A ,向量叫 x ,那么 A, x 生成的 m 阶Krylov子空间就是
K_m(A, x) = \text{span of} \ \{ x, Ax, \dots, A^{m - 1}x \}.

其中 \text{span of} 表示由集合中的向量任意线性组合生成的线性空间。若原来的空间有 n 个维度, m 阶Krylov子空间则最多有 m 个维度。通常情况下,我们设置的值将使 n 远大于 m ,从而使得在子空间里的计算是较廉价的。

Krylov子空间法,顾名思义,就是在这个子空间中尝试获得原问题的一个较好的近似。用数学的语言写出来,就是这样一个优化问题(在不作其他说明的情况下范数采用 2 -范数):
\begin{aligned} \min \quad &||e^Av - v_K|| \\ \text{s.t.} \quad &v_K \in K_m(A, v) \end{aligned} .

当然,这个优化问题本身的求解也不是非常显然的。这是一个在比较奇怪的线性空间里约束的问题,我们先利用一组基展开,将它变成一个无约束优化问题。假设我们找到 K_m(A, v) 的一组基 U = [U_1, U_2, \dots, U_m] (基向量作为列向量拼成的矩阵),把 v_K 表示成
v_K = \sum_{i=1}^m U_i k_i = Uk.

那么原来的优化问题就变成了
\begin{aligned} \min \quad &||e^Av - Uk|| \\ \text{s.t.} \quad &k \in \mathbb{R}^m \end{aligned} .

看起来好像差不多,但是现在已经是一个常规的、无约束的最小二乘优化问题。我们知道,它的解是
k = U^+ e^Av,
其中 U^+ 表示 U 的伪逆。但是解出来还不够,因为解里含有 e^Av 这个项,而这就是我们要求解的原问题。好像绕了一圈又绕回来了。其实不然。因为 k 的维度原小于 e^Av ,我们可以并不需要计算 e^Av ,而尝试去用其他的办法获得它在 U^+ 上的投影。

这投影具体如何计算,就需要知道 U^+ 到底是什么。我们需要开始考虑给 K_m(A, v) 找一组计算上‘好用’的基了。

如果 A^{k}v 都不线性相关的话(如果它们线性相关,它其实是等价于一个更低阶的Krylov子空间,可以降到更小的m求解;而且可以证明对于随机选取的 v m << n ,大概率它们是线性无关的),按照定义, K_m(A, v) 就天然有一组基:
\{ v, Av, \dots, A^{m - 1}v \}.

但是在数值上它有一些问题。对于大部分 v 而言, A^k v 会快速地收敛到 A 的某个特征向量(每次归一化的话),换句话说,虽然在严格数学上这组天然的基是线性无关的,但是在计算机中,由于数值的精度有限,看起来这些基就好像线性相关了一样。

消除这种数值精度带来的线性相关也很简单,只需要使用线性代数课程上都会讲的史密定正交化,不记得的话可以搜索复习一下。一边生成这组基,一边进行正交化运算,这就是Arnoldi算法了。

Arnoldi:令 U_1 = v ,计算 U_2 = AU_1 ,随后对 U_2 U_1 上进行正交单位化;计算 U_3 = AU_2 ,随后对 U_3 U_1, U_2 上进行正交单位化……依次类推,直到 m 个基向量都被找到。

通常我们需要做 m 次矩阵-向量乘法,复杂度开销为 O(mn^2) 。不过,如果矩阵具有稀疏性,或者有一些别的结构特性可以高效地计算这个矩阵-向量乘法的话可以更快。

求解EXPV

我们最终可以来计算 e^Av 了。

在刚才那组基下,由于我们进行了正交单位化处理, U 的伪逆 U^+ 实际上就是 U 的共轭转置 U^* 。我们记标准正交基下的第一个单位向量叫做 e_1 = [1, 0, 0, \dots]^T ,那么 v = U_1 = Ue_1 。我们再来表示 k

k = U^+ e^Av = U^* e^A Ue_1.

当然, e^A 总是我们不想看到的东西。我们需要作一些近似。现在是先计算了这个演化算符,随后投影到子空间上。我们可以把整个算符投影到子空间里,随后再在子空间里进行演化。公式表达就是

U^* e^A U \approx e^{U^* A U},
k \approx e^{U^* A U} e_1.

U^* A U 是一个 m 维的矩阵,采用通常的 O(m^3) 的方法就可以快速获得其expm。 U^* A U 自身则在前面正交单位化的时候计算过了:正交单位化过程中计算了每个 AU_i 和前面所有 U_j 的内积,而这就是这个矩阵 U^* A U 。直观上,这就是把算符 A 投影到子空间上之后所得到的结果。

这一步近似自然是有误差的。我们只是给出了一个直观的解释,详细的、严谨的分析需要使用Hermite插值多项式的相关理论,在这里只给出结论(可参考引文[1])。对于 m > 2||A||_2 ,近似的误差为
O \left( e^{-||A||_2} \left( \frac{e ||A||_2}{m} \right)^m \right).

PS. 一些实际的考虑和小trick

可以看到,这里要求 ||A||_2 是比较小的。而实际遇到的 ||A||_2 可能比较大。我们可以把 A 缩小一个倍数,随后多次应用这个方法近似,每次走一小步。在求解微分方程的时候,就是前文所说的 \Delta t 每次选取一个较小的值、作多步计算。

实验结果展示

我们知道,矩阵e指数的定义就是用泰勒展开定义的。因此,随机生成一个中等规模的矩阵,将上述泰勒展开截断到 m 项,和上述近似的Krylov子空间法、以及真实的子空间最优解(也就是先用 O(n^3) 的时间求expv再进行投影)进行比较。由于博主比较懒得跑实验,就贴一个别人文章里的图[2]。

Errors

参考

[1] Hochbruck, M., & Lubich, C. (1999). Exponential integrators for quantum-classical molecular dynamics. BIT Numerical Mathematics, 39(4), 620-645.
[2] Sidje, R. B. (1998). Expokit: A software package for computing matrix exponentials. ACM Transactions on Mathematical Software (TOMS), 24(1), 130-156.