LAPACK falha calcular os autovetores
-
12-12-2019 - |
Pergunta
Eu escrevi algum código para resolver o geral eigenvalue problema e agora eu estou comparando a minha resultados contra LAPACK do DSPGVX
função.Eu só trabalhei com este exemplo.
Então eu obtida a 4 auto vetores
{
{-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}
}
e automaticamente os valores
{-2.22545, 1.12704, -0.454756, 0.100076}
tanto com o meu código e com o Mathematica e resultados concordam.
Mas, no link anterior, o auto-vetores relatados a partir de LAPACK são completamente diferentes.
Eigenvalues
-0.4548 0.1001
Selected eigenvectors
1 2
1 0.3080 0.4469
2 0.5329 0.0371
3 -0.3496 -0.0505
4 -0.6211 -0.4743
Quem devo confiar?
P. S.Eu também verificado que a minha auto valores/autovectors estão corretos, pois eles produzem Uma*x-lambda*B*x=0, enquanto que os valores de LAPACK não.
Solução
Parece que DSGPVX a solução de Um*lambda = B*x*lambda;O Matlab fornece o DSGPVX solução para o seu problema usando "aie", embora o Matlab a documentação está correta.Acho que este é um bug no DSGPVX documentação.
>> 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
Outras dicas
Eu não sei por que você acha que LAPACK está dando respostas incorretas, eles parecem-me muito bem.Usando os quatro figura casas decimais que você cita eu fico resíduos (r = A - x*lambda*B*x) tal que
norma(r1) = 1.5921 e-04, norma(r2) = 6.0842 e-05.
Desde norm(A) = 1.2994 e norm(B) = 7.9874, estes resíduos parecem muito satisfatório.
Os autovetores produzido por DSPGVX são normalizados de modo que
norm(x'*B*x) = 1.
Parece que Lapack resultados realmente correspondem aos dois últimos autovalores gerados por seu código e Mathematica, embora com menor bits de ordem saindo bastante diferentes.Os correspondentes vetores são bastante próximos, apenas dimensionado de forma diferente.
Claramente, se o seu/Mathematica valores de check-out e Lapack não, você deve confiar o que produz as respostas corretas.Ele pode ser valioso para investigar qual é o seu problema, e e Lapack algoritmos do que o tornam muito imprecisa de respostas.