如何使用dsyev例程计算特征值



我正试图编写代码来计算对称矩阵的外向量和外值。我知道如何使用钢笔计算值。但我对api有点困惑!我是初学者,所以在解释api参数时可能会出错。

int main() {
        char jobz='V',uplo='U';
        int lda=3,n=3,info=8,lwork=9;
//      lapack_int lda=3,n=3,info=8;
        int i;
        double w[3],work[3];
        double a[9] = {
        3,2,4,
        2,0,2,
        4,2,3
        };


        info=LAPACKE_dsyev(LAPACK_ROW_MAJOR,jobz,uplo,  n  ,a,  lda  , w);    
        //dsyev_( &jobz,&uplo,&n, a, &lda, w,work , &lwork, &info );
        if( info > 0 ) {
                printf( "The algorithm failed to compute eigenvalues.n" );
                exit( 1 );
        }
        for(i=0;i<3;i++)
        {
            printf("%fn",w[i]);
         } 
        for(i=0;i<9;i++)
        {
                printf("%fn",a[i]);
        }
        exit( 0 );
} 

输出: -1.000000-1.0000008.000000

0.6179451.999713-0.0169380.0104680.0338760.9998571.3819660.6180340.000000

但我预计k = 1 :(1 2 0)(4、2、5)和 k = 8 :(2, 1, 2)在输出!

我是否错误地使用了API或者我是否错误地读取了输出?也请建议我如何做同样的任务与FORTRAN API ?与FORTRAN一样,我无法获得适当的外值!也就是说,我用fortran得到的外国值:-0.1347420.0507420.523036

外国向量:0.6179451.999713-0.0169380.0104680.0338760.9998571.3819660.6180340.000000

正如@francis在评论中建议的那样,如果将work[3]修改为work[9],则程序可以工作。得到的结果是

Eigenvalues: w[0],w[1],w[2] => -1.000000 -1.000000 8.000000
1st eigenvector: a[0], a[1], a[2] => -0.494101 -0.472019 0.730111
2nd eigenvector: a[3], a[4], a[5] => -0.558050  0.816142 0.149979
3rd eigenvector: a[6], a[7], a[8] =>  0.666667  0.333333 0.666667

为了比较,让我们用不同的程序对角化同一个矩阵。例如,Python/Numpy给出的结果是

>>> import numpy as np
>>> a = np.array([[3,2,4], [2,0,2], [4,2,3]], dtype=np.float )
>>> np.linalg.eig( a )
    (array([-1.,  8., -1.]),
     array([[-0.74535599,  0.66666667, -0.09414024],
            [ 0.2981424 ,  0.33333333, -0.84960833],
            [ 0.59628479,  0.66666667,  0.5189444 ]]))

而Julia给出

julia> a = Float64[ 3 2 4 ; 2 0 2 ; 4 2 3 ]
3x3 Array{Float64,2}:
 3.0  2.0  4.0
 2.0  0.0  2.0
 4.0  2.0  3.0
julia> eig( a )
([-0.9999999999999996,-0.9999999999999947,8.0],
3x3 Array{Float64,2}:
  0.447214  -0.596285  -0.666667
 -0.894427  -0.298142  -0.333333
  0.0        0.745356  -0.666667)

在这两种情况下,前三个数字是特征值{-1,-1,8},下面的矩阵是对应的特征向量(在它们的列中)。你会看到所有的程序对特征向量给出了不同的结果。由于存在两个退化特征值(-1),因此对应特征向量的任何线性组合也是具有相同偶数值的特征向量,因此结果不是唯一的。我们可以通过2x2正交变换(或"旋转"101.6度)证实由C得到的简并特征向量与Julia的特征向量相关。

有趣的是,你期望的特征向量[-1,2,0][4,2,-5]与Julia(经过归一化)得到的特征向量完全对应,但这可能是偶然的,人们不能期望退化特征向量的这种一致性。

相关内容

  • 没有找到相关文章

最新更新