数值分析 笔记 4
线性方程组的迭代解法
迭代解法指的是通过构造一个向量序列来逼近准确解,类似不动点迭代法,为了保证迭代的计算量较小,则:
x(k+1)=Bx(k)+f
对于 Ax=b,使用矩阵分裂法,令 A=M−N,则可以化简为:
x=M−1Nx+M−1b
这也就是一个迭代表达式,因此分裂需要满足:
- M非奇异,且解方程快
- 收敛快
Jacobi 迭代法
令D=diag(A),则令M=D,N=D−A
迭代式为:
xk+1=D−1(D−A)x+D−1b
由于 D−1 是方便计算的,只用做 n 次除法即可,因此每次迭代的计算量相当于是做一次 MV 运算,如果是 SpMV,则计算量降为 O(nnz(A))
算法为:
1 2 3 4
| while not stop: y = x for i in range(1, n + 1): x[i] = (b[i] - sum(1, i, a[i][j] * y[j]) - sum(i + 1, n + 1, a[i][j] * y[j])) / a[i][i]
|
Gauss-Seidel 迭代法
与 Jacobi 迭代法很类似,不同的是取 M 为 A 的下三角子阵而不是对角阵,但这时候对迭代法的顺序有要求,当求出 xi(k+1) 之后,需要用它直接求 xi+1(k+1)
因此对应算法为:
1 2 3
| while not stop: for i in range(1, n + 1): x[i] = (b[i] - sum(1, i, a[i][j] * x[j]) - sum(i + 1, n + 1, a[i][j] * x[j])) / a[i][i]
|
当然也可以逆向计算,从 n 算到 1
事实上,上述的逻辑其实是推到的逻辑的逆向,我们是先给出分裂法对应的矩阵,之后再给出算法,但其实这不太符合逻辑,我们应该是先给出迭代的算法,再推导出其分裂法的矩阵,并据此分析其收敛性等性质
例如,Jacobi 和 GS 的算法来源应该是下面两张图:
SOR 迭代法
在 GS 迭代法的基础上增加了松弛因子 ω,计算完 xi(k+1) 之后将其与 xi(k) 加权平均得到最终结果,具体来说:
对应的矩阵计算为:
x(k+1)=(1−ω)x(k)+ωD−1[L~x(k+1)+U~x(k)+b]
对应分裂法,M=ω1D−L~,其中:
L~={−aij0i>jothersU~={−aij0i<jothers
因此对应算法为:
1 2 3
| while not stop: for i in range(1, n + 1): x[i] = (1 - ω)* x[i] + ω * (b[i] - sum(1, i, a[i][j] * x[j]) - sum(i + 1, n + 1, a[i][j] * x[j])) / a[i][i]
|
收敛性分析
类似非线性方程求解的判据,我们定义:
e(k)=x(k)−x∗
则容易得到
e(k+1)=Be(k)⇒e(k)=Bke(0)
因此对于任意一个初始误差,如果要保证迭代法收敛,则需要保证 k→∞limBk=O
对于矩阵的极限,我们有如下定理:
k→∞limA(k)=A⇔∀xk→∞limA(k)x=Ax
定义矩阵的谱半径为ρ(A)=max∣λ(A)∣,使用谱分解或 Jordan 分解可以证明,k→∞limBk=O 等价与 ρ(B)<1
正式给出定理:
若:
x(k+1)=Bx(k)+f
且 I−B 非奇异,则迭代法对于任意初始值收敛的充要条件是 ρ(B)<1,且非奇异保证了收敛值是唯一解
类比之前对收敛阶的定义,可以证明当 B 可对角化的时候,该迭代法 1 阶收敛,且常数 c=ρ(B)
对于上述的三种迭代法,有充分条件:
对于 Jacobi 的迭代矩阵 B=D−1(D−A),若 ∣∣B∣∣1<1 或 ∣∣B∣∣∞<1,则 Jacobi 和 G-S 收敛
对于一个矩阵 A,如果存在排列阵 P,使得:
PTAP=[A110A12A22]
其中 A11 与 A22 是方阵,则称 A 是可约矩阵
给出一些针对系数矩阵是对角占优和正定阵时,收敛的条件:
- 严格对角占优矩阵、不可约的弱对角占优矩阵,都是非奇异的
- 对于 1 中的系数矩阵,其 Jacobi 和 G-S 都收敛,并且若 0<ω≤1,则 SOR 也收敛
- 对于系数为对称正定矩阵,Jacobi在对角元全正,且 2D−A 也正定的时候收敛,G-S 一定收敛,并且若 0<ω<2,则 SOR 也收敛
- SOR 收敛的必要条件是 0<ω<2
最速下降法
将解线性方程组转化为在高维空间中求函数极值的问题,例如对于函数:
φ(x)=21xTAx−bTx
可以证明其极值点就是 Ax=b 的解,如果 A 是正定矩阵,则这个极值点一定是最小值
求极值最简单的方法是最速下降法,也就是梯度下降,每一步沿着负梯度方向前进,步长保证得到的结果最小,对于上述的 φ,我们有:
∇φ(x(k))=Ax(k)−b=−r(k)
则步长为:
αk=(r(k))TAr(k)(r(k))Tr(k)
每次迭代为:
x(k+1)r(k+1)=x(k)+αkr(k)=r(k)+αkAr(k)
等式 (2) 是因为 Δr=Δ(b−Ax)=−AΔx=−αAr
每步迭代的计算量是一次 MV,与 SOR 相同
由于 φ 是凸二次函数,因此一定收敛,对于一般的优化问题,可以扩展为随机梯度下降法
但是梯度下降的收敛速度很慢,并且可能会遇到局部最优解
共轭梯度法
不沿着最速下降方向,沿着最速下降方向和上一步搜索方向张成的平面移动,设搜索方向为 p(k),则:
βk−1p(k)αk=−(p(k−1))TAp(k−1)(r(k))TAp(k−1)=r(k)+βk−1p(k−1)=(p(k))TAp(k)(r(k))Tp(k)
每轮迭代需要一次 MV 两次 VV,但是可以保证如果收敛,则收敛步数不大于 n
对于病态矩阵,舍入误差严重,可能收敛很慢甚至不收敛,因此可以做一些处理,例如对于病态矩阵 A:
Ax=b⇔M−1Ax=M−1b
如果想保证系数矩阵是对称正定的,则取 M=LLT 是对称正定的,并且令 y=LTx,则:
Ax=b⇔L−1AL−Ty=L−1b
这样 L−1ALT 就是对称正定的