简介
对于大规模稀疏线性方程组 Ax=b,直接法(如 LU 分解)存在以下局限:
- 存储问题:即使 A 是稀疏的,其 LU 分解因子 L 和 U 也可能变得稠密。
- 计算复杂度:直接法通常是 O(n3),对于大规模问题难以承受。
迭代法基本思想:
通过构造迭代格式:
x(k+1)=Mx(k)+g
从一个初始猜测 x(0) 出发,产生近似解序列 {x(k)},期望其收敛到真实解 x∗。
注:迭代法特别适合大规模稀疏矩阵,因为每次迭代只进行矩阵-向量乘法,可以充分利用稀疏性。
Jacobi 迭代法
Jacobi 迭代格式
将系数矩阵 A 分解为:
A=D−(D−A)=D−B
其中 D=diag(a11,a22,…,ann) 为对角矩阵,B=D−A。
原方程 Ax=b 改写为:
Dx=Bx+b
若 aii=0(对所有 i),则 D 可逆,得到 Jacobi 迭代格式:
x(k+1)=D−1(D−A)x(k)+D−1b=Bx(k)+g
分量形式:
xi(k+1)=aii1bi−j=1,j=i∑naijxj(k),i=1,2,…,n
注:Jacobi迭代的本质是同步更新——每次迭代使用上一步的所有分量值 xj(k) 来计算当前步的所有分量 xi(k+1)。
Jacobi 算法流程
输入:A∈Rn×n,初始值 x(0),右端项 b,最大迭代次数 N,误差阈值 EPS
输出:近似解 x
x_new = np.zeros(n, dtype=float) # 初始值
x_old = np.zeros(n, dtype=float)
k = 0
while k < N:
k += 1
for i in range(n):
x_new[i] = b[i]
for j in range(n):
if j != i: # 为减少判断开销可以分开循环
x_new[i] -= A[i, j] * x_old[j]
x_new[i] /= A[i, i]
if np.linalg.norm(x_new - x_old, 2) < EPS:
break
x_old = x_new.copy() # 保存旧值
注:
必须先用临时变量保存 x(k) 的所有分量,避免混用新旧值。不过可以交替使用两个数列作为新旧值,只需交换引用而不需要复制数组,减少内存分配和复制的开销。
Gauss-Seidel 迭代法
Gauss-Seidel 迭代格式
观察 Jacobi 方法,在计算 xi(k+1) 时,x1(k+1),…,xi−1(k+1) 已经计算出来,但 Jacobi 仍然使用旧值 xj(k)(j<i)。
Gauss-Seidel 思想:立即使用最新计算出的分量值(异步更新)。
将 A 分裂为:
A=D−L−U
其中 L 为严格下三角矩阵(对角线为零),U 为严格上三角矩阵。
迭代格式变为:
(D−L)x(k+1)=Ux(k)+b
即:
x(k+1)=(D−L)−1Ux(k)+(D−L)−1b
分量形式:
xi(k+1)=aii1(bi−j=1∑i−1aijxj(k+1)−j=i+1∑naijxj(k)),i=1,2,…,n
注:与 Jacobi 的关键区别在于求和项 ∑j=1i−1 使用的是当前步已更新的 xj(k+1)。
Gauss-Seidel 算法流程
输入:A∈Rn×n,初始值 x(0),右端项 b,最大迭代次数 N,误差阈值 EPS
输出:近似解 x
x_new = np.zeros(n, dtype=float) # 初始值
x_old = np.zeros(n, dtype=float)
k = 0
while k < N:
k += 1
for i in range(n):
x_new[i] = b[i]
for j in range(i): # 使用新值
x_new[i] -= A[i, j] * x_new[j]
for j in range(i + 1, n): # 使用旧值
x_new[i] -= A[i, j] * x_old[j] # 也可以写成 x_new
x_new[i] /= A[i, i]
if np.linalg.norm(x_new - x_old, 2) < EPS:
break
x_old = x_new.copy() # 保存旧值
注:
- Gauss-Seidel 通常比 Jacobi 收敛更快。
- 但 Jacobi 是同步的,每个分量的更新只依赖上一轮迭代的旧值,可以进行并行计算,而 Gauss-Seidel 是串行依赖的,每个分量的更新依赖同一轮迭代的新值,所以只能串行。
- 计算时实际上可以直接都使用
x_new,但是为了判断收敛不得不保存 x_old,所以使用 x_old 更加清晰。
松弛法
松弛法(Successive Over-Relaxation, SOR)。
SOR 迭代格式
Gauss-Seidel 的更新可看作在当前解 x(k) 上加上一个修正量:
x(k+1)=x(k)+Δx
其中:
Δx=D−1[Lx(k+1)+Ux(k)+b−Dx(k)]
松弛法思想:引入松弛因子 ω 对修正量进行加权:
x(k+1)=x(k)+ωΔx
整理得 SOR 迭代格式:
(D−ωL)x(k+1)=[(1−ω)D+ωU]x(k)+ωb
即:
x(k+1)=(D−ωL)−1[(1−ω)D+ωU]x(k)+ω(D−ωL)−1b
分量形式:
xi(k+1)=(1−ω)xi(k)+aiiω(bi−j=1∑i−1aijxj(k+1)−j=i+1∑naijxj(k))
注:
- ω=1:退化为 Gauss-Seidel 方法
- 0<ω<1:低松弛法(亚松弛法),常用于非正定系统或震荡情况
- 1<ω<2:超松弛法,用于加速收敛
- ω≥2 或 ω≤0:通常不收敛(对正定矩阵)
SOR 算法流程
输入:增加松弛因子 omega
输出:近似解 x
x_new = np.zeros(n, dtype=float) # 初始值
x_old = np.zeros(n, dtype=float)
k = 0
while k < N:
k += 1
for i in range(n):
# 先计算 delta x
x_new[i] = b[i]
for j in range(i): # 使用新值
x_new[i] -= A[i, j] * x_new[j]
for j in range(i + 1, n): # 使用旧值
x_new[i] -= A[i, j] * x_old[j] # 也可以写成 x_new
x_new[i] = x_new[i] * omega / A[i, i]
# 再加上 x^(k)
x_new[i] = x_new[i] + (1 - omega) * x_old[i]
if np.linalg.norm(x_new - x_old, 2) < EPS:
break
x_old = x_new.copy() # 保存旧值
注:最优松弛因子 ωopt 通常介于 0.9-1.5 之间,具体值与矩阵谱性质有关。对于特殊矩阵(如相容次序矩阵),有理论公式计算 ωopt。
迭代法的收敛性
统一迭代格式
三种方法可统一写成:
x(k+1)=Mx(k)+g
| 方法 | 迭代矩阵 M | 向量 g |
|---|
| Jacobi | MJ=D−1(D−A)=I−D−1A | gJ=D−1b |
| Gauss-Seidel | MGS=(D−L)−1U | gGS=(D−L)−1b |
| SOR | MSOR=(D−ωL)−1[(1−ω)D+ωU] | gSOR=ω(D−ωL)−1b |
两个引理
定义(谱半径):矩阵 A∈Cn×n 的特征值
λ1,λ2,⋯,λn,则其谱半径为
ρ(A)=1≤i≤nmax∣λi∣
先证明两个引理:
引理 1(范数逼近引理):
对任意 ε>0,存在矩阵范数 ∥⋅∥ε 使得
ρ(A)≤∥A∥ε≤ρ(A)+ε
引理 1 的证明:
设 A 的 Jordan 标准形为 J=P−1AP,其中:
J=J1⋱Jm
每个 Jordan 块 Ji 对应特征值 λi:
Ji=λiIni+Nni
其中 Nni 是 ni×ni 的严格上三角幂零矩阵,只有次对角线为 1。
对每个 Jordan 块,定义对角矩阵:
Dni(ε)=diag(1,ε,ε2,…,εni−1)
计算 Jordan 块的相似变换:
D−1JiD=λiελi⋱⋱ελi=λiI+εNni
取 D(ε)=diag(Dn1(ε),…,Dnm(ε)),令整体相似变换后矩阵:
A(ε)=D−1(ε)JD(ε)=D−1(ε)P−1APD(ε)
计算 A(ε) 的行和范数 ∥⋅∥∞:
∥A(ε)∥∞=imaxj∑∣[A(ε)]ij∣=imax∣λi∣+ε=ρ(A)+ε
接下来利用上一节课的补充内容:
向量范数的可逆变换
以及 矩阵范数的相似变换,
构造一个诱导范数,使其值恰好等于相似变换后矩阵的行和范数。
定义向量范数:
∥x∥ε:=∥(PD(ε))−1x∥∞
对应的诱导范数:
∥A∥ε=∥x∥ε=1max∥Ax∥ε
则:
∥A∥ε=∥(PD)−1A(PD)∥∞=∥A(ε)∥∞=ρ(A)+ε
从而完成证明(构造)。当然左侧的不等式也可以由上节课的有关内容得到。
注:由于矩阵范数的选取依赖于 ε,故不能令 ε→0,也即不一定存在一个范数使得 ∥A∥=ρ(A)
引理 2(幂零与谱半径的关系):
设 A∈Cn×n,则:
k→∞limAk=0⟺ρ(A)<1
其中 Ak→0 等价于 ∥Ak∥→0,∥⋅∥ 是某一(由范数等价性也即任意)矩阵范数。
引理 2 的证明:
⇐ 方向:
由 引理 1(范数逼近引理):对任意 ε>0,存在矩阵范数 ∥⋅∥,使得
∥A∥≤ρ(A)+ε
取 ε=21−ρ(A)>0,则
∥A∥≤ρ(A)+21−ρ(A)=21+ρ(A)≡q<1
结合矩阵范数的相容性(次可乘性) 得:
∥Ak∥≤∥A∥k≤qk
故 limk→∞∥Ak∥=0。
⇒ 方向:用反证法。
假设 ρ(A)≥1,则存在特征值 λ 满足 ∣λ∣≥1。
设 v=0 为对应的特征向量,Av=λv,则有:
Akv=λkv
若 Ak→0,则对任意向量 x 有 Akx→0。特别地,取 x=v:
k→∞limAkv=k→∞limλkv=0
由于 v=0,这要求 limk→∞λk=0,与 ∣λ∣≥1 矛盾!
注:引理 2 的 ⇐ 方向还可以直接用 Jordan 分解与二项式展开进行剥蒜证明。
收敛的充要条件
基本收敛定理:
迭代格式对任意初始向量 x(0) 都收敛的充分必要条件是:
ρ(M)<1
证明:
-
有如下误差传播关系:
e(k)=x(k)−x∗=Mke(0)
这是因为
e(k+1)=x(k+1)−x∗=Mx(k)+g−Mx∗−g=Me(k)
-
由引理 2 知
k→∞limMk=0⟺ρ(M)<1
从而完成证明。
收敛的充分条件
由于计算谱半径较困难,可以使用矩阵范数作为估计。
定理:若存在某个矩阵范数 ∥⋅∥ 使得
∥M∥<1
则迭代法收敛。
证明:
由 ρ(M)≤∥M∥ 对任意矩阵范数成立易知。
收敛速率分析
定义(平均收敛速率):
对任意矩阵范数 ∥⋅∥,定义对应的平均收敛速率:
Rk(M)=−k1ln∥Mk∥
定义(渐进收敛速率):
对格式矩阵 M,定义其渐进收敛速率:
R∞(M)=k→∞limRk(M)=−lnρ(M)
证明:
即证如下 Gelfand 谱半径公式:
k→∞lim∥Mk∥1/k=ρ(M)
-
上界:
对任意矩阵范数 ∥⋅∥,有谱半径不等式:
ρ(M)≤∥M∥
对 Mk 应用此不等式,并结合 ρ(Mk)=ρ(M)k 得:
ρ(M)≤∥Mk∥1/k
令 k→∞,得:
ρ(M)≤k→∞liminf∥Mk∥1/k
-
下界:
利用引理 1(范数逼近引理):对任意 ε>0,存在矩阵范数 ∥⋅∥ε 使得:
∥M∥ε≤ρ(M)+ε
于是:
∥Mk∥ε1/k≤(∥M∥εk)1/k=∥M∥ε≤ρ(M)+ε
由于所有矩阵范数等价,因此存在常数 C>0 使得 ∥A∥≤C∥A∥ε,也即:
∥Mk∥1/k≤C1/k∥Mk∥ε1/k≤C1/k(ρ(M)+ε)
令 k→∞ 即得:
k→∞limsup∥Mk∥1/k≤ρ(M)+ε
由 ε 的任意性,令 ε→0+:
k→∞limsup∥Mk∥1/k≤ρ(M)
证毕。
注:
- 误差显然是指数形式收敛的。我们估计的是 exp{−R(M)k} 形式。
- 渐进收敛速率由谱半径唯一确定,也即渐进收敛形式为 ρ(M)k。
- 由此可见谱半径越小,收敛越快。
终止条件估计
利用谱半径估计:
为达到误差 ∥e(k)∥≤ε,所需迭代次数约为(假设初始误差为 1):
k≈lnρ(M)lnε
利用矩阵范数估计:
若某一矩阵范数下 ∥M∥=q<1,则:
∥x(k)−x∗∥≤1−qq∥x(k)−x(k−1)∥≤1−qqk∥x(1)−x(0)∥
从而当 ∥x(k)−x(k−1)∥<q1−qε 时,
可保证 ∥x(k)−x∗∥<ε。
证明:
x(k)−x∗=M(x(k−1)−x∗)=M(x(k−1)−x(k)+x(k)−x∗)
从而由三角不等式:
∥x(k)−x∗∥≤q∥x(k−1)−x(k)∥+q∥x(k)−x∗∥
化简即证。
特殊矩阵的收敛性
相关定义
定义(对角占优矩阵):
矩阵 A 称为对角占优,若:
∣aii∣≥j=i∑∣aij∣,∀i=1,…,n
且至少对一个 i 严格不等式成立。若对所有 i 都严格成立,则称为严格对角占优。
定义(不可约矩阵):
矩阵 A∈Rn×n 称为可约的,若存在排列矩阵 P 使得:
PTAP=[A110A12A22]
其中 A11,A22 为方阵。否则称 A 为不可约的。
不可约矩阵等价定义:
存在指标集的非空划分 S∪T={1,…,n},使得 aij=0 对所有 i∈S,j∈T 成立。
证明:这是显然的。
标准分裂记号:
A=D+L+U
其中 D 为对角部分,L 为严格下三角部分(i>j 时 lij=aij),U 为严格上三角部分(i<j 时 uij=aij)。
对应迭代矩阵:
- Jacobi:MJ=−D−1(L+U)
- Gauss-Seidel:MGS=−(D+L)−1U
注:这类矩阵常见于离散偏微分方程(如有限差分、有限元)
严格对角占优矩阵的收敛性
若迭代格式矩阵 A 严格对角占优,则
- A 非奇异
- Jacobi 迭代法对任意初始向量收敛
- Gauss-Seidel 迭代法对任意初始向量收敛
严格对角占优矩阵非奇异性证明
反设 A 奇异,则存在非零向量 x∈Rn 使得 Ax=0。
设 ∣xi∣=max1≤j≤n∣xj∣>0,考虑第 i 个方程:
j=1∑naijxj=0⟹aiixi=−j=i∑aijxj
取绝对值并利用三角不等式:
∣aii∣∣xi∣=j=i∑aijxj≤j=i∑∣aij∣∣xj∣≤j=i∑∣aij∣∣xi∣
两边除以 ∣xi∣>0 得:
∣aii∣≤j=i∑∣aij∣
这与 A 严格对角占优矛盾!
严格对角占优矩阵 Jacobi 迭代收敛性证明
迭代矩阵 MJ=−D−1(L+U),其元素为:
(MJ)ij={0,−aiiaij,i=ji=j
计算行和范数:
∥MJ∥∞=1≤i≤nmaxj=i∑aiiaij=1≤i≤nmax∣aii∣1j=i∑∣aij∣
由严格对角占优条件 ∣aii∣>∑j=i∣aij∣,得:
∥MJ∥∞<1
因此 Jacobi 迭代收敛。
严格对角占优矩阵 Gauss-Seidel 迭代收敛性证明
反证法证明 ρ(MGS)<1。反设 λ 为 MGS 的特征值且 ∣λ∣≥1。特征方程为:
det(λI−MGS)=det(λI+(D+L)−1U)=0
等价于:
det(λ(D+L)+U)=0
令 B(λ)=λ(D+L)+U,其元素为:
bij=⎩⎨⎧λaii,λaij,aij,i=ji>ji<j
容易发现 B(λ) 仍是严格对角占优矩阵,故其非奇异,与 det(B(λ))=0 矛盾!
不可约对角占优矩阵的收敛性
若迭代格式矩阵 A 不可约对角占优,则
- A 非奇异
- Jacobi 迭代法对任意初始向量收敛
- Gauss-Seidel 迭代法对任意初始向量收敛
不可约对角占优矩阵非奇异性证明
反设 A 奇异,则存在非零向量 x 使 Ax=0。
设 ∣xk∣=max1≤j≤n∣xj∣>0,考虑第 k 个方程:
j=1∑nakjxj=0⟹akkxk=−j=k∑akjxj
从而:
∣akk∣∣xk∣=j=k∑akjxj≤j=k∑∣akj∣∣xj∣≤j=k∑∣akj∣∣xk∣
由对角占优 ∣akk∣≥∑j=k∣akj∣,上式等号成立,故
∣xj∣=∣xk∣ 对所有满足 akj=0 的 j 成立。
令指标集 S={i:∣xi∣=∣xk∣},也即所有最大指标。
从而若 i∈S 且 aij=0,则可在前述推导中令 k→i 即得 ∣xi∣=∣xj∣,也即 j∈S。
若 S 不是全集,则 S 与其补集 T 满足 aij=0 对所有 i∈S,j∈T 成立,与不可约性矛盾!
若 S 是全集,则所有行必须满足等号,与 ∣akk∣≥∑j=k∣akj∣ 至少一个严格不等式矛盾!
不可约对角占优矩阵 Jacobi 迭代收敛性证明
反证法证明 ρ(MJ)<1。反设 λ 为 MJ 的特征值 且 ∣λ∣≥1。则:
det(λD+L+U)=0
令 C(λ)=λD+L+U,其元素为:
cij={λaii,aij,i=ji=j
容易发现 C(λ) 仍是不可约对角占优矩阵。故其非奇异,与 det(C(λ))=0 矛盾!
不可约对角占优矩阵 Gauss-Seidel 迭代收敛性证明
反证法证明 ρ(MGS)<1。反设 λ 为 MGS 特征值且 ∣λ∣≥1。则:
det(λ(D+L)+U)=0
令 B(λ)=λD+λL+U。其元素为:
bij=⎩⎨⎧λaii,λaij,aij,i=ji>ji<j
容易发现 B(λ) 仍是不可约对角占优矩阵。故其非奇异,与 det(B(λ))=0 矛盾!
方法对比与总结
| 特性 | Jacobi | Gauss-Seidel | SOR |
|---|
| 更新方式 | 同步(并行友好) | 异步(串行) | 异步(串行) |
| 存储需求 | 需存储两个向量 | 可原位存储 | 可原位存储 |
| 收敛速度 | 慢 | 中等 | 可调(可能最快) |
| 适用场景 | 并行计算 | 通用 | 已知近似最优 ω |