LAPACK:ZHEEV 和 DSYEV 为实对称矩阵给出不同的特征值

计算科学 特征值 拉帕克
2021-12-02 09:41:22

交换器,

我遇到了一个令人费解的问题。为了解决复杂的特征值问题,我使用了 LAPACK 库函数 ZHEEV。为了测试实现,我使用了一个实对称矩阵:

[2020020220200202]

应该具有特征值:2x0、2x4 使用 ZHEEV 我得到了 2x -2 和 2x 2。另一方面,修改实现以使用 DSYEV 会给出正确的结果。

我在这里遗漏了一些非常微不足道的东西,但我不明白它是什么。

这是子程序:

subroutine solvearray(m)                                                                                         
complex(16), dimension(:,:),allocatable :: dm
complex(16), dimension(:), allocatable :: freq, work
complex(16) :: One
doubleprecision, dimension(:),allocatable :: w, rwork
integer,dimension(:,:),allocatable, intent(inout) :: m 
integer :: n, k, h, l, info

One = cmplx(1.0,0.0,kind=SELECTED_REAL_KIND(15,300))
write(*,'(A)',advance='no') 'order of matrix = '   
read(*,*) n  
l = 2*n - 1 
allocate(work(2*l), rwork(3*n-2), w(n))  
w = 0.0  
work = 0.0 *One 
rwork = 0.0  
info = 0
allocate(dm(1:n,1:n))
dm(1:n,1:n) = m(1:n,1:n)*One
write(*,*) 'Setup for lapack workspace has been completed.'
call ZHEEV('V','U', n, dm, n, w, work, 2*l, rwork, info)

write(*,*) 'This is the eigenvector matrix:'
do k=1,n  
    write(*,'(255F8.4)') dm(k,1:n)
end do 
write(*,*) 'These are the eigenvalues :'
write(*,'(255F8.4)') w  
deallocate(m)           
deallocate(W,Work,rwork)
end subroutine   
1个回答

根据 Ian Bush 回答的类似问题,通过知道 complex(16) 与 complex*16 不同,问题得以解决。在 64 位编译器的特定情况下,需要将 complex*16 转换为 complex(8)...或者甚至更好地使用 SELECT_REAL_KIND 来定义独立于编译器的定义:C_double=SELECTED_REAL_KIND(15,307)。

谢谢大家的帮助和有用的评论。

丹尼