用于求解复杂线性系统的 C++ 库 Ax=b

计算科学 线性代数 C++
2021-12-13 00:33:43

我对求解稀疏复杂线性系统 Ax=b 感兴趣,其中 A 是复数方阵,b 是复数向量。

如果可能的话,我希望按照Eigen的精神对这样的库进行模板化(以便于安装和使用)

我检查了 Eigen,但我认为它不支持求解具有复杂稀疏矩阵的线性方程(尽管可以创建复杂矩阵并对其进行基本运算。)

有人向我建议的另一个技巧是可以解决这个问题,通过使用 (A1 + iA2)(x1 + ix2) = (b1 + ib2) 的事实解决两倍维度的扩展系统,但我更喜欢一些简单的黑匣子完成工作。

有什么建议?

3个回答

您可以通过将该系统转换为等效的实数,然后使用通常的实数求解器来做到这一点。

有一个名为 Komplex 的 Trilinos 包正是这样做的,你可以在这里找到它

另请参阅论文:D. Day,MA Heroux - 通过等价实数变换求解复值线性系统,SIAM J. Sci。计算机,第 23 卷,第 2 期,2001 年。

我认为 Eigen 可以做到,但也可以查看用 C 编写的UMFPACK。Eigen为 UMFPACK模板化了 C++包装器另请参阅有关求解线性系统的模板和线性代数库调查的书。

Elemental(用 C++11 编写)和 PETSc(用 C 编写,与 UMFPACK、Elemental 和其他线性代数包接口)都可以求解复数域上的线性方程组。PETSc 更适合稀疏线性代数,并且还具有一些密集线性代数功能。