求解线性系统A x = b一种X=b使用 lapack 与 Hessenberg 矩阵

计算科学 线性求解器 拉帕克
2021-12-14 13:01:28

我需要解决以下形式的线性系统

一种X=b
在哪里一种是上 Hessenberg 矩阵,下带宽等于 1,b是 RHS 向量和X是解向量。我有一个基于“CB Moler, Algorithm 423, Linear Equation Solver, CACM 15 (1972), p. 274”的 C++ 例程。解决系统。但是,如果可用,我希望使用 LAPACK。由于我找不到任何用于“Hessenberg 矩阵线性系统求解”的 LAPACK 例程,我使用了dgetrfanddgetrs例程,但它们比 Hessenberg 矩阵的 C++ 实现要慢得多。样本输出为:

基准 Hessenberg 矩阵求解例程(大小 = 400)
            函数耗时残差
            -------- ------------- --------
          C++ dech() 0.000367 xx
          C++ solh() 0.000140 0.00000004
        LPK dgetrf() 0.004051 xx
        LPK dgetrs() 0.000110 0.00000005

最终结果
  C++ 因式分解比 LAPACK 快 11.027 倍。
  C++ bf solve 比 LAPACK 慢 0.790X。

我的问题是:LAPACK 中有没有专门处理 Hessenberg 矩阵的线性系统求解的例程?

注意:正如预期的那样,在 LAPACK 中使用dgetrf和进行密集矩阵求解要快得多。dgetrs

2个回答

LAPACK 中没有(现成的)用于 Hessenberg 形式的系统的求解器。但是,您可以使用 LAPACK 例程自己构建一个。

具体来说,使用 Givens 旋转将您的系统简化为上三角形。然后对转换后的系统进行反向替换。您使用 xROTG 构建 Given 旋转。您可以使用 xROTF 应用它们。您使用 xTRTRS 求解三角系统

LAPACK 中内置的 Hessenberg 系统有一个逆迭代,可能会被欺骗来解决您的系统,但我不会打扰。正交变换永远不会给您带来麻烦。

Henry 有一个算法(“The Shifted Hessenberg System Solve Computation”,1995 年),它允许您将 Givens 旋转和反向代换组合到一个通道中,而无需修改矩阵(使用 O(n) 存储就地)。我们在 Julia 标准LinearAlgebra中实现了这一点,发现它比单独的 Givens QR + xTRTRS 解决方案快几倍。