高效的三对角矩阵算法实现


12

我正在使用隐式数值方案解决物理问题。这导致我用三对角矩阵求解线性方程。我已经从Wikipedia 编写了此算法。我想知道是否有一个有效的库可以优化方式解决这类方程。一个重要的注意事项是,矩阵本身仅在系统参数发生变化时才会发生变化,因此我有机会对一些算法步骤进行了预先计算,以获得了不错的性能表现。我正在使用C ++。


它有多大,需要并行吗?
aterrel 2011年

1
大小取决于所需的精度(从十万到几万个值)。现在,我正在单核计算机上进行编码,但是可以访问具有许多cpus的大学超级计算机,因此并行性支持会很好。
gmk

Answers:


15

您可能应该从LAPACK实现开始,例如?gtsv,例如dgtsv。如果需要分布式内存版本,则可能要从ScaLAPACK的p?gtsv开始。

编辑:由于矩阵的变化不是非常频繁,因此可以通过将LAPACK例程?gtsv分解为分解步骤?gttrf和求解阶段?gttrs来避免多余地分解三对角矩阵。ScaLAPACK中存在类似名称的例程,它们具有相同的用途。


谢谢,看起来像我需要的。我现在将尝试从我的代码中运行该例程。
gmk

1
由于您是从C ++调用的,因此请确保在extern“ C” {}块内声明原型。根据您的系统,您可能需要在例程名称后加上下划线。
Jack Poulson

2

对于分布式并行系统:我还没有尝试过ScaLAPACK,它具有一个并行三对角线求解器,有关在线示例,请参见。我已经成功地尝试了David Moulton在LANL出版物中提出的方法。对此进行编码可能比您想做的要多,但是通过使用LAPACK可以解决问题。


1

我发现一个有趣的递归算法这里在975它看起来很有希望页,我想知道更多的有经验的人说些什么。


数字食谱中有一些错误。就使用的代码源而言,它不是最好的,尽管有人认为它是经典的。如果ScaLAPACK没有实现至少与递归循环约简一样有效的算法,我会感到惊讶。
Geoff Oxberry 2012年
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.