在下面的程序中,如果我在zheev中将'L'(读矩阵的下三角部分)改为'U'(上三角输入),我发现输出特征向量是不同的。有人帮忙吗?
program zheev_test
INTEGER N
PARAMETER ( N = 4 )
INTEGER LDA
PARAMETER ( LDA = N )
INTEGER LWMAX
PARAMETER ( LWMAX = 1000 )
INTEGER INFO, LWORK
DOUBLE PRECISION W( N ), RWORK( 3*N-2 )
COMPLEX*16 A( LDA, N ), WORK( LWMAX ),vect(n,n)
a(1,:)=[( 9.14,0.00),(-4.37,-9.22),(-1.98,-1.72),(-8.96,-9.50)]
a(2,:)=[(-4.37,9.22),(-3.35,0.00),(2.25,-9.51),(2.57,2.40)]
a(3,:)=[(-1.98,1.72),(2.25,9.51),(-4.82,0.00),(-3.24,2.04)]
a(4,:)=[(-8.96,9.50),(2.57,-2.40),(-3.24,-2.04),(8.44,0.00)]
WRITE(*,*)'ZHEEV Example Program Results'
LWORK = -1
CALL ZHEEV( 'V', 'L', N, A, LDA, W, WORK, LWORK, RWORK,INFO )
LWORK = MIN( LWMAX, INT( WORK( 1 ) ) )
CALL ZHEEV( 'V', 'L', N, A, LDA, W, WORK, LWORK, RWORK,INFO )
IF(info>0) stop 'The algorithm failed to compute eigenvalues.'
write(*,*) w
write(*,*) a(:,1)
end program
答案 0 :(得分:2)
我想这可能是因为特征向量的不同阶段(仅确定复杂的乘法因子)。为了避免这种情况,例如通过第一元素划分整个特征向量可能是有用的,使得
write(*,*) a(:,1) / a(1,1)
然后我们获得(使用ifort14)
For mode = 'L':
eigenvalues = -16.0047467285727 -6.76497034056390 6.66571163878665 25.5140052777621
a(:,1) = ( 0.344765913149177, 0.000000000000000E+000)
( 0.441821763159905, -0.538931962007287)
(-0.479504340748548, -0.374404626123115)
( 0.100522573509652, -0.123589281135427)
a(:,1) / a(1,1) = ( 1.00000000000000, 0.000000000000000E+000)
( 1.28151231403417, -1.56318226788881)
(-1.39081133737566, -1.08596764309792)
( 0.291567610589614, -0.358473028863359)
For mode = 'U':
eigenvalues = -16.0047467285727 -6.76497034056390 6.66571163878665 25.5140052777620
a(:,1) = ( 0.217545360791378, 0.267465046067210)
( 0.696883676007484, 2.696699658290103E-003)
(-1.210616849344158E-002, -0.608240641147479)
( 0.159308186219588, 0.000000000000000E+000)
a(:,1) / a(1,1) = ( 1.00000000000000, 0.000000000000000E+000)
( 1.28151231403417, -1.56318226788881)
(-1.39081133737566, -1.08596764309792)
( 0.291567610589614, -0.358473028863359)
与从其他软件获得的结果一致(但仅在单精度范围内,因为您的a
矩阵设置为单精度文字!)
eigenvalues = -16.004746472094745 -6.764970154793344 6.665711453507093 25.514005173380916
V[1,1] / V[1,1] = 1.0 - 0.0im
V[2,1] / V[1,1] = 1.281512342601922 - 1.5631822174403054im
V[3,1] / V[1,1] = -1.3908112850832561 - 1.0859676556672477im
V[4,1] / V[1,1] = 0.29156759974571633 - 0.35847302874950293im