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)
错误
ev
数组只是 dimension(2)
而它应该是 dimension(2,2)
.
work
应该是一个长度为4n=4*2
. 的一维数组
请注意,第一个实际上会破坏您的记忆,因此您会得到错误的特征值。
改进
此外,您应该使用 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)
当尝试使用 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)
错误
ev
数组只是dimension(2)
而它应该是dimension(2,2)
.work
应该是一个长度为4n=4*2
. 的一维数组
请注意,第一个实际上会破坏您的记忆,因此您会得到错误的特征值。
改进
此外,您应该使用 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)