Fortran Lapack,DGEEV没有给我正确的特征值
当我试图用函数计算矩阵的特征值时,我注意到它们是非共轭的,因此是错误的 我试着用简单的(01;-10)矩阵(它有特征值I和-I)进行测试,但它没有给出正确的解决方案 有人能指出我代码中的错误吗Fortran Lapack,DGEEV没有给我正确的特征值,fortran,lapack,Fortran,Lapack,当我试图用函数计算矩阵的特征值时,我注意到它们是非共轭的,因此是错误的 我试着用简单的(01;-10)矩阵(它有特征值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=d
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
数组只有维度(2)
,而它应该是维度(2,2)
work
应该是长度为4n=4*2
的一维数组lapack95
模块,该模块提供了更易于调用的通用接口
下面的示例显示了这两个调用
主程序
仅使用iso_fortran_env:dp=>real64
使用lapack95
整数::信息
真实(种类=dp),维度(2)::ew_真实,ew_图像
实际(种类=dp),尺寸(4*2)::工作
实数(种类=dp),维数(2,2)::数组,左ev_,右ev_
数组=重塑([0,-1,1,0],形状(数组))
! 拉帕克
调用dgeev('N','V',2,数组,2,ew_real,ew_imag,ev_left,2,ev_right,2,工作,大小(工作),信息)
打印*,'eval1',cmplx(ew_real(1),y=ew_imag(1))
打印*,'eval2',cmplx(ew_real(2),y=ew_imag(2))
! lapack95呼叫
呼叫geev(阵列、ew_real、ew_imag、vr=ev_right)
打印*,'eval1',cmplx(ew_real(1),y=ew_imag(1))
打印*,'eval2',cmplx(ew_real(2),y=ew_imag(2))
结束程序
输出是
$。/main
eval1(0.0000000000000000,1.0000000000000000)
eval2(0.0000000000000000,-1.0000000000000000)
eval1(0.0000000000000000,1.0000000000000000)
eval2(0.0000000000000000,-1.0000000000000000)
错误
ev
数组只有维度(2)
,而它应该是维度(2,2)
work
应该是长度为4n=4*2
的一维数组lapack95
模块,该模块提供了更易于调用的通用接口
下面的示例显示了这两个调用
主程序
仅使用iso_fortran_env:dp=>real64
使用lapack95
整数::信息
真实(种类=dp),维度(2)::ew_真实,ew_图像
实际(种类=dp),尺寸(4*2)::工作
实数(种类=dp),维数(2,2)::数组,左ev_,右ev_
数组=重塑([0,-1,1,0],形状(数组))
! 拉帕克
调用dgeev('N','V',2,数组,2,ew_real,ew_imag,ev_left,2,ev_right,2,工作,大小(工作),信息)
打印*,'eval1',cmplx(ew_real(1),y=ew_imag(1))
打印*,'eval2',cmplx(ew_real(2),y=ew_imag(2))
! lapack95呼叫
呼叫geev(阵列、ew_real、ew_imag、vr=ev_right)
打印*,'eval1',cmplx(ew_real(1),y=ew_imag(1))
打印*,'eval2',cmplx(ew_real(2),y=ew_imag(2))
结束程序
输出是
$。/main
eval1(0.0000000000000000,1.0000000000000000)
eval2(0.0000000000000000,-1.0000000000000000)
eval1(0.0000000000000000,1.0000000000000000)
eval2(0.0000000000000000,-1.0000000000000000)
欢迎来到stackoverflow<代码>工作应该是1D数组,而不是2D数组。DGEV()通常被调用两次:一次执行工作区查询,然后将工作分配到最佳大小,然后执行第二次调用DGEV()以计算特征值和特征向量。参见PAR实例。您能打印ìnfo
的返回值吗?它提供了关于调用DGEEV()失败原因的见解。欢迎使用stackoverflow<代码>工作
应该是1D数组,而不是2D数组。DGEV()通常被调用两次:一次执行工作区查询,然后将工作分配到最佳大小,然后执行第二次调用DGEV()以计算特征值和特征向量。参见PAR实例。您能打印ìnfo
的返回值吗?它提供了一个关于调用DGEEV()失败原因的见解。次要评论:我仍然倾向于使用较旧的界面,因为lapack95模块在我看到的地方都不可用,我生活中的首要目标是尽量减少用户的电子邮件数量——这是几年前的事了,希望此后情况有所改变。次要评论:我仍然倾向于使用旧的界面,因为lapack95模块并不适用于我所看到的任何地方,我生活中的首要目标是尽量减少用户的电子邮件数量——这是几年前的事了,希望此后情况有所改变。