gpt4 book ai didi

fortran90 - LAPACK 例程 ZGEEV - 给出错误的特征值

转载 作者:行者123 更新时间:2023-12-02 00:07:56 27 4
gpt4 key购买 nike

我用 fortran 编写了以下程序,它使用了一个名为 ZGEEV 的 lapack 子程序。 .我们的想法是看看矩阵的特征值如何 matrix to diagonalised随着 k 从实数变为复数而变化。从分析上看,无论k是否复数,答案都应该是2和0。但是我得到了一个显示很多变化的情节。
尤其是真k,剧情是这样的-
Plot for eigenvalues vs k这是我写的代码 -

           program main
implicit none
!**********************************************
complex(8) :: k,mat(2,2)
complex(8) :: eigenvals(2)
real(8), parameter :: kmax = 2.d0
real(8), parameter :: dk = 1.d-1
real(8) :: kr,ki
!**********************************************
kr=-kmax
do while (kr.le.kmax)
ki= -1.d-3
do while (ki.le.1.d-3)
k=cmplx(kr,ki)
call init_mat(k,mat)
call diagonalize(mat,eigenvals)
print*, real(k), real(eigenvals(2)),aimag(eigenvals(2))
ki=ki+1.d-4
end do
kr=kr+dk
end do
end program main





subroutine init_mat(k,mat)
implicit none
complex(8),intent(in) :: k
complex(8),intent(out):: mat(2,2)
complex(8),parameter :: di=(0.d0,1.d0)
complex(8),parameter :: d1=(1.d0,0.d0)
!**********************************************
mat(1,1) = d1
mat(1,2) = exp(di*k)
mat(2,1) = exp(di*k)
mat(2,2) = d1
return
end subroutine init_mat

subroutine diagonalize(mat,eigenvals)
implicit none
complex(8),intent(in) :: mat(2,2)
complex(8),intent(out):: eigenvals(2)
complex(8) :: vl(2,2),vr(2,2)
complex(8),allocatable:: work(:)
integer(4) :: lwork
complex(8) :: rwork(4)
complex(8) :: mat2(2,2)
integer(4) :: info
!**********************************************
mat2(:,:) = mat(:,:)
allocate(work(6))
call zgeev('N', 'N', 2, mat2, 2, eigenvals, vl, 2, vr, 2, work, -1, rwork, info)
lwork = work(1)
deallocate(work)
allocate(work(lwork))
call zgeev('V', 'V', 2, mat2, 2, eigenvals, vl, 2, vr, 2, work, lwork, rwork, info)
if (info.ne.0) print*, info
stop 'diagonalize failed'
end subroutine diagonalize

欢迎在评论中对这种异常的原因进行任何懒惰的理论化!

PS:我在 python 中编写了类似的代码,特征值是 y=2 和 y=0 处的两条常量线。

最佳答案

在子程序 init_mat(k,mat) 中

mat(1,2) = exp(di*k)和mat(2,1) = exp(di*k)

但是其中之一,例如 mat(2,1) 应该 = exp(-di*k)

虽然您的数学项目需要一个在非对角线上带有 e^ik 和 e^-ik 的矩阵,但显示的代码是创建一个在两个非对角线上都带有 e^ik 的矩阵。实际编码的矩阵具有复杂的特征值,因此用于查找特征值的子例程可能会正常工作,并且所示的输入有错误的规范。

那么 [[1, e^ik], [e^ik, 1]] 的特征值是多少?

好吧,轨迹仍然是 2,所以特征值之和为 2。

行列式是1-e^(2ik),所以乘积是复数。

这表明实际输入的矩阵的特征值是和为2的复数共轭。通过检查,特征值似乎是1 +/- e^ik

关于fortran90 - LAPACK 例程 ZGEEV - 给出错误的特征值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17208727/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com