适用于许多右侧的稀疏线性求解器


12

我需要用多个右侧(300至1000)来解决相同的稀疏线性系统(300x300至1000x1000)。除了第一个问题外,我还想解决不同的系统,但是具有相同的非零元素(只是不同的值),那就是许多稀疏系统具有恒定的稀疏性模式。我的矩阵是不确定的。

分解和初始化的性能并不重要,但是求解阶段的性能很重要。目前,我正在考虑使用PaStiX或Umfpack,并且我可能会使用Petsc(支持这两个求解器)是否有能够利用我的特定需求(向量化,多线程)的库,或者我应该依赖于通用求解器?也许根据我的需要对其进行一些修改?

如果稀疏矩阵大到怎么办?106×106

Answers:


10

在不考虑使用直接求解器还是迭代求解器的讨论时,我只想补充两点:

  1. 对于具有多个右侧的系统,存在Krylov方法(称为块Krylov方法)。另外,由于Krylov空间是由较大的向量集合构成的,因此与标准Krylov方法相比,它们的收敛速度通常更快。请参阅Dianne P.O'Leary,块共轭梯度算法和相关方法。线性代数及其应用29(1980),第239-322页。Martin H. Gutknecht,具有多个右侧的线性系统的Block Krylov空间方法:简介(2007)。

  2. 如果具有相同稀疏模式的不同矩阵,则可以为第一个矩阵预先计算符号分解,可以在计算此矩阵和后续矩阵的数值分解时重复使用该符号分解。(在UMFPACK中,您可以使用umfpack di symbolic并将结果传递给umfpack_di_numeric。)


9

通常,在为迭代求解器构造一个好的预处理器所需的工作量与在实际求解线性系统时使用一个好的预处理器所节省的工作之间要进行权衡。在您的情况下,情况很清楚:构造一个好的前置条件要花尽可能多的工作,因为您必须解决很多线性系统。实际上,我认为应该花时间来获得完美的预处理器:LU分解(例如,使用UMFPACK或Intel MKL附带的Pardiso求解器)。然后,只需根据需要多次应用此分解。如果您有线性系统要求解,那么没有什么可以指望得到精确的分解。O(N)


4
O(N2)O(N4/3)O(N4/3)N

3
O(N)O(N4/3)

2
105n<300k

3

当您谈论“相同的非零元素(只是不同的值)”时,您对问题的陈述并不十分清楚。您是说矩阵具有恒定的稀疏性模式,但实际值却发生变化吗?或者,您是说矩阵实际上是常数吗?

PA=LUO(n2)

对于多个右侧和这种大小的方程组,迭代方法通常不值得使用。

您提到的所有软件包都提供了直接的因式分解方法(尽管PetSc的迭代求解器最为人所知。)但是,您的系统是如此之小,以致不可能获得实质性的并行加速,特别是在分布式内存环境中。

我建议使用Umfpack来完成这项工作-PaStix和PetSc太过分了。


感谢您的回答。为了阐明这一点:我首先要求具有多个右侧的单个矩阵,然后再问一个问题,即具有相同稀疏模式但值改变的矩阵的集合,每个矩阵都必须求解许多rhs。辅助问题:如果稀疏矩阵现在是10 ^ 5x10 ^ 5到10 ^ 6x10 ^ 6,该怎么办?
nat chouf

2
105

对于仅使用一个右侧的较大系统,使用迭代方法可能是有意义的,特别是在您不需要非常精确的解决方案的情况下,尤其是在您可以找到有效的预处理器或系统已经良好适应的情况下。但是,如果您的系统条件不好,则需要准确的解决方案,并且找不到合适的前置条件,那么直接分解就可能会带来更好的收益。
Brian Borchers 2013年

N106
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.