ich die Funktionen bin mit gsl_eigen_nonsymm und/oder gsl_eigen_symm aus der GSL-Bibliothek die Eigenwerte einer L x L Matrix M[i][j]
die auch t = 1,....,N
eine Funktion der Zeit zu finden, so dass ich M[i][j][t]
haben die Eigenwerte für jeden ti zu bekommen ordnen Sie eine L x L-Matrix E[i][j] = M[i][j][t]
zu und diagonalisieren Sie sie für jedes t.GSL Eigenwerte bestellen
Das Problem ist, dass das Programm die Eigenwerte nach einiger Iteration in unterschiedlicher Reihenfolge gibt. Zum Beispiel (L = 3), wenn bei t = 0
i eigen[t = 0] = {l1,l2,l3}(0)
bei t = 1
bekomme ich eigen[t = 1] = {l3,l2,l1}(1)
bekommen kann, während ich immer haben müssen {l1,l2,l3}(t)
konkreter werden: Betrachten Sie die Matrix M (t)) = {{0,t,t},{t,0,2t},{t,t,0}}
die Eigenwerte immer (approximatevly) sein l1 = -1.3 t , l2 = -t , l3 = 2.3 t
Als ich versuchte, diagonalisieren es (mit dem Code unten) habe ich mehrere Male einen Swap im Ergebnis der Eigenwerte bekommen. Gibt es einen Weg, das zu verhindern? Ich kann sie nicht einfach nach Größe sortieren, ich brauche sie immer in der gleichen Reihenfolge (was auch immer es ist) a priori. (der folgende Code ist nur ein Beispiel, um mein Problem zu erhellen)
EDIT: Ich kann sie nicht einfach sortieren, weil ich a priori ihren Wert nicht kenne oder wenn sie zu jeder Zeit zuverlässig eine Struktur wie l1<l2<l3
haben Statistische Fluktuationen, deshalb wollte ich wissen, ob es einen Weg gibt, den Algorithmus immer gleich zu verhalten, so dass die Reihenfolge der Eigenwerte immer gleich ist oder wenn es einen Trick gibt, um das zu erreichen.
Nur um klarer zu sein, ich werde versuchen, das Spielzeugproblem, das ich hier vorgestellt habe, neu zu beschreiben. Wir haben eine Matrix, die von der Zeit abhängt, ich, vielleicht naiv, erwarte nur lambda_1(t).....lambda_N(t)
zu bekommen, stattdessen sehe ich, dass der Algorithmus oft die Eigenwerte zu verschiedenen Zeiten tauscht, also wenn ich zum Beispiel bei t = 1 I've got (lambda_1,lambda_2,lambda_3)(1) at time t = 2 (lambda_2,lambda_1,lambda_3)(2)
sehen wollte, wie Lambda_1 entwickelt sich in der Zeit kann ich nicht, weil der Algorithmus die Eigenwerte zu verschiedenen Zeiten mischt. Das Programm unten ist nur ein analytisches Spielzeug Beispiel für mein Problem: Die Eigenwerte der Matrix unten sind l1 = -1.3 t , l2 = -t , l3 = 2.3 t
, aber das Programm kann mir als Ausgabe geben (-1.3,-1,2.3)(1), (-2,-2.6,4.6)(2), etc
Wie zuvor gesagt, ich frage mich dann, ob es eine Möglichkeit gibt, das Programm zu bestellen die Eigenwerte sind immer gleich, trotz ihres tatsächlichen numerischen Wertes, so dass ich immer die Kombination (l1, l2, l3) bekomme. Ich hoffe es ist jetzt klarer, bitte sag mir ob es nicht so ist.
#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");
}
}
Ich merke, dass Sie sie nicht sortieren möchten, aber gsl hat Funktionen zum Sortieren sie auch. Ich nehme an, Sie wissen das bereits, aber nur für den Fall ... gsl_eigen_nonsymmv_sort –
Es gibt keine "a priori-Reihenfolge" für Eigenwerte. Bitte erläutern Sie, was Sie daran hindert, sie zu sortieren. – Phillip
Ich habe die Frage bearbeitet, aber im Grunde kann ich sie nicht einfach mit den üblichen Mitteln sortieren, wegen statistischer Fluktuationen, die dazu führen, dass sich die Eigenwerte von Zeit zu Zeit "zufällig" ändern. – Fra