来自 MKL 的 ZGETRF 和 ZGETRS - zgetrf 失败并且 zgetrs 仍然有效?

计算科学 线性求解器 矩阵 svd 英特尔-mkl
2021-12-15 20:44:58

我有一个庞大的方程组

Ax=b
我知道矩阵A和右侧矢量b. 我正在使用 MKL 来解决这个系统。矩阵很复杂。我使用了在 LU 分解中需要矩阵输入的通用求解器ZGETRS英特尔 MKL zgetrs )。所以我使用了ZGETRF (Intel MKL zgetrf)来执行 LU 分解。

我检查了矩阵A也通过 SVD - SVD 分解说没问题,矩阵A是规律的。

但是当我发送Ato ZGETRF,出现错误代码“4”(来自手动如果info是肯定的,“分解已经完成,但是U完全是单数。如果使用因子,将发生除以 0U用于求解线性方程组。”)但随后程序发送 LU 分解矩阵AZGETRS这应该解决Ax=b系统。而这个写给我没有错误(info=0)。但它给我的解决方案是微不足道的解决方案——所有未知数都应该为零。

这是什么意思 - 矩阵中的错误可能在哪里?当 SVD 说矩阵是规则的但 LU 分解器说它是奇异的?

1个回答

总结问题的答案。

zgetrf(复矩阵的 LU 分解A) 返回info=i>0如果Uii=0; 因此在你的情况下U44=0在 MKL 尝试进行 LU 分解期间。当您的原始矩阵发生这种情况(不包括非常奇特的情况)A是单数或数值单数。如果zgetrf返回错误,则尝试执行 back-substitution 毫无意义zgetrs

“为什么我的矩阵是奇异的?” — 是一个完全不同的问题,需要有关在哪里的信息A最初来自。

zgesvd将尝试计算矩阵的奇异值分解 (SVD)A. 请注意,每个矩阵(全秩、单数、数字单数 - 你自己命名)都有一个 SVD。在您的问题中,您提到 SVD 没有问题,并且A是规律的。我想,您的意思是zgesvd不返回任何错误消息,这是预期的行为。zgesvd返回info0仅当它的某些输入参数错误或 SVD 的计算由于某种原因没有收敛时(参见zgesvd)。

总结一下:出于 SVD 的目的,您的矩阵很好,并且在评论中,您列出了确认矩阵是奇异假设的奇异值。因此,LU 分解zgetrf将失败。

一个人可能有理由使用zgetrf因式分解,然后是zgetrs; 但是,您可能会发现它很有用,从技术上讲,它是/zgesv的包装器(如果您不使用它的迭代优化选项)。其错误信息 ( ) 与 相同这可能会简化您在因式分解期间捕获错误而不执行不必要的子例程的工作。zgetrfzgetrsinfozgetrf