Lapack,DGEEV 没有给我正确的特征值

Lapack, DGEEV does not give me the right eigenvalues

当尝试使用 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.00000,0.00000) 和 (0.00000,-0.40824)

错误

  1. ev 数组只是 dimension(2) 而它应该是 dimension(2,2).
  2. work应该是一个长度为4n=4*2.
  3. 的一维数组

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

改进

此外,您应该使用 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)