c++ - 使用不旋转的 LU 分解求解方程(Lapack 库)

标签 c++ lapack equation-solving

首先我要为我的英语道歉。现在,让我们来解决我的问题。

我尝试编写一个简单的代码来找到线性方程组的解:

Ax = b

其中 A 是方阵 nxn。在此程序中,我使用了 Lapack 库(我必须使用 LU 分解而不进行旋转)。

我找到了几个例子,e。 G。: Understanding LAPACK calls in C++ with a simple example 在这里我们可以看到如何使用函数:dgetrf_ 和 dgetrs_。但是,即使我将此代码(从最佳答案)复制到我的程序中,它有时会返回正确的结果(例如 A 和 b 与最佳答案中的相同),有时会返回错误的结果(例如 A = {1, -3, 1, -1}, b = {3, 5},正确答案是:{6, 1} 函数返回 {-4, 7})。对于更大的矩阵,它会返回错误的结果。谁能说说为什么?

在此站点中:https://software.intel.com/sites/products/documentation/doclib/mkl_sa/11/mkl_lapack_examples/lapackro1.htm写成:

LAPACK routines assume input matrices do not contain IEEE 754 special values such as INF or NaN. Using these special values may cause LAPACK to return unexpected results or become unstable.

我猜 INF 的意思是“无穷大”,而 NaN 的意思是“不是数字”,对吧?

第二个问题是,即使上面的例子也能正常工作,它使用了带有部分主元的 LU 分解。我需要 Lapack 库中的函数,这些函数在不旋转的情况下进行 LU 分解。我研究了这个功能,但没有找到任何东西。有谁知道(或可能是)这个(这些)功能(功能)是什么?我对解决这个问题失去了希望。

最佳答案

LAPACK 例程是用 FORTRAN 编写的,数据存储在 major 列中。您正在求解转置 A 矩阵系统 A^T x = b。尝试使用 A = {1, 1, -3, -1}

你是对的,INF 的意思是“无穷大”,而 NaN 的意思是“不是数字”。

LU 算法始终使用旋转。 Cholesky 分解不使用旋转 (dpotrf,dpotrs)。但是你的矩阵必须是“对称正定矩阵”。

关于c++ - 使用不旋转的 LU 分解求解方程(Lapack 库),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28277513/

相关文章:

c++ - 重载矩阵乘法 "* "运算符有问题

macos - 期望 LAPACK 例程在两种不同的处理器架构上获得相同的结果是否合理?

c++ - 如何实现 Matlab 的 mldivide(又名反斜杠运算符 "\")

c++ - 数组题(作业)

c++ - 运行应用程序时出现运行时错误,原因是 Qlable

c - LAPACKs dsyevr 函数(用于特征值和特征向量)不应该是线程安全的吗?

满二叉树的高度

python - 使用牛顿法求解 Python 中的非线性方程组

c++ - 使用 unique_ptr 指示(非)所有权转移

c++ - 头文件的解释