分块矩阵的预处理对称超松弛迭代法(PSOR)解多重右端项线性方程组
1. 问题描述
在科学计算中,我们经常遇到需要求解具有相同系数矩阵但不同右端项的线性方程组组,这被称为多重右端项线性方程组。这类问题可以形式化地表示为:
给定一个大型的、可能是稀疏的、非奇异的系数矩阵 \(A \in \mathbb{R}^{n \times n}\),和一组右端向量 \(b^{(1)}, b^{(2)}, \dots, b^{(k)} \in \mathbb{R}^{n}\),我们需要求解 \(k\) 个线性方程组:
\[A x^{(j)} = b^{(j)}, \quad j = 1, 2, \dots, k \]
其中 \(x^{(j)}\) 是第 \(j\) 个方程组的解向量。
当矩阵 \(A\) 很大且稀疏,并且是对称正定或对称且对角占优时,迭代法(如高斯-赛德尔迭代法)通常是比直接法(如LU分解)更优的选择,因为它们能更有效地利用稀疏性,且内存开销更低。然而,对于对称矩阵,标准的高斯-赛德尔(Gauss-Seidel, GS)迭代收敛速度可能不够快。对称超松弛迭代法(Symmetric Successive Over-Relaxation, SSOR)是对GS迭代的一种加速和对称化改进,可以提高收敛速度。当 \(A\) 的条件数不佳时,收敛速度可能依然很慢。此时,引入预处理技术来改善系数矩阵的条件数是关键。本问题旨在结合分块矩阵结构、SSOR迭代以及预处理思想,构建一个高效求解对称多重右端项线性方程组的算法。
2. 算法背景知识
- 多重右端项问题:可以同时或依次求解,但利用矩阵结构(如分块)和迭代法的性质,可以设计更高效的算法,例如,用同一个预处理子处理所有方程组,或者将第一个方程组的解信息用作后续方程组的初始猜测。
- 分块矩阵:将大型矩阵 \(A\) 划分为更小的子矩阵(块),便于利用内存局部性,进行并行计算,或针对特定块结构(如对角块、三对角块)设计高效算法。我们假设 \(A\) 被划分为 \(p \times p\) 块,\(A = [A_{ij}]\),其中 \(A_{ij} \in \mathbb{R}^{n_i \times n_j}\),且 \(\sum_{i=1}^{p} n_i = n\)。
- 对称超松弛迭代法(SSOR):它是GS迭代的对称化加速版本。设 \(A = D - L - L^T\),其中 \(D\) 是 \(A\) 的对角部分(正定),\(-L\) 是严格下三角部分。GS迭代的松弛形式(SOR)为:
\[ x^{(m+1)} = (D - \omega L)^{-1}[\omega b + ((1-\omega)D + \omega L^T) x^{(m)}] \]
其中 $ \omega $ 是松弛因子($ 0 < \omega < 2 $ 以保证收敛)。SSOR先执行一次前向SOR迭代,再执行一次后向SOR迭代,使其对称,迭代格式为:
\[ \begin{aligned} x^{(m+\frac{1}{2})} &= (D - \omega L)^{-1}[\omega b + ((1-\omega)D + \omega L^T) x^{(m)}] \\ x^{(m+1)} &= (D - \omega L^T)^{-1}[\omega b + ((1-\omega)D + \omega L) x^{(m+\frac{1}{2})}] \end{aligned} \]
- 预处理思想:用一个“近似”于 \(A^{-1}\) 的矩阵 \(P^{-1}\) 去左乘原方程,得到等效的预处理系统 \(P^{-1} A x = P^{-1} b\),希望 \(P^{-1}A\) 的条件数更小,从而加速迭代收敛。一个好的预处理子 \(P\) 应该满足:(1) \(P \approx A\);(2) 求解 \(P z = r\) (其中 \(r\) 是残差)代价小。SSOR迭代本身就可以构造一个天然的预处理子:\(P_{SSOR} = \frac{1}{\omega(2-\omega)} (D - \omega L) D^{-1} (D - \omega L)^T\)。
3. 算法步骤详解:分块预处理对称超松弛迭代法
我们的目标是为对称矩阵 \(A\) 设计一个结合了分块、预处理和SSOR的高效迭代求解器。以下是算法的构建步骤:
步骤1:矩阵分块与分解
- 将对称矩阵 \(A\) 按行列划分为 \(p \times p\) 块。记 \(A = [A_{ij}]\)。
- 写出 \(A\) 的块分裂形式:\(A = D_A - L_A - L_A^T\),其中:
- \(D_A\) 是 \(A\) 的块对角部分,即 \(D_A = \text{blkdiag}(A_{11}, A_{22}, \dots, A_{pp})\)。
- \(-L_A\) 是 \(A\) 的严格块下三角部分(即主对角块以下的块矩阵部分)。
- 由于 \(A\) 对称,严格块上三角部分为 \(-L_A^T\)。
步骤2:构造分块SSOR预处理子
- 选择一个松弛因子 \(\omega\),通常 \(0 < \omega < 2\)。最优 \(\omega\) 的理论值依赖于矩阵谱半径,实践中常通过试验确定。
- 定义分块SSOR预处理子 \(P\):
\[ P = \frac{1}{\omega(2-\omega)} (D_A - \omega L_A) D_A^{-1} (D_A - \omega L_A)^T \]
* $ D_A $ 是块对角矩阵,其逆 $ D_A^{-1} = \text{blkdiag}(A_{11}^{-1}, A_{22}^{-1}, \dots, A_{pp}^{-1}) $。注意,这要求每个对角块 $ A_{ii} $ 自身可逆。在实际中,$ A_{ii}^{-1} $ 可能不显式计算,而是求解以 $ A_{ii} $ 为系数矩阵的小型线性方程组。
* 这个 $ P $ 是对称正定的(如果 $ A $ 对称正定且 $ 0<\omega<2 $),并且是 $ A $ 的一个近似。
步骤3:应用预处理子求解
对于我们要解的系统 \(A x = b\)(这里 \(b\) 可以是任意一个右端项 \(b^{(j)}\)),预处理步骤是:求解 \(P z = r\),其中 \(r = b - A x\) 是当前迭代的残差,\(z\) 是预处理后的残差(或搜索方向)。由于 \(P\) 有特殊结构,求解 \(P z = r\) 可以通过两次块前向/后向代换高效完成:
\[P z = r \quad \Rightarrow \quad (D_A - \omega L_A) D_A^{-1} (D_A - \omega L_A)^T z = \omega(2-\omega) r \]
令 \(y = (D_A - \omega L_A)^T z\),求解过程分解为:
- 解下三角块方程组:\((D_A - \omega L_A) t = \omega(2-\omega) r\),得到 \(t\)。
- 解对角块方程组:\(D_A y = t\)。
- 解上三角块方程组:\((D_A - \omega L_A)^T z = y\),得到 \(z\)。
步骤4:嵌入到迭代框架中
预处理子 \(P\) 可以作为任何基于残差的迭代法(如最速下降法、共轭梯度法CG、极小残差法MINRES等)的加速器。由于我们处理的是对称矩阵,预处理共轭梯度法(PCG) 是一个经典且高效的选择,前提是 \(A\) 和 \(P\) 对称正定。结合我们的分块SSOR预处理子,算法流程如下:
对于第 \(j\) 个右端项 \(b^{(j)}\):
- 初始化:给定初始猜测解 \(x_0^{(j)}\),计算初始残差 \(r_0^{(j)} = b^{(j)} - A x_0^{(j)}\),应用预处理 \(P z_0^{(j)} = r_0^{(j)}\) 得到 \(z_0^{(j)}\),设初始搜索方向 \(p_0^{(j)} = z_0^{(j)}\)。
- 迭代:对于 \(k=0,1,2,\dots\) 直到收敛(如 \(\| r_k^{(j)} \| / \| b^{(j)} \| < \text{tol}\)):
a. 计算矩阵向量积:\(\alpha_k = (r_k^{(j)}, z_k^{(j)}) / (p_k^{(j)}, A p_k^{(j)})\)。
b. 更新解:\(x_{k+1}^{(j)} = x_k^{(j)} + \alpha_k p_k^{(j)}\)。
c. 更新残差:\(r_{k+1}^{(j)} = r_k^{(j)} - \alpha_k A p_k^{(j)}\)。
d. 检查收敛:如果满足条件,则终止。
e. 应用预处理:求解 \(P z_{k+1}^{(j)} = r_{k+1}^{(j)}\) 得到 \(z_{k+1}^{(j)}\)。
f. 计算系数:\(\beta_k = (r_{k+1}^{(j)}, z_{k+1}^{(j)}) / (r_k^{(j)}, z_k^{(j)})\)。
g. 更新搜索方向:\(p_{k+1}^{(j)} = z_{k+1}^{(j)} + \beta_k p_k^{(j)}\)。
步骤5:处理多重右端项的优化
由于所有方程组共享相同的系数矩阵 \(A\) 和预处理子 \(P\),我们可以进行以下优化:
- 批量矩阵向量积:在PCG迭代中,计算 \(A p_k^{(j)}\) 是主要开销之一。由于 \(A\) 相同,可以同时计算多个右端项对应的矩阵向量积,这有利于利用缓存和并行计算。
- 重用预处理子分解:预处理子 \(P\) 的构造(特别是涉及 \(D_A^{-1}\) 的部分,即求解以 \(A_{ii}\) 为系数的小型方程组)只需要进行一次。在求解所有 \(k\) 个方程组时,重复使用 \(P\) 的分解因子,节省大量计算。
- 信息重用(可选):求解完前一个方程组得到的解 \(x^{(j-1)}\) 或相关的Krylov子空间信息,可以作为下一个方程组 \(A x^{(j)} = b^{(j)}\) 的初始猜测或用于构建一个更好的初始搜索空间(这属于更高级的“循环”或“回收”Krylov子空间技术,本基础算法暂不涉及)。
4. 算法特点与总结
- 核心思想:将对称超松弛迭代(SSOR)的思想转化为一个对称正定的预处理子 \(P\),并将其与高效的共轭梯度法(CG)结合,形成预处理共轭梯度法(PCG)。
- 分块优势:通过分块,预处理步骤(求解 \(P z = r\))中的三角方程组求解变成了块三角方程组求解。如果对角块 \(A_{ii}\) 本身具有简单结构(如三对角、带状),可以高效求解,甚至并行求解每个块对应的子系统。
- 适用性:该算法主要适用于对称正定或对称且特征值正的矩阵。对于非对称矩阵,SSOR预处理子不适用,但可以考虑其非对称版本SOR作为预处理子,并配合GMRES等迭代法。
- 参数选择:松弛因子 \(\omega\) 的选择影响预处理效果。\(\omega=1\) 时,\(P\) 退化为对称高斯-赛德尔(SGS)预处理子。最优 \(\omega\) 通常需要通过数值实验或基于矩阵性质的估计来确定。
- 多重右端项效率:通过共享矩阵 \(A\)、预处理子 \(P\) 以及可能的批量计算,显著提高了求解多个方程组的整体效率。
这个算法巧妙地将经典的迭代加速思想(SOR)、预处理技术、以及针对多重右端项和分块矩阵的计算优化结合在一起,是求解大规模稀疏对称线性方程组组的一个实用且强大的工具。