分块矩阵的广义极小残差算法(FGMRES)在求解多重右端项非对称线性方程组中的应用
1. 题目描述
考虑求解如下形式的多重右端项线性方程组:
\[A X = B \]
其中:
- \(A\) 是一个 \(n \times n\) 的非对称稀疏(或稠密)矩阵,可能为非正定或病态。
- \(B = [b^{(1)}, b^{(2)}, \dots, b^{(p)}]\) 是 \(n \times p\) 的右端项矩阵,包含 \(p\) 个右端向量。
- \(X = [x^{(1)}, x^{(2)}, \dots, x^{(p)}]\) 是 \(n \times p\) 的解矩阵,我们需要高效地同时求解 \(p\) 个线性方程组:
\[ A x^{(k)} = b^{(k)}, \quad k = 1, 2, \dots, p. \]
核心挑战:当 \(p\) 较大时,如果对每个右端项独立调用标准GMRES算法,会重复执行大量相同矩阵 \(A\) 的矩阵-向量乘法,计算成本很高。我们需要一种能重用Krylov子空间信息的方法,以加速整体求解过程。灵活广义极小残差法(FGMRES)通过允许每次迭代使用不同的预处理子,能够更灵活地应对多重右端项问题,特别是当右端项存在某种相关性时。
2. 核心思想
标准GMRES通过构造Krylov子空间 \(\mathcal{K}_m(A, r_0) = \text{span}\{r_0, A r_0, \dots, A^{m-1} r_0\}\) 来逼近解,其中 \(r_0 = b - A x_0\) 是初始残差。对于多重右端项,我们可以:
- 顺序求解,但重用之前构造的部分Krylov子空间基向量,以“热启动”后续求解。
- 使用块Krylov子空间方法,一次性生成包含所有右端项的块Krylov子空间,但该方法在 \(p\) 较大时子空间维数增长过快。
- 采用循环或回收策略的FGMRES,在求解每个右端项时,允许动态调整预处理子,并可能复用前一个右端项已构造的部分正交基,从而减少总迭代次数。
FGMRES的核心特点:
- 是GMRES的变体,其预处理操作可以是可变的(即预处理矩阵 \(M_j\) 可以随迭代步 \(j\) 变化)。
- 对于多重右端项,我们可以在求解不同右端项时,采用不同的预处理策略,或者逐步更新预处理子以逼近 \(A^{-1}\) 的某种低秩近似。
- 在顺序求解中,可将上一个系统的解向量或最终的Krylov子空间作为下一个系统的初始猜测或预处理子的一部分,从而加速收敛。
3. 算法步骤与推导
我们以顺序求解 \(p\) 个右端项为例,对每个 \(k = 1, \dots, p\) 使用FGMRES,并尝试利用之前求解的信息。
步骤1:初始化全局参数
- 设定最大重启次数 \(m_{\max}\)(每个FGMRES循环的最大子空间维数)。
- 设定容差 \(\tau\) 和最大迭代步数。
- 可选择一个初始预处理子 \(M_1^{-1}\)(例如,基于 \(A\) 的不完全LU分解)。
步骤2:顺序求解每个右端项
对第 \(k\) 个右端项 \(b^{(k)}\):
-
设置初始猜测:
- 如果 \(k = 1\),取 \(x_0^{(1)} = 0\) 或任意猜测。
- 如果 \(k > 1\),可利用前面已求得的解,例如 \(x_0^{(k)} = x^{(k-1)}\) 或更复杂的插值。
- 计算初始残差:\(r_0^{(k)} = b^{(k)} - A x_0^{(k)}\)。
-
运行FGMRES(\(m_{\max}\)):
- 与标准GMRES类似,构建Krylov子空间 \(\mathcal{K}_{m}(A, r_0^{(k)})\),但允许每一步使用不同的预处理子 \(M_j^{-1}\)。
- Arnoldi过程(可变预处理):
a. 令 \(v_1 = r_0^{(k)} / \| r_0^{(k)} \|_2\)。
b. 对 \(j = 1, 2, \dots, m\):- 计算 \(z_j = M_j^{-1} v_j\)(应用当前步的预处理)。
- 计算 \(w = A z_j\)。
- 对 \(i = 1, \dots, j\):
\[ h_{i,j} = (w, v_i) \]
\[ w = w - h_{i,j} v_i \]
- 令 $ h_{j+1,j} = \| w \|_2 $,若 $ h_{j+1,j} = 0 $ 则提前终止。
- 令 $ v_{j+1} = w / h_{j+1,j} $。
c. 得到正交基矩阵 $ V_m = [v_1, \dots, v_m] $ 和上Hessenberg矩阵 $ \bar{H}_m \in \mathbb{R}^{(m+1) \times m} $。
- 最小二乘求解:
寻找 \(y_m \in \mathbb{R}^m\) 使得
\[ \| \beta e_1 - \bar{H}_m y_m \|_2 \]
最小,其中 $ \beta = \| r_0^{(k)} \|_2 $,$ e_1 = [1, 0, \dots, 0]^T \in \mathbb{R}^{m+1} $。
- 更新近似解:
\[ x_m^{(k)} = x_0^{(k)} + Z_m y_m, \quad Z_m = [z_1, \dots, z_m] \]
(注意:$ z_j $ 是预处理后的向量,因此解是 $ z_j $ 的组合)。
- 如果残差已满足 \(\| b^{(k)} - A x_m^{(k)} \|_2 < \tau\),则接受解并进入下一个右端项;否则,重启或增加 \(m\)。
- 为下一个右端项更新预处理子:
- 在完成第 \(k\) 个系统后,可基于已构造的Krylov子空间 \(V_m\) 和矩阵 \(H_m\) 更新预处理子 \(M^{-1}\)。
- 一种简单策略:用已求得的解 \(x^{(k)}\) 对应的Krylov子空间构造一个低秩近似预处理子。例如,设 \(P_k = V_m (H_m)^{-1} V_m^T\),并令 \(M_{k+1}^{-1} = P_k + M_0^{-1}\)(其中 \(M_0^{-1}\) 是基础预处理子)。
- 更实用的方法是:将前几个右端项求解过程中的 \(Z_m\) 和 \(V_m\) 部分保存,用于构造后续系统的初始猜测或右预处理子。
步骤3:整体加速技巧
- 循环/回收FGMRES:在达到最大子空间维数 \(m_{\max}\) 后,不丢弃所有基向量,而是保留部分“最优”基向量,用于下一个右端项的初始子空间构造。
- 近似逆预处理更新:利用Sherman-Morrison-Woodbury公式,基于前一个系统的Krylov子空间信息,更新预处理矩阵的近似逆。
4. 算法优势与适用场景
-
优势:
- 预处理灵活性:可针对每个右端项或迭代步调整预处理,适应矩阵 \(A\) 的不同频谱区域。
- 信息重用:通过顺序求解和预处理更新,可减少总迭代步数。
- 内存可控:通过重启机制控制内存使用,适合大规模问题。
-
适用场景:
- 右端项 \(b^{(k)}\) 之间存在相关性(例如,随时间步变化的右端项)。
- 矩阵 \(A\) 为非对称、非正定,且标准GMRES收敛较慢,需动态调整预处理。
- 系统需要求解多个右端项,但预处理构造成本较高,希望分摊成本。
5. 注意事项与扩展
- 预处理子的更新策略是影响效率的关键。过于频繁的更新会增加计算开销,需权衡更新频率与收敛加速。
- 如果右端项之间差异很大,信息重用的效果可能有限,此时可考虑块Krylov方法(如块GMRES)或独立求解。
- FGMRES的收敛理论较复杂,因为预处理可变,标准GMRES的最优性性质不再严格保持,但在实践中常表现稳健。
总结:分块矩阵的FGMRES算法通过顺序求解多重右端项,并利用可变预处理和Krylov子空间信息重用,在非对称线性方程组的求解中提供了灵活且高效的策略。其核心在于动态调整预处理和循环使用基向量,从而在多个右端项间分摊计算成本,加速整体求解过程。