4

そのため、すべて 1 の 4x4 行列の固有値分解に対して異なる答えが得られることに気付きました。

Python で numpy.linalg.eig を使用する場合:

matrix = numpy.ones((M,M), dtype=float);
values, vectors = numpy.linalg.eig(matrix);

パイソンの結果:

V1: [-0.866025 +0.288675 +0.288675 +0.288675]
V2: [+0.500000 +0.500000 +0.500000 +0.500000]
V3: [+0.391955 +0.597433 -0.494694 -0.494694]
V4: [+0.866025 -0.288675 -0.288675 -0.288675]

LAPACK DSYEV を使用した C の場合:

#define NN 4
#define LDA NN
void main(){
    int n = NN, lda = LDA, lwork=NN*NN*NN*NN*NN, info;
    char both = 'V';
    char uplo = 'U';
    double w[NN*NN];
    double work[NN*NN*NN*NN*NN];
    double a[LDA*NN] = {
       1,  1,  1,  1,
       1,  1,  1,  1,
       1,  1,  1,  1,
       1,  1,  1,  1 
    };

    dsyev_(&both, &uplo, &n, a, &lda, w, work, &lwork, &info);
    return;
}

C DSYEV 結果:

V1: +0.000596 +0.000596 -0.707702 +0.706510 
V2: +0.500000 +0.500000 -0.499157 -0.500842 
V3: +0.707107 -0.707107 -0.000000 +0.000000 
V4: +0.500000 +0.500000 +0.500000 +0.500000  

LAPACK DGEEV を使用した C の場合:

#define NN 4
#define LDA NN
#define LDVL NN
#define LDVR NN
void main() {
    char compute_left = 'V';
    char compute_right = 'V';
    int n = NN, lda = LDA, ldvl = LDVL, ldvr = LDVR, info, lwork=2*NN*NN;
    double work[2*NN*NN];
    double wr[NN], wi[NN], vl[LDVL*NN], vr[LDVR*NN];
    double a[LDA*NN] = {
       1,  1,  1,  1,
       1,  1,  1,  1,
       1,  1,  1,  1,
       1,  1,  1,  1 
    };
    dgeev_( &compute_left, &compute_right, &n, a, &lda, wr, wi, vl, &ldvl, vr, &ldvr, work, &lwork, &info );
    return;
}

C DGEEV 結果:

V1: -0.866025 +0.288675 +0.288675 +0.288675 
V2: -0.500000 -0.500000 -0.500000 -0.500000 
V3: -0.000000 -0.816497 +0.408248 +0.408248 
V4: -0.000000 -0.000000 -0.707107 +0.707107 

結果が全然違う!

だから私は2つの大きな質問があります:

  1. なんで?これは 1 行列の縮退によるものですか?
  2. Python In C の結果を複製するにはどうすればよいですか?

任意の洞察をいただければ幸いです。

4

2 に答える 2

2

すべて正しいです。行列には 4 と 0 の 2 つの固有値があります。4 の固有空間は [1,1,1,1] で囲まれた線であり、その倍数がすべてのリストに表示されます。0 の固有空間は、3 空間 x_1 + x_2 + x_3 + x_4 = 0 です。3 つの方法はそれぞれ、この部分空間の異なる基底を提供します。理由。

私の考えでは、DGEEV の結果は、賢明な階段形の 0 固有空間の正規直交基底を与えるため、報告されたものの中で最高です。

于 2016-12-28T15:49:16.707 に答える