【问题标题】:Solving equation using LU factorization without pivoting (Lapack library)使用 LU 分解求解方程,无需旋转(Lapack 库)
【发布时间】:2015-02-02 12:11:32
【问题描述】:

一开始我想为我的英语道歉。现在,让我们来解决我的问题。

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

斧头 = 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} 并且函数返回 {-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 分解。我对此功能进行了研究,但没有找到任何东西。有没有人知道这个(这些)函数(函数)是(或可能是)什么?我对这个问题的解决方案失去了希望。

【问题讨论】:

    标签: c++ lapack equation-solving


    【解决方案1】:

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

    你是对的,INF 表示“无穷大”,NaN 表示“非数字”。

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

    【讨论】:

    • 非常感谢您的回答。我想点击向上箭头,但我不能,因为我的声誉得分太低。你是对的,当我转置矩阵时,一个函数返回正确的值。你确定LU算法总是使用旋转吗?如果是,也许我必须使用带有部分旋转的 LU 分解。
    • 如果您有非对称矩阵,您需要使用带有旋转的 LU。当您的声誉较低时,您无法对答案进行投票。你只能接受正确的。
    • 只是为了提供更多细节,需要旋转以保证非奇异矩阵 A 存在 LU 分解。考虑 A = ((0, 1), (1, 0))。不存在满足 A = LU 的非奇异三角形 L 和 U。有必要首先应用行交换(“pivot”)来获得 PA = LU 形式的因式分解,然后我们有 L = U = 身份。
    【解决方案2】:

    MATLAB 不是在不使用 Pivoting 的情况下计算 LU。从研究中我发现 MATLAB 使用 LAPACK 例程进行计算。我想知道他们是怎么做到的。

    【讨论】:

      猜你喜欢
      • 2013-02-24
      • 1970-01-01
      • 2018-04-29
      • 1970-01-01
      • 1970-01-01
      • 2017-06-06
      • 1970-01-01
      • 2015-04-11
      • 1970-01-01
      相关资源
      最近更新 更多