LAPACK 如何解决三对角系统?为什么?

计算科学 带状矩阵 拉帕克
2021-12-16 08:16:51

在我的项目中,我必须在每个时间步求解几个三对角矩阵,因此拥有一个好的求解器至关重要。我做了自己的实现,只是维基百科上描述的经典方式。然后我尝试使用 Lapack 代替,令我惊讶的是它更慢!

现在,在 Lapack 内部,它似乎通过 LU 分解进行求解,我想知道为什么,它不是比它可能的更复杂吗?

此外,我在 nr.com 的“Numerical Recipes”一书中发现了一种算法,它递归地将系统划分为更小的三对角问题。看起来很有希望。外面还有其他好东西吗?

更新:问题大小约为 1000x1000。我使用了 GotoBLAS,它还为您提供了 Lapack 3.1.1 库。问题不是对称的。我将 Lapack 例程用于一般三对角矩阵。

1个回答

您正在使用进行部分旋转的参考实现。三对角求解做的工作很少,不调用 BLAS。它可能比您的代码慢,因为它会进行部分旋转。dgtsv的源代码很简单。

如果您将多次使用相同的矩阵求解,您可能需要使用dgttrfdgttrs来存储因子。MKL、ACML 或 ESSL 等优化的 LAPACK 中的实现可能会更高效。