LAPACK反转程序奇怪地混淆了所有变量

时间:2014-10-20 22:28:32

标签: fortran lapack linear-equation

我正在使用fortran进行编程并尝试使用Lapack软件包中的DGETRI矩阵逆变器:

http://www.netlib.org/lapack/explore-html/df/da4/dgetri_8f.html

但非常奇怪的是它似乎搞乱了我所有的变数。在这个非常简单的例子中,我在程序开始时初始化的矩阵A在应用DGETRI时发生了变化,即使DGETRI不涉及A ......

有谁能告诉我发生了什么事?谢谢!

PROGRAM solvelinear

REAL(8), dimension(2,2)     :: A,Ainv
REAL(8),allocatable         :: work(:)
INTEGER                     :: info,lwork,i
INTEGER,dimension(2)        :: ipiv

info=0
lwork=10000
allocate(work(lwork))
work=0
ipiv=0

A = reshape((/1,-1,3,3/),(/2,2/))
Ainv = reshape((/1,-1,3,3/),(/2,2/))

CALL DGETRI(2,Ainv,2,Ipiv,work,lwork,info)

print*,"A = "
do i=1,2
  print*,A(i,:)
end do

END PROGRAM solve linear

这是输出:

 A =
   1.0000000000000000        0.0000000000000000
  -1.0000000000000000       0.33333333333333331

1 个答案:

答案 0 :(得分:2)

您必须在调用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

输出

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的预期未更改值