稀疏矩阵的块不完全LDLᵀ分解在对称不定线性方程组求解中的应用
1. 问题描述
我们考虑求解一个大规模稀疏的对称不定线性方程组:
\[A x = b \]
其中,系数矩阵 \(A \in \mathbb{R}^{n \times n}\) 是对称的,但它既不正定,也不负定(即其特征值既有正数又有负数)。在科学计算中,这类问题广泛出现于约束优化、计算流体力学、结构力学等领域。由于矩阵规模大且稀疏,直接解法(如稠密Cholesky分解)会因内存和计算量过大而不适用。因此,我们通常采用迭代法(如MINRES)并结合高效的预条件子来加速收敛。
本题目旨在探讨一种针对对称不定稀疏矩阵的有效预条件技术:块不完全LDLᵀ分解。我们将深入讲解其核心思想、具体构造步骤、数值实现细节以及在求解对称不定方程组中的作用。
2. 基础背景
2.1 对称不定矩阵
- 一个实对称矩阵 \(A\) 若其特征值既有正也有负,则称为对称不定的。
- 其所有顺序主子式不一定为正,因此标准的Cholesky分解(\(A = LL^T\))可能不存在或数值不稳定。
2.2 为什么需要特殊预条件子?
对于对称正定矩阵,共轭梯度法(CG)结合不完全Cholesky预条件子非常高效。但对于对称不定矩阵:
- CG方法不能直接使用(要求矩阵正定)。
- 常用迭代法如MINRES(最小残差法)适用于对称不定问题,但它需要一个对称正定的预条件子才能保持算法的对称性。
- 简单的不完全LU预条件子(ILU)产生非对称因子,会破坏原问题的对称性,使得MINRES不能直接应用。
因此,我们需要一种能保持对称性的不完全分解方法——这就是不完全LDLᵀ分解。
2.3 完全LDLᵀ分解
对于对称矩阵 \(A\),如果其所有顺序主子式非零,则存在唯一的分解:
\[A = L D L^T \]
其中 \(L\) 是单位下三角矩阵(对角元为1),\(D\) 是对角矩阵(对角元可为正或负)。这可以看作是对称版本的LU分解(\(A = LU\) 中 \(U = D L^T\)),避免了平方根运算(对比Cholesky)。
3. 块不完全LDLᵀ分解的核心思想
为了处理稀疏矩阵,我们希望得到一个稀疏近似分解:
\[A \approx \tilde{L} \tilde{D} \tilde{L}^T \]
其中 \(\tilde{L}\) 是稀疏的单位下三角矩阵,\(\tilde{D}\) 是稀疏对角矩阵(更常见的是块对角矩阵)。这个分解将用作预条件子 \(M = \tilde{L} \tilde{D} \tilde{L}^T\),然后在迭代法中求解 \(M^{-1} A x = M^{-1} b\)。
为了控制分解的稀疏性,我们引入一个“丢弃策略”:在分解过程中,丢弃那些“不重要”的非零元(例如,小于某个阈值的元),或者只保留与原始矩阵稀疏结构匹配的非零元。
4. 算法步骤详解
我们以基于填充等级(level of fill)的丢弃策略为例,详细讲解块不完全LDLᵀ分解(BILDL^T) 的计算过程。为了简单,我们假设矩阵 \(A\) 已经进行了适当的重排序(例如,使用嵌套剖分或最小度排序)以减少填充。
步骤1:符号分析与初始化
- 输入:稀疏对称矩阵 \(A\)(通常存储为压缩稀疏行格式CSR或压缩稀疏列格式CSC),最大填充等级 \(l_{\max}\)(例如 \(l_{\max} = 1\) 或 2)。
- 初始化:创建矩阵 \(\tilde{L}\) 和 \(\tilde{D}\) 的数据结构。初始时,\(\tilde{L}\) 的稀疏模式设定为 \(A\) 的下三角部分(不包括对角)的模式,但每个非零元关联一个填充等级(初始时,原始非零元等级为0,新产生的元等级基于规则更新)。
- \(\tilde{D}\) 可以是标量对角矩阵,但更常见的是块对角。我们将矩阵按行/列划分为若干连续的块(block),在分解过程中以块为单位进行操作,这能更好地利用现代处理器的缓存和并行能力。
步骤2:按块进行分解
假设矩阵被划分为 \(k\) 个块,大小为 \(n_1, n_2, \dots, n_k\)。
对于块索引 \(j = 1\) 到 \(k\):
-
提取当前块列:考虑当前正在处理第 \(j\) 块。将 \(\tilde{L}\) 和 \(\tilde{D}\) 中对应前 \(j-1\) 块的部分看作已经计算好的因子。
-
计算块Schur补:
设当前块对应的矩阵部分为:
\[ A_{jj} = \begin{pmatrix} A_{11} & A_{21}^T \\ A_{21} & A_{22} \end{pmatrix} \quad \text{(在块视角下)} \]
实际上,我们按如下方式更新:
- 用前 \(j-1\) 块的因子更新当前块列:
对当前块列进行前代运算,更新 \(A_{j:}\)(第 \(j\) 块及以下部分)以反映之前已分解块的影响,得到一个临时矩阵 \(S\)(即部分Schur补)。
-
处理当前块的 \(\tilde{D}_j\):
- 从更新后的 \(S\) 中提取第 \(j\) 块的对角部分,记为 \(\hat{A}_{jj}\)。
- 为了保持稳定性,可能需要对 \(\hat{A}_{jj}\) 进行块对角 pivoting(例如,使用1x1或2x2 pivot),以确保 \(\tilde{D}_j\) 是可逆且数值稳定的。
- 最终确定 \(\tilde{D}_j\)(一个 \(n_j \times n_j\) 的小矩阵块)和相应的 pivot 交换信息。
-
计算当前块的 \(\tilde{L}_{ij}\):
- 对于第 \(j\) 块以下的每个块 \(i > j\),从更新后的 \(S\) 中提取块 \(A_{ij}\)。
- 解方程:
\[ \tilde{L}_{ij} \tilde{D}_j = A_{ij} \]
得到 $ \tilde{L}_{ij} $(这是一个稠密小矩阵或稀疏矩阵,取决于结构)。
- 应用丢弃策略:对 \(\tilde{L}_{ij}\) 中的每个元素,根据其“填充等级”决定是否保留。
填充等级的计算规则:
如果元素是通过更新产生的(即原始 \(A\) 中对应位置为零),则其等级 = \(lev_{parent1} + lev_{parent2} + 1\),其中 parents 指产生该元素的乘加运算涉及的两个元素的等级。
若等级 > \(l_{\max}\),则丢弃(置为零)。
- 更新剩余部分:
- 用新计算的 \(\tilde{L}_{ij}\) 和 \(\tilde{D}_j\) 更新后续尚未处理的矩阵部分(即Schur补的更新):
\[ A_{rs} \leftarrow A_{rs} - \tilde{L}_{rj} \tilde{D}_j \tilde{L}_{sj}^T, \quad \text{for } r, s > j \]
同样,在更新过程中对产生的非零元应用填充等级丢弃策略。
步骤3:构建预条件子
分解完成后,我们得到:
\[M = \tilde{L} \tilde{D} \tilde{L}^T \]
其中 \(\tilde{L}\) 是块单位下三角矩阵,\(\tilde{D}\) 是块对角矩阵(可能包含1x1或2x2的块以适应不定性)。
5. 在求解中的应用
以MINRES算法为例,预条件对称不定方程 \(A x = b\) 的步骤如下:
- 预处理变换:
由于 \(M\) 对称但不定,不能直接作为正定预条件子。但我们可以应用对称预处理:
将原方程转换为
\[ ( \tilde{L}^{-1} A \tilde{L}^{-T} ) (\tilde{L}^T x) = \tilde{L}^{-1} b \]
中间矩阵 \(\tilde{L}^{-1} A \tilde{L}^{-T}\) 仍对称,且通常比 \(A\) 条件更好。
-
实际上,MINRES算法要求预条件子正定。为了处理不定 \(M\),一种常用方法是:
- 对 \(M\) 进行调整:在分解过程中对 \(\tilde{D}\) 的小块进行扰动,确保 \(\tilde{D}\) 是正定的(例如,将负特征值替换为小的正数)。
- 或使用块对角缩放,使预处理后的矩阵更接近单位矩阵。
-
迭代求解:
在MINRES的每一步,需要计算 \(M^{-1} v\)(对向量 \(v\) 的作用)。由于 \(M = \tilde{L} \tilde{D} \tilde{L}^T\),这可以通过三步完成:- 前代:解 \(\tilde{L} y = v\) (稀疏前代)
- 对角缩放:解 \(\tilde{D} z = y\) (由于 \(\tilde{D}\) 块对角,这是并行的)
- 回代:解 \(\tilde{L}^T w = z\) (稀疏回代)
结果 \(w = M^{-1} v\) 用于MINRES的迭代更新。
6. 关键细节与优化
- 稳定性:对称不定分解需要谨慎处理小 pivot 或负 pivot。通常采用Bunch-Kaufman或Bunch-Parlett pivoting(在块级别),在 \(\tilde{D}\) 中允许1x1和2x2块,以维持数值稳定性而不破坏稀疏性过多。
- 并行性:块结构天然支持并行。不同块的 Schur 补更新可以并行计算,尤其是当使用图划分技术(如嵌套剖分)对矩阵分块时。
- 内存控制:通过调节 \(l_{\max}\),可以在分解精度和稀疏性之间折衷。\(l_{\max} = 0\) 对应于零填充不完全分解(仅保留与 \(A\) 结构相同的非零元),速度快但可能效果差;\(l_{\max} = 1\) 或 2 通常能显著改善预条件效果而不过度增加填充。
- 与直接法的关系:当 \(l_{\max}\) 足够大且不丢弃任何元时,算法退化为完全块LDLᵀ分解,适合作为稀疏直接求解器(如MA57的核心)。作为预条件子,我们追求的是快速近似。
7. 总结
稀疏对称不定线性方程组在许多应用中至关重要。块不完全LDLᵀ分解提供了一种高效构造对称预条件子的方法,通过:
- 块分解提升计算效率;
- 填充等级控制保证稀疏性;
- 块对角 pivoting确保数值稳定性;
- 与MINRES等迭代法结合,有效求解大规模问题。
该算法在科学与工程计算软件库(如HSL库、MUMPS、PARDISO)中有成熟实现,是处理对称不定问题的核心工具之一。