Sto usando le funzioni gsl_eigen_nonsymm e/o gsl_eigen_symm dalla libreria GSL per trovare gli autovalori di una L x L matrice M[i][j]
che è anche in funzione del tempo t = 1,....,N
quindi devo M[i][j][t]
per ottenere gli autovalori per ogni TI allocare una matrice L x L E[i][j] = M[i][j][t]
e diagonalize per ogni t.GSL autovalori ordinare
Il problema è che il programma assegna gli autovalori in ordine diverso dopo una determinata iterazione. Per esempio (L = 3) se in t = 0
ottengo eigen[t = 0] = {l1,l2,l3}(0)
a t = 1
i può ottenere eigen[t = 1] = {l3,l2,l1}(1)
mentre ho bisogno di avere sempre {l1,l2,l3}(t)
Per essere più concreti: considerare la matrice M (t)) = {{0,t,t},{t,0,2t},{t,t,0}}
autovalori saranno sempre (approximatevly) l1 = -1.3 t , l2 = -t , l3 = 2.3 t
Quando ho cercato diagonalizzare (con il codice sotto) ho ottenuto più volte uno scambio nel risultato degli autovalori. C'è un modo per prevenirlo? Non posso solo ordinarli in base alla grandezza, ho bisogno che siano sempre nello stesso ordine (qualunque cosa sia) a priori. (il codice qui sotto è solo un esempio per chiarire il mio problema)
EDIT: Non posso solo ordinarli perché a priori non conosco il loro valore e se hanno in modo affidabile una struttura come l1<l2<l3
in ogni momento a causa di fluttuazioni statistiche, ecco perché volevo sapere se c'è un modo per far si che l'algoritmo si comporti sempre nello stesso modo in modo che l'ordine degli autovalori sia sempre lo stesso o se ci sia qualche trucco per farlo accadere.
Giusto per essere più chiaro proverò a descrivere nuovamente il problema del giocattolo che ho presentato qui. Abbiamo una matrice che dipende dal tempo, io, forse ingenuamente, mi aspetto semplicemente di ottenere lambda_1(t).....lambda_N(t)
, invece quello che vedo è che l'algoritmo spesso scambia gli autovalori in momenti diversi, quindi se a t = 1 I've got (lambda_1,lambda_2,lambda_3)(1) at time t = 2 (lambda_2,lambda_1,lambda_3)(2)
così se ad esempio volessi vedere come lambda_1 si evolve nel tempo non posso perché l'algoritmo mescola gli autovalori in momenti diversi. Il seguente programma è solo un esempio analitico del mio problema: gli autovalori della matrice sottostante sono l1 = -1.3 t , l2 = -t , l3 = 2.3 t
ma il programma potrebbe darmi come output (-1.3,-1,2.3)(1), (-2,-2.6,4.6)(2), etc
Come precedentemente affermato, mi chiedevo se esiste un modo per rendere l'ordine del programma gli autovalori sempre nello stesso modo, nonostante il loro valore numerico effettivo, in modo da ottenere sempre la combinazione (l1, l2, l3). Spero che ora sia più chiaro, per favore dimmi se non lo è.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <gsl/gsl_linalg.h>
#include <gsl/gsl_eigen.h>
#include <gsl/gsl_sort_vector.h>
main() {
int L = 3, i, j, t;
int N = 10;
double M[L][L][N];
gsl_matrix *E = gsl_matrix_alloc(L, L);
gsl_vector_complex *eigen = gsl_vector_complex_alloc(L);
gsl_eigen_nonsymm_workspace * w = gsl_eigen_nonsymm_alloc(L);
for(t = 1; t <= N; t++) {
M[0][0][t-1] = 0;
M[0][1][t-1] = t;
M[0][2][t-1] = t;
M[1][0][t-1] = t;
M[1][1][t-1] = 0;
M[1][2][t-1] = 2.0 * t;
M[2][1][t-1] = t;
M[2][0][t-1] = t;
M[2][2][t-1] = 0;
for(i = 0; i < L; i++) {
for(j = 0; j < L; j++) {
gsl_matrix_set(E, i, j, M[i][j][t - 1]);
}
}
gsl_eigen_nonsymm(E, eigen, w); /*diagonalize E which is M at t fixed*/
printf("#%d\n\n", t);
for(i = 0; i < L; i++) {
printf("%d\t%lf\n", i, GSL_REAL(gsl_vector_complex_get(eigen, i)))
}
printf("\n");
}
}
Mi rendo conto che non si desidera ordinarli, ma gsl ha anche funzioni per l'ordinamento. Immagino che tu lo sappia già, ma nel caso ... gsl_eigen_nonsymmv_sort –
Non esiste un "ordine a priori" per gli autovalori. Si prega di elaborare ciò che ti impedisce di ordinarli. – Phillip
Ho modificato la domanda, ma fondamentalmente non posso semplicemente ordinarli tramite i metodi usuali a causa delle fluttuazioni statistiche che rendono gli autovalori cambiare "casualmente" il loro comportamento di volta in volta. – Fra