在lapack中的zheev中获得较低和较高输入的不同特征向量

时间:2016-07-19 09:31:11

标签: fortran lapack blas

在下面的程序中,如果我在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 

1 个答案:

答案 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