什么是大型拉普拉斯矩阵的快速简单求解器?

时间:2013-07-01 09:49:36

标签: c++ linear-algebra sparse-matrix numerical-methods

我需要解决在电阻网络研究中出现的一些大的(N~1e6)拉普拉斯矩阵。其余的网络分析正在使用boost图进行处理,如果可能的话我想保留C ++。我知道有很多很多C ++矩阵库,但似乎没有人在速度或可用性方面成为明确的领导者。此外,关于该主题的许多问题,在这里和其他地方似乎迅速转变为具有有限效用的洗衣清单。为了帮助自己和他人,我会尽量使问题简洁明了:

什么是能够有效处理以下要求的最佳库?

  • 矩阵类型:对称对角线显性/拉普拉斯算子
  • 尺寸:非常大(N~1e6),无需动态调整大小
  • 稀疏度:极端(每行/每列最多5个非零术语)
  • 需要的操作:在A * x = b和mat / vec乘法
  • 中求解x
  • 语言:C ++(C ok)
  • 优先级:代码的速度和简单性。我宁愿避免为这个问题学习一个全新的框架,也不必手动编写太多的帮助代码。

用最小的工作范例对答案充满热爱......

3 个答案:

答案 0 :(得分:2)

Eigen非常好用,是我所知道的最快的库之一:

http://eigen.tuxfamily.org/dox/group__TutorialSparse.html

答案 1 :(得分:2)

如果你想编写自己的求解器,就简单性而言,很难超越Gauss-Seidel次迭代。更新步骤是一行,可以轻松并行化。 Successive over-relaxation(SOR)只是稍微复杂一点,收敛得更快。

Conjugate gradient编码也很简单,并且应该比其他迭代方法快得多。需要注意的重要一点是,您不需要形成完整的矩阵A,只需计算矩阵向量乘积A * b。一旦有效,您可以通过添加SSOR(对称SOR)等预处理器来再次提高融合率。

自己编写合理的最快解决方法可能是基于傅立叶的求解器。它主要涉及对右侧进行FFT,将每个值乘以其坐标的函数,并采用逆FFT。您可以使用像FFTW这样的FFT库,也可以自己动手。

所有这些的一个很好的参考是Arieh Iserles A First Course in the Numerical Analysis of Differential Equations

答案 2 :(得分:0)

有很多相关的帖子,你可以看看。 我建议使用UMFPACK and BOOST's uBLAS Sparse Matrix

中使用的C ++和Boost :: ublas