背景介绍
广义最小残差法(Generalized Minimal Residual, GMRES)广泛应用于计算流体力学和电磁仿真等领域,是科学计算中求解大型稀疏线性方程组Ax=b的主流迭代算法之一,适用的问题比较广,其中A为稀疏矩阵,b通常称为右端向量。与传统的直接解法相比,GMRES通过Krylov子空间投影逐步逼近方程的解,从而减少计算量并提高数值稳定性。
传统的解法一般就是求A的逆矩阵A−1,x=A−1b
基本数学知识
Cayley-Hamilton Theorem
对于n×n矩阵A,特征值λ和特征向量x满足:
Ax=λx(x=0)
移项可得:
(λIn−A)x=0
其中In是n×n单位矩阵,可以理解成向量中的1,也是标量λ变成向量参与运算的媒介。由于x是非零向量,齐次线性方程组(1)有非零解的充要条件是系数矩阵的行列式为0:
det(λIn−A)=0
即特征方程,展开左边:
λIn−A=λ−a11−a21⋮−an1−a12λ−a22⋮−an2⋯⋯⋱⋯−a1n−a2n⋮λ−ann
根据Leibniz公式,λ的最高次项为n即主对角线相乘(λ−a11)(λ−a22)⋯(λ−ann),且系数为1。这个式子中每包含一个非对角线元素,则必然会替换掉一个主对角线的λ项,从而得到λn−1,λn−2,⋯,λ0。当λ=0时,det(0⋅In−A)=(−1)ndet(A),因此常数项c0=(−1)ndet(A)。
最终得到特征多项式方程,即:
p(λ)=λn+cn−1λn−1+cn−2λn−2+⋯+c1λ+c0=0
而Cayley-Hamilton Theorem的核心结论就是:矩阵 A 满足其自身的特征多项式方程:
p(A)=An+cn−1An−1+cn−2An−2+⋯+c1A+c0=0(1)
Krylov Subspace
对式子(1)两边同时乘以一个A−1:
An−1+cn−1An−2+cn−2An−3+⋯+c1I+c0A−1=0
再同除一个c0并移项:
A−1=c0−1An−1+c0−cn−1An−2+⋯+c0−c1I
于是我们可以得到:
A−1∈span{An−1,An−2,…,I}
即A−1在这些向量张成的子空间里,但这并不是最终的Krylov Subspace,我们还要新设一个向量r,然后对上面的式子两边同乘r,得到:
A−1r∈span{r,A1r,A2r,…,An−1r}(2)
这才是Krylov Subspace,至于为什么要乘以一个mathsubr,后面将会解释。
Gram-Schmidt and Arnoldi Iteration
一般解大型稀疏矩阵A,维度n是非常大的,虽然我们已经得到了Krylov Subspace,但是我们无法保证张成这个子空间的基向量都是线性独立的,以至于如果直接在这个子空间里搜寻近似解x,效率其实是很低的。为此,我们要想办法用更少的基向量来张成这个子空间。于是我们很容易想到,如果这个子空间里的基向量都相互正交并且范数都为1的话,所需要的基向量数肯定是最少的,也就大大提高了我们搜寻正确答案的效率。
我们从第一个元素r开始,易得:
q0=∣∣r∣∣r
再来看第二个元素A1r,很简单,我们只需要找到它垂直于q0的分量,具体如图:

我们设k1=Ar,u1为k1垂直于q0的分量,proj_q0(k1)为k1在q0上的投影,易得:
u1=k1−proj_q0(k1)q1=∣∣u1∣∣u1
以此类推:
u2=k2−proj_q0(k2)−proj_q1(k2),q2=∣∣u2∣∣u2u3=k3−proj_q0(k3)−proj_q1(k3)−proj_q2(k3),q3=∣∣u3∣∣u3⋯um=km−i=0∑m−1proj_qi(km),qm=∣∣um∣∣um(3)
计算u的过程被称为Gram-Schmidt Orthogonalization(正交化),计算q的过程被称为Gram-Schmidt Orthonomalization(正交归一化),每一个被计算出来的q又被称为Arnoldi Vector,整个过程我们称为Arnoldi Iteration
需要注意的是:这里的m一定是小于n的,除非最开始的Krylov Subspace里的向量就全部互相正交,但这显然不太可能,当我们计算出的qi=0的时候,我们就可以认为Q里已经包含了所有的维度,不再需要迭代
GMRES算法过程
回到Ax=b问题本身,大多数时候,我们并不关注正确答案本身,而是假设一个答案x0,当这个答案与正确答案x之间的差值r足够小的时候,我们就认为我们找到了正确答案。
设初始答案为x0,则有:
r0=Ax0−bA−1r0=x0−A−1bA−1r0=x0−xx=x0−A−1r0
看到这里,我相信你已经知道为什么前面的Krylov Subspace,即A−1r∈span{r,A1r,A2r,…,An−1r}需要这样构造了吧。再经过Arnoldi Iteration,我们就能得到维度更小,但是空间一致的子空间span{q0,q1,q2,⋯,qm}。可以表示为Qm=[q0q1q2⋯qm]。
于是我们可以得到:
x=x0−Qmy
为了使等式成立,我们引进了新的变量y,这个y可以理解成x在各个维度上的分量。
所以:
r=Ax−br=A(x0−Qiy)−br=r0−AQiy(4)
这里的x指的不是正确答案,而是在误差范围内我们要寻找的答案,i指的是迭代次数,即:
foriinrange(m):r=r0−AQiy
这就是GMRES算法的迭代过程,当r<resid_limit,这里的resid_limit是我们规定的误差范围,一般为1e−6,迭代终止,也就认为我们找到了最终答案。为了方便我们的迭代,我们引入了一个新的矩阵,Hessenberg Matrix(海森堡矩阵),它的格式固定为:
Hi+1,i=h0,0h1,000⋯0h0,1h1,1h2,10⋯0⋯⋯⋯⋯⋯⋯h0,ih1,ih2,ih3,i⋯hi+1,i
我们将这个矩阵记为Hi,他是用来搭建AQi和Qi+1之间关系的桥梁,即:AQi=Qi+1H
回忆Arnoldi Iteration**(注意:以下的m指的不是Krylov Subspace维度数,而是迭代次数)**:
um=km−i=0∑m−1proj_qi(km),qm=∣∣um∣∣um
因为proj_qi(km)是km在qi上的投影,也就可以理解成一个常数乘以qi。很明显,qm和um也是这样的关系,所以:
um=amqm=km−i=0∑m−1biqiqm=c0km+c1q0+c2q1+⋯+cmqm−1
也就是说qm∈span{km,q0,q1,⋯,qm−1},而我们又很容易知道span{q0,q1,⋯,qm−1}=span{k0,k1,⋯,km−1},因为前者只是用互相正交且范数为1的基重新去表示了Krylov Subspace,张成的空间肯定是一致的。所以:
qm∈span{k0⋯km}Aqm∈span{Ak0⋯Akm}
又因为km=Amr,所以:
Aqm∈span{k1⋯km+1}
这里的Aqm是新加入的向量,于是我们就会发现,与其按照式子(2)的方式来得到新的维度km+1,不如直接计算Aqm来得到km+1,然后就能得到新的qm+1维度,加入Qm变成Qm+1进入下一个迭代,我们记通过这种方式得到的子空间span{k1⋯km+1}为km+1’。
所以我们可以展开AQm:
AQm=[Aq0,⋯,Aqm]=[k1’,⋯,km+1’]=Km+1’
又因为:km+1’∈span{q0⋯qm+1},也就是Qm+1的一个线性组合,所以:
Km+1’=[h0q0,h1q1,⋯,hm+1qm+1]=[q0,q1,⋯,qm+1]h0,0h1,000⋯0h0,1h1,1h2,10⋯0⋯⋯⋯⋯⋯⋯h0,mh1,mh2,mh3,m⋯hm+1,m=Qm+1H
相当于我们的H矩阵里的每一列hi实际上记录着的就是如何将q0⋯qi+1转变为ki+1’的信息。所以,式子(3)可以重写为:
km+1’=qm+1∗∣∣um+1∣∣+i=0∑mproj_qi(km+1’)=qm+1∗∣∣um+1∣∣+i=0∑m(km+1’⋅qi)qi=um+1+i=0∑mhiqi=Aqm
然后我们就只需要解出um+1,也就得到了对应的qm+1和∣∣um+1∣∣。关系为:
qm+1=∣∣Aqm−∑i=0mhiqi∣∣Aqm−∑i=0mhiqi=∣∣um+1∣∣um+1
而∣∣um+1∣∣恰好就是我们想要的hm+1,m,因为我们看Qm+1H的最后一列:
Aqm=hm+1,mqm+1+i=0∑mhi,mqi=∣∣um+1∣∣qm+1+i=0∑mhiqi
这也就是完整的一次迭代过程,每次迭代实际上都是在计算H的第m列。
式子(4)也就能改写为:
r=r0−Qm+1Hm+1,myr=βq0−Qm+1Hm+1,myr=Qm+1(βe−Hm+1,my)∣∣r∣∣2=∣∣Qm+1(βe−Hm+1,my)∣∣2
又因为Qm+1的所有矢量都是单位矢量且互相正交,所以:
∣∣r∣∣2=∣∣(βe−Hm+1,my)∣∣2
到这里,问题也就简化为了求最小二乘解的问题了,一般用QR分解求解。在这里,由于GMRES算法求解的大多数是稀疏矩阵乘,采用Givens变换比较好。