线性方程组的迭代解法

简介

求解线性方程组有直接解法和迭代解法两种方法。与直接解法相比,迭代解法能够比较好地保持系数矩阵的稀疏性,在大型线性方程组的求解问题中得到了广泛应用。

比较典型的迭代算法有三种,古典迭代法、共轭梯度法和广义极小剩余(GMRES)法。

  1. 古典迭代法从系数矩阵构造(分裂)出单步迭代格式,具有算法简单的优点,但是不易收敛,速度较慢。
  2. 共轭梯度法是一种多步算法。首先利用对称正定的系数矩阵,将方程组的求解问题转换成等价的优化问题,零点解向量变成极点解向量。其次以迭代点、剩余向量和搜索方向构造迭代格式。可以证明搜索方向(共轭梯度)逐维扩张出一个克莱罗夫(Krylov)子空间,而迭代点是优化问题在子空间上的极小点。当该子空间达到问题空间的维度,解向量即构造完毕。
  3. 广义极小剩余法也是构造一个克莱罗夫(Krylov) 子空间,由于采用兰佐(lanczos)法得到了子空间的标准正交基,因此可以利用极值求解得到方程组在子空间上的最小二乘解,而且不要求系数矩阵对称正定,具有更好的一般性。

古典迭代法

古典迭代法针对特定问题构造满足相容条件的单步定常线性迭代格式:

一般表述为:Ax=b, xk+1=Gxk+c, s.t. QA=I-G, Qb=c

收敛条件:$\rho(G)<1\,or\,\left \| G \right \|<1$

通常是分裂系数矩阵A,A = M – N,Mxk+1 = Nxk + b,得到四种常见方法(0<w<2):

  • Jacobi格式:Dxk+1= -(L+U) xk+b,充分收敛条件:A和2D-A正定。
  • Gauss-Seidel格式:(D + L)xk+1= - Uxk+ b
  • SOR格式:(D/w + L)xk+1 = [(1/w –1) D – U] xk+ b,充分收敛条件:A正定,0<w<2。
  • SSOR格式:(D/w + L)xk+1 = [(1/w –1) D – U] xk+ b, (D/w + U)xk+1 = [(1/w –1) D – L] xk+ b,充分收敛条件:A正定,0<w<2。
  • AOR格式:$(D+rL)x_{k+1}=((1-\omega)D-(\omega-r)L-\omega U)x_k+b$

多项式加速:Chebyshev半迭代法

共轭梯度法CG

考虑线性方程组:Ax=b,A对称正定。构造二次泛函:$f(x)=\frac{1}{2}x^TAx+b^Tx$,求解线性方程组等价于求解优化问题:$\arg \min_x(f(x))$。最简单的优化算法是最速下降法,即每次迭代都在负梯度方向$r_k= b-Ax_k$取泛函f的极小值:

$\phi(x_k)=\min_{\alpha} \phi(x_{k-1}+\alpha r_{k-1}), \phi‘(x_k)=0\Rightarrow \alpha=\frac{r_{k-1}^Tr_{k-1}}{r_{k-1}^TAr_{k-1}}$

设A的特征值为$0<\lambda_1 \leqslant \lambda_2 \leqslant ... \leqslant \lambda_n, x_*=A^{-1}b$,根据多项式理论,从极值公式可导出:

$\left \| x_k-x_* \right \|_A \leqslant \left ( \frac{\lambda_n-\lambda_1}{\lambda_n+\lambda_1} \right )^k \left \| x_0-x_* \right \|_A$

可见当矩阵A的特征值相差很大时,最速下降法比较缓慢。要加速收敛,利用多步迭代信息是一种很自然的思路。前一步的迭代方向pk-1、当前迭代点xk和负梯度方向rk构成了一个二维超平面p2 : x = xk + ark+ bpk-1,可以选择泛函f在p2上的极小点为新的迭代点。

$\phi(\tilde x)=\min_{\pi_2}\phi(x),r_{k-1}^T\phi‘(\tilde x)=p_{k-1}^T\phi‘(\tilde x)=0 \Rightarrow p_k=r_k+\frac{b}{a}p_{k-1}=r_k-\frac{p_{k-1}^TAr_k}{p_{k-1}^TAp_{k-1}}p_{k-1}$

可以证明,迭代方向p之间共轭($p_i^TAp_j=0$),剩余向量r之间,p与r之间相互正交,构成了一个逐维增长的Krylov子空间K(A,r0,k)=span{r0,Ar0,...,Ak-1r0}。每个迭代点都是子空间上的最优解,迭代点的修正方向是负梯度方向在Krylov超平面xk-1+K(A,r0,k)的共轭超平面的正交投影,因此该方法也称为共轭梯度法。其收敛性能有如下公式,$\kappa$为A的谱条件数,最大最小特征值之比。

$\left \| u_k \right \|_A\leqslant 2\left ( \sqrt \frac {\kappa -1}{\kappa+1} \right )^k\left \| u_0 \right \|_A \,where\,u_k=x_k-x_*$

与最速下降法相比,共轭梯度法的收敛性有所改进,但仍然依赖于特征值的分布状况。例如,特征值比较分散,就比较慢收敛。针对这一点,预优方法PCG利用矩阵变换来改善特征值分布。

$\tilde{A}\tilde{x}=\tilde{b}\,where\, \tilde{A}=C^{-1}AC^{T},\tilde{x}=C^{T}x,\tilde{b}=C^{-1}b$

然而,这带来了另外一个问题,即合理选择预优矩阵,使其耗费空间少,易于快速求解。不完全分解ICCG算法是目前比较成功的方法,就是对系数矩阵进行不完全分解,既保持矩阵的稀疏性,又使得预优后的矩阵近似单位阵,从而加速迭代过程。

松弛不完全分解$RILU: A = LU + R$,R为分解过程中的填入。如果R的对角线为零,则为ILU;如果对角线为行的负和,则称为MILU。

Lanczos方法

对于大型稀疏对称矩阵A,为了减少三对角化的内存占用,通常采用Lanczos方法。

$Q^TAQ=T\Rightarrow AQ=QT$。比较每一列,可得$Aq_i=\beta_{i-1}q_{i-1}+\alpha_iq_i+\beta_iq_{i+1}$。给定$q_1$,根据Q的正交性,可递推出$q_k,\alpha_k,\beta_k$。

此为Lanczos迭代,写成矩阵形式为:$AQ_j=Q_jT_j+r_je_j^T$。$T_j$为A在k(A,q1,j)上的投影。

对于对称非正定A,可以把问题$Ax=b$转换成$Q_k^TAQ_ky=Q_k^Tb,k=1,...,n$,依次得到子空间上的极小点。

对于非对称A,可以转换成上海森堡矩阵H,$Q_k^TAQ_k=H_k$,类似于lanczos(Arnoldi方法)的过程,得到$q_k,H_k$,从而计算在子空间上的最小二乘解。可参考广义极小剩余法(GMRES)。

AQk = QkH + rkekT

QkTAQkyk = QkTr0,xk = x0 + Qkyk,r0 = b - Ax0,q1= r0/|r0|  

参考文献

[1] 徐树方,矩阵计算的理论与方法,北京大学出版社,1995

[2] G. H. Golub, C. F. V. Van Loan. Matrix Computations. The Johns Hopkins University Press, 1983.

时间: 2024-10-10 22:57:13

线性方程组的迭代解法的相关文章

线性方程组的迭代解法数值结果分析

纸上得来终觉浅,绝知此事要躬行. ----(宋)陆游 在使用有限差分法的五点格式求解偏微分方程组时,把问题转化为求解数量级从10直到为10^4个未知数的稀疏矩阵的线性方程组,然后使用了Jocobi迭代,G-S迭代,SOR迭代以及CG迭代求解. 不管从程序的运行时间还是结果精度来看,SOR迭代和CG迭代较另外两种迭代法占优,而数值结果显示SOR迭代和CG迭代的收敛速度基本相当(后者稍微占优一点儿),这和理论的推导结果吻合地很好. 从程序使用的内存空间考虑的话,问题变得复杂了.简言之,CG方法依旧胜

线性方程组的迭代解法——共轭梯度法

1.代码 %%共轭梯度法(用于求解正定对称方程组) %%线性方程组M*X = b,M是方阵,X0是初始解向量,epsilon是控制精度 function CGM = Conjugate_gradient_method(M,b,X0,epsilon) m = size(M);up = 1000;e = floor(abs(log(epsilon))); X(:,1) = X0; r(:,1) = b-M*X0;p(:,1) = r(:,1); for k = 1:up alpha = Inner_

线性方程组的迭代解法——最速下降法

1.代码 %%最速下降法(用于求解正定对称方程组) %%线性方程组M*X = b,M是方阵,X0是初始解向量,epsilon是控制精度 function TSDM = The_steepest_descent_method(M,b,X0,epsilon) m = size(M);up = 1000;e = floor(abs(log(epsilon))); X(:,1) = X0; r(:,1) = b-M*X0; for k = 1:up alpha = Inner_product(r(:,k

线性方程组的迭代解法——超松弛迭代法

1.代码 %%超松弛迭代法(此方法适用于大型稀疏矩阵但不适合与病态方程的解 %%线性方程组M*X = b,M是方阵,X0是初始解向量,epsilon是控制精度,omiga是松弛因子 function OIM = Overrelaxation_iterative_method(M,b,X0,epsilon) [m,n] = size(M); d = diag(M);L = zeros(m,n);U = zeros(m,n);D = zeros(m,n);eps = floor(abs(log(ep

线性方程组的迭代解法——雅可比迭代法

1.代码 %%雅可比迭代法(此迭代法对于病态矩阵的解不理想) %%线性方程组M*X = b,M是方阵,X0是初始解向量,epsilon是控制精度 function JIM = Jacobian_iteration_method(M,b,X0,epsilon) [m,n] = size(M); d = diag(M);L = zeros(m,n);U = zeros(m,n);D = zeros(m,n); delta = 0;ub = 100;X = zeros(m,ub);X(:,1) = X

线性方程组的迭代解法——高斯-塞得勒迭代法

1.代码 %%高斯-塞得勒迭代法 %%线性方程组M*X = b,M是方阵,X0是初始解向量,epsilon是控制精度 function GSIM = Gauss_Seidel_iterative_method(M,b,X0,epsilon) [m,n] = size(M); d = diag(M); L = zeros(m,n); U = zeros(m,n); D = zeros(m,n); ub = 100;X = zeros(m,ub);X(:,1) = X0;X_delta = X;X_

数值分析-线性方程组的迭代解法

迭代法 对于AX = b 可将方程组进行改写 得到X = BX + f 迭代法就是通过设定初值X0 然后通过Xk+1 = BXk + f不断迭代 迭代一定次数后,Xn 可近似的看做方程组的解 迭代法的收敛性 设X*为方程组的准确解 εk = || Xk  - X* || 可以看到εk+1 = B * εk 迭代法收敛的充要条件是B的谱半径<1 B的谱半径为B最小的那个特征值 收敛阶 收敛阶就是收敛速度 平均收敛速度为-ln || Bk ||1/k 渐进收敛速度为 R(B) = -ln (ρ(B)

汉若塔问题的迭代解法

先看递归解法,用Perl语言一分钟不到就写完了. sub hanno_recursive { my ($from, $to, $reserve, $n) =  @_; if (1 == $n) { print "move $n from $from to $to\n"; return; } hanno_recursive($from, $reserve, $to, $n -1); print "move $n from $from to $to\n"; hanno_

[LeetCode系列]爬梯问题的递归解法转换为迭代解法

有一个n阶的梯子, 你每次只能爬1阶或2阶, 请问共有多少种登顶的爬法?(正好爬完n阶, 不能多也不能少) 本题最优解是直接套用菲波那切数列即可(因为菲波那切数列的第n个元素正好等于第n-1个元素和第n-2个元素的和, 与本题的要求完全相同). 递归解法: 1 int climbStairs(int n) { 2 if (n < 3) return n; 3 return climbStairs(n-1) + climbStairs(n-2); 4 } 思路很清晰, 递归到当前阶数小于3阶时返回