lapack zheev.f给出了错误的特征值

时间:2016-03-24 15:57:03

标签: ubuntu fortran lapack

我写了一个f90程序来测试lapack提供的子程序zheev.f。 我所做的是构建一个6x6对角矩阵(用于测试目的的真实条目)并计算特征值和特征向量。我得到的特征向量是正确的,但特征值是错误的,目前我无法理解为什么。我非常感谢任何帮助。

以下是代码:

program main
implicit none
external ZHEEV
complex*16, parameter :: Re=(1.0,0.0)
complex*16 :: egvc(6,6)
complex*16 :: egvl(6)
complex*16 :: Dmat(6,6)
!Lapack variables
character(len=1) :: JOBZ,UPLO
integer :: N,LDA,LWORK,INFO
real*16, allocatable :: W(:), RWORK(:)
complex*16, allocatable :: A(:,:), WORK(:)
!Dummies
integer :: i

!Inizialize lapack variables
JOBZ="V"
UPLO="U"
INFO=0
N=6
LDA=6
LWORK=N*2-1
allocate(A(N,N),W(N),WORK(LWORK),RWORK(N*3-2))
A=0.0*Re
W=0.0
WORK=0.0*Re
RWORK=0.0

!Initialize the matrix
Dmat=0.0*Re
do i=1,6
 Dmat(i,i)=i*Re
enddo

!Query
A=Dmat
LWORK=-1
call zheev(JOBZ,UPLO,N,A,LDA,W,WORK,LWORK,RWORK,INFO)
if (INFO.eq.0) then
 LWORK=int(real(WORK(1)))
 deallocate(WORK)
 allocate(WORK(LWORK))
 WORK=0.0*Re
else if (INFO.ne.0) then
 write(*,*) "From zheev: query for optimal workspace failed: STOP!"
 deallocate(A,W,WORK,RWORK)
 stop
endif

!Diagonalization
A=Dmat
call zheev(JOBZ,UPLO,N,A,LDA,W,WORK,LWORK,RWORK,INFO)
!Check
if (INFO.ne.0) then
 write(*,*) "Diagonalization failed INFO=",INFO," STOP!"
 deallocate(A,W,WORK,RWORK)
 stop
endif
egvl=W
egvc=A

do i=1,6
 write(55,*) egvl(i)
enddo

do i=1,6
 write(66,*) real(egvc(i,:))
 write(77,*) aimag(egvc(i,:))
enddo

deallocate(A,W,WORK,RWORK)
stop
end program main

在上述情况下,特征值应为{1,2,3,4,5,6}。我得到的是(大约){2,131072,33554432,0,0,0}。其他简单矩阵的类似奇怪结果,包括6x6单位矩阵。

以下是我编写代码的方法:

gfortran test_zheev.f90 -o test_zheev.x -llapack -lblas

以下是' lsb_release -a'的输出。命令:

没有可用的LSB模块。 分销商ID:Ubuntu 说明:Ubuntu 14.04.4 LTS 发布:14.04 代号:可信赖

以下是我安装库的方法:

sudo apt-get install libblas-dev liblapack-dev

(点击此链接:https://askubuntu.com/questions/623578/installing-blas-package

0 个答案:

没有答案