拉帕克,DGEEV没有给我正确的特征值



当试图用DGEEV函数计算矩阵的特征值时,我注意到它们是非共轭的,因此是错误的。

我试着用简单的(0 1;-1 0(矩阵(它有特征值I和-I(进行测试,但它没有给我正确的解决方案。

有人能指出我代码中的错误吗?

program myProgram
real(kind=dp), dimension(2) :: ew_real, ew_imag, ev
real(kind=dp), dimension(4*5,4*5) :: work 
integer info
real(kind=dp), DIMENSION(2, 2) :: array
array = reshape((/ 0.0, -1.0, 1.0, 0.0/), shape(array))      
call DGEEV('N','V',2,array,2,ew_real,ew_imag,ev,2,ev,2,work,size(work,1),info)
end program

我的程序输出:(0.0000000,0.000000(和(0.00000000,0.40824(

错误

  1. ev数组仅为dimension(2),而它应该为dimension(2,2)
  2. CCD_ 4应该是长度为CCD_

注意,第一个实际上会破坏你的记忆,因此,你得到了错误的特征值。

改进

此外,您应该使用lapack95模块,它提供了更易于调用的通用接口。

以下示例显示了两个调用

program main
use iso_fortran_env, only: dp => real64
use lapack95
integer                       :: info
real(kind=dp), dimension(2)   :: ew_real, ew_imag
real(kind=dp), dimension(4*2) :: work
real(kind=dp), dimension(2,2) :: array, ev_left, ev_right
array = reshape([0, -1, 1, 0], shape(array))
! lapack
call dgeev('N','V',2,array,2,ew_real,ew_imag,ev_left,2,ev_right,2,work,size(work),info)
print *, 'eval1', cmplx(ew_real(1), y=ew_imag(1))
print *, 'eval2', cmplx(ew_real(2), y=ew_imag(2))
! lapack95 call
call geev(array, ew_real, ew_imag, vr=ev_right)
print *, 'eval1', cmplx(ew_real(1), y=ew_imag(1))
print *, 'eval2', cmplx(ew_real(2), y=ew_imag(2))
end program

输出为

$ ./main
eval1               (0.0000000000000000,1.0000000000000000)
eval2              (0.0000000000000000,-1.0000000000000000)
eval1               (0.0000000000000000,1.0000000000000000)
eval2              (0.0000000000000000,-1.0000000000000000)

最新更新