2012-03-12 11 views
3

一般的な固有値問題を解決するためのコードを書きましたが、私はLAPACKのDSPGVX関数と比較しています。私はこのexampleと一緒に作業しました。LAPACKは固有ベクトルの計算に失敗します

だから私は私のコードでとMathematicaと結果の両方4つの自動ベクトル

{ 
{-0.0319133, -0.265466, -0.713483, 0.64765}, 
{-0.425628, -0.520961, -0.714215, 0.193227}, 
{ 0.32702, 0.565845, -0.37129, -0.659561}, 
{-0.682699, -0.056645, 0.0771025, 0.724409} 
} 

と自動値

{-2.22545, 1.12704, -0.454756, 0.100076} 

同意を得。

しかし、前のリンクでは、LAPACKから報告された自動ベクトルは完全に異なっています。

私は誰を信頼すればよいですか?

P.S.私はまた、LAPACKの値はA * x-lambda * B * x = 0を返すので、自分のauto値/ autovectorが正しいことを確認しました。

答えて

1

DSGPVXはA *λ= B * x *λを解くようです。 MATLABは、 "eig"を使用して問題にDSGPVXソリューションを提供しますが、Matlabのドキュメントは正しいです。私の推測では、これはDSGPVXドキュメントのバグです。あなたはLAPACKが不正な答えを与えていると思う理由を私は知らない

>> a=[0.24 0.39 0.42 -0.16;0.39 -0.11 0.79 0.63;0.42 0.79 -0.25 0.48;-0.16 0.63 0.48 -0.03]; 
>> b=[4.16 -3.12 0.56 -0.1;-3.12 5.03 -0.83 1.09;0.56 -0.83 0.76 0.34;-0.1 1.09 0.34 1.18]; 
>> [v,d]=eig(a,b) 

v = 

    -0.0690 0.3080 -0.4469 -0.5528 
    -0.5740 0.5329 -0.0371 -0.6766 
    -1.5428 -0.3496 0.0505 -0.9276 
    1.4004 -0.6211 0.4743 0.2510 


d = 

    -2.2254   0   0   0 
     0 -0.4548   0   0 
     0   0 0.1001   0 
     0   0   0 1.1270 

>> norm(a*v-b*v*d) 

ans = 

    1.5001e-15 
1

Lapackの結果は実際にコードとMathematicaによって生成された最後の2つの固有値に対応しているようですが、下位ビットが全く異なっています。対応するベクトルは非常に近く、異なったスケーリングしかありません。

明らかに、/ Mathematicaの値がチェックアウトされ、Lapackの値が正しくない場合は、正しい答えを生成するものを信頼する必要があります。あなたの問題とLapackのアルゴリズムが非常に不正確な答えを提供するようにするためには、それが何であるかを調べることは価値があるかもしれません。

2

は、彼らが私には細かいようです。あなたが引用している4桁の小数点を使って、

ノルム(r1)= 1.5921e-04ノルム(r2)= 6.0842e-05となる残差(r = A * x-ラムダ* B *

norm(A)= 1.2994およびnorm(B)= 7.9874なので、これらの残差は非常に満足のいくようです。

ノルム(X 'a * b *表X)= 1

+0

私は1E-15私の結果と同じよう残基を得るようにDSPGVXによって生成

固有ベクトルは正規化されます。彼らの正規化されている場合、彼らはそれに気付く必要があります。 – flow

+0

あなたの答えに感謝します。 私の主な関心事は次のとおりです。なぜなら、これはウェブサイトで報告されているものなので、私の解決策はあなたには残念な結果を与えるからです。 そうでなければ、私はそれらを好きなものにすることができると思いますか? – flow

関連する問題