在调用 DGETRI 之前,您必须计算 LU 分解。
您正在使用例程的双版本,因此 LU 必须用以下方式计算DGETRF
(ZGETRF
是复杂版本)。
以下代码编译并返回正确的值
PROGRAM solvelinear
implicit none
REAL(8), dimension(3,3) :: A,Ainv,M,LU
REAL(8),allocatable :: work(:)
INTEGER :: info,lwork
INTEGER,dimension(3) :: ipiv
INTEGER :: i
info=0
lwork=100
allocate(work(lwork))
work=0
ipiv=0
A = reshape((/1,-1,3,3,1,1,1,1,1,1/),(/3,3/))
!-- LU factorisation
LU = A
CALL DGETRF(3,3,LU,3,ipiv,info)
!-- Inversion of matrix A using the LU
Ainv=LU
CALL DGETRI(3,Ainv,3,Ipiv,work,lwork,info)
!-- computation of A^-1 * A to check the inverse
M = matmul(Ainv,A)
print*,"M = "
do i=1,3
print*,M(i,:)
end do
END PROGRAM solvelinear
OUTPUT
M =
1.0000000000000000 0.0000000000000000 0.0000000000000000
0.0000000000000000 1.0000000000000000 -5.5511151231257827E-017
-4.4408920985006262E-016 -2.2204460492503131E-016 1.0000000000000000
顺便说一句,当使用 gfortran 4.8.2 编译时,您的原始代码返回 A 的预期不变值