使用无需旋转的LU分解求解方程(Lapack库)

时间:2015-02-02 12:11:32

标签: c++ lapack equation-solving

一开始我想为我的英语道歉。现在,让我们回答我的问题。

我尝试编写一个简单的代码,它将找到线性方程组的解决方案:

  

Ax = b

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

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

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

  

LAPACK例程假设输入矩阵不包含IEEE 754特殊值,例如INF或NaN。使用这些特殊值可能会导致LAPACK返回意外结果或变得不稳定。

我猜INF表示“无穷大”,NaN表示“非数字”,对吧?

第二个问题是如果上面的例子能够正常工作,它会使用LU分解和部分旋转。我需要来自Lapack库的函数,它们在没有透视的情况下进行LU分解。我做了这个功能的研究,但我没有找到任何东西。有谁知道这个(这些)功能(功能)是什么(或可能是)?我对这个问题的解决方案失去了希望。

2 个答案:

答案 0 :(得分:2)

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

你是对的,INF意味着"无穷大"和NaN表示"不是数字"。

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

答案 1 :(得分:-1)

如果不使用Pivoting,MATLAB是否会计算LU。从研究中我发现MATLAB使用LAPACK例程进行计算。我想知道他们是怎么做到的。