我正在尝试使用 LAPACK 包来计算矩阵的逆。为此,我使用了例程 sgetrf 和 sgetri。但是,在测试代码时,它不会返回逆分解的预期值或(据我所知是预期值)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 有点缺乏经验,我处理软件包安装和使用的方式可能存在问题。如果这在你的机器上有效,请告诉我,因为我可能在那部分搞砸了。