GMRES算法解非对称线性方程组
题目描述
给定一个大型稀疏非对称线性方程组 Ax = b,其中 A 是 n×n 的非对称矩阵,b 是 n 维向量。请使用广义最小残量(GMRES)算法求解未知向量 x。该算法特别适用于系数矩阵 A 非对称且可能非正定的情况。
解题过程
GMRES 算法的核心思想是在一个不断扩大的 Krylov 子空间中,寻找一个向量,使得其对应的残差范数最小。这个过程可以循序渐进地理解。
第一步:问题转化与核心思想
- 初始猜测:我们从解的一个初始猜测 \(x_0\) 开始(例如,可以设为零向量)。
- 初始残差:计算初始残差 \(r_0 = b - A x_0\)。我们的目标是让这个残差趋近于零。
- Krylov 子空间:GMRES 算法在第 m 步迭代时,在如下的 Krylov 子空间中寻找近似解:
\[ x_m \in x_0 + \mathcal{K}_m(A, r_0) = x_0 + \text{span}\{ r_0, A r_0, A^2 r_0, \dots, A^{m-1} r_0 \} \]
这意味着,近似解 $ x_m $ 等于初始猜测 $ x_0 $ 加上一个由初始残差和矩阵 A 的幂次张成的空间中的一个向量。
- 最小残差准则:在所有的 \(x_m\) 中,GMRES 选择那个使得 2-范数 \(\| b - A x_m \|_2\) 最小的一个。这等价于在 Krylov 子空间中最小化残差。
第二步:构建正交基(Arnoldi 过程)
直接在 Krylov 子空间中进行最小化计算上是不稳定的。因此,GMRES 使用 Arnoldi 迭代过程为该子空间构建一组标准正交基 \(\{v_1, v_2, \dots, v_m\}\),其中 \(v_1 = r_0 / \| r_0 \|_2\)。
-
初始化:
- 计算初始残差:\(r_0 = b - A x_0\)
- 计算第一个基向量:\(v_1 = r_0 / \beta\),其中 \(\beta = \| r_0 \|_2\)
-
迭代构建(对于 j = 1 到 m):
- 矩阵向量乘法:计算 \(w = A v_j\)。
- 正交化:对于 i = 1 到 j,计算 \(h_{i,j} = (w, v_i)\)(即 w 与所有已有基向量 \(v_i\) 的内积),然后从 w 中减去这些分量:\(w = w - h_{i,j} v_i\)。
- 这一步确保了新向量 w 与之前所有的 \(v_i\) 正交。
- 归一化:计算 \(h_{j+1, j} = \| w \|_2\)。如果 \(h_{j+1, j}\) 接近于 0,则算法提前终止。否则,新的基向量为 \(v_{j+1} = w / h_{j+1, j}\)。
- 经过 j 步后,我们得到了一个标准正交向量组 \(V_m = [v_1, v_2, \dots, v_m]\)(一个 n×m 矩阵)。
第三步:将原问题投影到小规模问题上
Arnoldi 过程产生了一个关键关系:
\[A V_m = V_{m+1} \tilde{H}_m \]
其中 \(V_{m+1} = [v_1, v_2, \dots, v_m, v_{m+1}]\) 是 n×(m+1) 矩阵,\(\tilde{H}_m\) 是一个 (m+1)×m 的上 Hessenberg 矩阵(除了主对角线和次对角线,其他下方元素均为零),其元素就是 Arnoldi 过程中计算的 \(h_{i,j}\)。
现在,我们在 Krylov 子空间中寻找近似解 \(x_m = x_0 + V_m y\),其中 \(y\) 是一个 m 维向量。我们的最小化问题变为:
\[\min_{x_m \in x_0 + \mathcal{K}_m} \| b - A x_m \|_2 = \min_{y \in \mathbb{R}^m} \| b - A(x_0 + V_m y) \|_2 = \min_{y \in \mathbb{R}^m} \| r_0 - A V_m y \|_2 \]
利用 \(r_0 = \beta v_1 = V_{m+1} (\beta e_1)\)(其中 \(e_1 = [1, 0, ..., 0]^T\) 是 m+1 维单位向量)和 \(A V_m = V_{m+1} \tilde{H}_m\),上式可转化为:
\[\| r_0 - A V_m y \|_2 = \| V_{m+1} (\beta e_1) - V_{m+1} \tilde{H}_m y \|_2 = \| V_{m+1} (\beta e_1 - \tilde{H}_m y) \|_2 \]
因为 \(V_{m+1}\) 的列是标准正交的,乘以它不改变向量的 2-范数。所以最小化问题最终简化为一个非常小规模的问题:
\[\min_{y \in \mathbb{R}^m} \| \beta e_1 - \tilde{H}_m y \|_2 \]
第四步:求解最小二乘问题与得到近似解
- 问题规模缩减:我们现在只需要求解一个 (m+1)×m 维的最小二乘问题 \(\tilde{H}_m y \approx \beta e_1\),其中 m 远小于原始问题的维度 n。这通常通过 QR 分解(例如 Givens 旋转)高效完成。
- 求解 y:对矩阵 \(\tilde{H}_m\) 进行 QR 分解:\(\tilde{H}_m = Q_m R_m\),其中 \(Q_m\) 是 (m+1)×(m+1) 正交矩阵,\(R_m\) 是 (m+1)×m 的上三角矩阵(最后一行全为零)。最小二乘解 \(y_m\) 可以通过求解 \(R_m y = Q_m^T (\beta e_1)\) 的前 m 行得到。
- 计算近似解:得到 \(y_m\) 后,我们就可以计算出第 m 步的近似解:\(x_m = x_0 + V_m y_m\)。
- 检查收敛:计算当前残差范数 \(\| r_m \|_2 = \| b - A x_m \|_2\)。这个值在求解最小二乘问题的过程中很容易得到,它等于 \(| \rho_{m+1} |\),即化简后问题中残差向量的最后一个分量的绝对值。如果 \(\| r_m \|_2\) 小于预设的容忍度,则算法终止,输出 \(x_m\) 作为解。否则,m 增加 1,继续 Arnoldi 过程,扩展 Krylov 子空间。
总结
GMRES 算法通过 Arnoldi 过程将大规模非对称问题巧妙地投影到一个不断扩大的低维 Krylov 子空间上,并在该子空间中解决一个最小残差问题。其优势在于无需存储庞大的矩阵 A(只需矩阵向量乘法),并且能有效处理非对称问题。其主要开销在于基向量的存储和正交化过程,当迭代步数很大时,可以通过重启策略(GMRES(m))来管理内存。