为什么这个简单的 Fortran 矩阵求逆代码没有返回 LAPACK 的预期值?

问题描述 投票:0回答:0

我正在尝试使用 LAPACK 包来计算矩阵的逆。为此,我使用了例程 sgetrfsgetri。但是,在测试代码时,它不会返回逆分解的预期值或(据我所知是预期值)LU 分解。我用于求逆的基本矩阵是一个任意的 4x4 矩阵。它是在 Code::blocks 上用 Fortran 90 编写的,并使用最新的 GNU 编译器和可用的 LAPACK 库。如果它完全相关,我使用的是Windows 10。代码足够简单我相信直接发布在这里就足够了:

program test
    implicit none


    real, dimension(4,4)   :: R,R_inv


    integer                              :: info, ipiv
    real, dimension(4)                   :: lol


    R = reshape([real :: 1,0,0,0,          &
                         0,1.0/34.0,0,0,   &
                         0,0,1,2,          &
                         0,0,2,1]          &
                         ,shape(R), order = [2,1]                              )




R_inv = R
call sgetrf(4,4,R_inv,4,ipiv,info)

print *,info
print *, "_"
print *, R_inv
print *, "_"

call sgetri(2,R_inv,4,ipiv,lol,4,info)

print *,info
print *, "_"
print *, lol
print *, "_"
print *, R_inv
print *, "_"
print *,matmul(R_inv,R)
print *, "_"


end program 

到目前为止,这是我注意到的:

  • 第一个信息输出返回 2。根据函数 sgetrf 的文档,这意味着因子 U(2,2) 完全是奇异的。但是,使用不同的 LU 因式分解计算器(例如 Matlab),我得到了有效(且不同)的因式分解结果。此外,我使用在线计算器也得到了不同的结果。这个结果与通过 Matlab 获得的结果一致。

  • 功能sgetri似乎工作正常。

  • 如果矩阵是对角线,则此代码可以正常工作。

  • LU 分解矩阵在对角线的前半部分看起来很好,但在那之后就变得奇怪了。

  • 同时使用在线计算器和Matlab,矩阵R的逆存在并且没有明显问题。也许负值会以某种方式解决问题?但我不知道为什么会这样。

-双精度切换实数对结果没有影响

总的来说,谁能说出这段代码有什么问题?关于例程的假设是错误的吗?我是否误解了我的结果应该是什么?如果是这样,如何使用 Fortran 上的 LAPACK 包计算逆函数?

鉴于我对 Fortran 有点缺乏经验,我处理软件包安装和使用的方式可能存在问题。如果这在你的机器上有效,请告诉我,因为我可能在那部分搞砸了。

fortran fortran90 lapack matrix-inverse matrix-factorization
© www.soinside.com 2019 - 2024. All rights reserved.