一、介绍
直接法的基础是矩阵的分解,常见的分解形式有LU分解、Cholesky分解、LDL分解等。
直接法通过将A矩阵分解成两个或多个因子的乘积,使得原方程组转化为若干个较容易求解的子问题。例如LU分解A=LU,其中L是单位下三角矩阵,U是上三角矩阵。原方程转化为LUx=b,可以通过依次求解Ly=b和Ux=y两个三角方程组来得到原方程的解。
稀疏线性方程组的两类常见直接求解算法分别为超节点(Supernodal)方法和多波前(Multifrontal)法,其主要思想是将完整的稀疏矩阵的分解任务转化成许多个相对稠密的子矩阵的分解任务,任务间的依赖关系由消去树(Elimination tree)或其他类似的数据结构来确定。
超节点:人们在求解实际大型稀疏矩阵时,发现L因子中大量存在一种特殊结构——连续若干列(L的列或U的行),它们对角块以下的非零元结构是一样的,我们说这些列形成了一个超节点。通过在对角块的上三角部分人为补零,可以使一个超节点的元素在内存中形成一个稠密矩阵。分解时可以利用稠密矩阵操作来提高计算效率。
图: Four possible types of unsymmetric supernodes.
二、超节点解法的步骤
1. 分析(Analyze)
1. Matching重排
- 过程:
- 通过图论中的匹配算法(如最大匹配)对稀疏矩阵的非零元素进行重排,以减少后续分解过程中产生的填充(fill-in)元素。
- 作用:
- 减少填充元素的数量,提高数值分解的稀疏性,从而降低存储需求和计算复杂度。
2. Fill-in reducing重排(Ordering)
- 过程:
- 在确定了匹配后,进一步调整矩阵的行和列,以最小化填充元素的数量。这可以通过使用列重排和行重排技术来实现。
- 作用:
- 通过优化矩阵结构,进一步减少在分解时产生的填充元素,提高计算效率。
3. 构建消去树
- 过程:
- 根据重排后的矩阵结构,建立消去树。树的每个节点代表一个超节点,边表示超节点之间的依赖关系。
- 作用:
- 消去树为后续的数值分解和求解提供了清晰的依赖关系,有助于管理计算顺序。
4. 识别超节点+划分超节点
- 过程:
- 在消去树中,合并相邻的非零元素,形成超节点。这些超节点是原矩阵的子矩阵,通常是稠密的。
- 融合过小的超节点、拆分过大的超节点
- 作用:
- 通过将稀疏矩阵转化为超节点,减少了计算的复杂性,使后续的数值分解过程更加高效。
5. 符号分解
- 过程:
- 在分析阶段,执行符号分解以确定在数值分解过程中将生成的非零元素的位置。这一过程不涉及实际的数值计算。
- 作用:
- 通过预测填充模式,能够有效地规划存储结构,从而优化内存使用。
2. 数值分解(Factorize)
过程:
-
LU分解:
- 对每个超节点进行LU分解(或其他适合的分解方法),将其转换为上三角矩阵和下三角矩阵的乘积。
3. 三角求解(Backsolve)
依次求解Ly=b和Ux=y两个三角方程组
过程:
-
从叶子节点开始回代:
- 从消去树的叶子节点开始,利用每个超节点的分解结果进行回代计算,求解相应的未知数。
-
逐层向上求解:
- 每处理完一个超节点,更新当前解向量,逐层向上处理,直至根节点。
-
确保依赖关系的满足:
- 在回代过程中,确保按照消去树中确定的顺序进行,避免因依赖关系不满足而导致的计算错误。
学习资料:
A Supernodal Approach to Sparse Partial Pivoting,1999
https://zhuanlan.zhihu.com/p/60140808
https://zhuanlan.zhihu.com/p/61438643
https://zhuanlan.zhihu.com/p/94617545