Eigenvektorzerlegung einer Matrix



  • Hi Leute 🙂

    Ich habe 2 Matrizen A und B gegeben und ich muss eine Eigenvektorzerlegung von folgendem Ausdruck berechnen:

    A1BA^{-1}B

    wobei die Inverse in diesem Fall nur die Pseudoinverse ist. A und B sind symmetrisch, und typischerweise groß (400x400 oder größer). Der Rang von A ist immer sehr klein, so zwischen 2 und 10.

    Wenn ich die Eigenvektoren naiv berechne, muss ich folgendes machen:
    1. Eigenvektorzerlegung von A, A invertieren
    2. den Ausdruck berechnen
    3. Eigenvektorzerlegung des Ausdrucks.

    Nun ist es echt blöd, wenn ich 2x die Eigenvektorzerlegung einer so großen Matrix berechnen muss. Ist es eventuell möglich, das Wissen über die Eigenvektoren von A zu verwenden, um das Ganze zu beschleunigen? Oder gibt es vielleicht spezialisierte Verfahren, die Ausnutzen das ich den Rang von A kenne und dieser sehr klein ist?



  • Ich denke mal ein bisschen laut:

    n=400 ist *nicht* groß. Wenn du dir sicher bist, dass es nicht viel schlimmer wird, würde ich erstmal naiv bleiben. Es sei denn, du hast Spaß an Numerik 🙂

    Der Rang von A ist klein. Das bedeutet, fast alle Eigenwerte bzw Singulärwerte sind Null. Vielleicht kannst du Verfahren anwenden, die die Betragsmäßig größten Eigenwerte ausrechenen. Wenn du ein paar kleine Eigenwerte wegläßt, macht das normalerweise nichts - meist ist der Fehler dadurch um Größenordnungen kleiner als die benötigte Genauigkeit.

    Ist A regulär? Dann kann man vielleicht auch sowas aufschreiben:
    Singulärwertzerlegung von A $$A=USV^T$
    Eigenwertzerlegung von B (die musst du dann wohl doch ausrechnen)

    B=X\LambdaX^{-1}

    Zusammen: A1B=VTS1UXΛX1A^{-1}B = V^TS^{-1}U X \Lambda X^{-1}

    Kommt man da vielleicht weiter?



  • Noch ein Gedanke: Vielleicht kann man auch mal über den Rang der Matrix A^-1 * B nachdenken. Wahrscheinlich kommt man dann darauf, dass der Rang der Gesamtmatrix auch klein ist. Dann ist man wieder an dem Punkt, dass man eine Matrix mit geanz vielen Null-Eigenwerten hat. Brauchst du dazu auch die Eigenvektoren? Oder reichen dir die Eigenvektoren zu den "großen" Eigenwerten? Oft kommt man damit aus, weil die Eigenvektoren zu kleinen Eigenwerten nicht viel "Information" zur Gesamtmatrix hinzufügen. Ein beliebter Trick zum Matrixkomprimieren ist es ja, kleine Singulärwerte (bzw. Eigenwerte) gleich Null zu setzen und dann nur die Basis zu den "großen" Singulärwerten zu merken (--> Niedrigrangapproximation).

    "Große" Eigenwerte kann man zb recht Zielsicher mit der Potenzenmethode finden.



  • Hi,

    du kannst das Ganze als generalisiertes Eigenwertproblem umschreiben:

    $A^{-1]B \lambda = \lambda x$ $\Leftrightarrrow B \lambda = A \lambda x$

    Dafür gibt es ein paar spezielle Algorithmen die die Struktur ausnutzen können und stabiler sind als wenn man direkt A^(-1)B ausrechnet. Stichwort Arnoldi Basis. Du könntest dir mal ARPACK bzw. ARPACK++ anschauen, wenn du Lösungen in Fortran/C++ suchst.

    mfG
    KaPtainCugel

    EDIT: Was mach ich bei den Latex Tags falsch?



  • Manchmal sieht man den Baum vor lauter Wäldern nicht...

    Der Hinweis von KPC ist natürlich genau der richtige.

    Wenn alles symmetrisch ist, müsste das auch mit einem Lanczos-artigen Verfahren lösbar sein. ARPACK klingt gut.



  • Danke euch schonmal. Uff, dann gibts wohl keine einfache Lösung dafür. Und von diesen numerischen Algorithmen habe ich mal so gar keine Ahnung...uff, da muss ich mich wohl ne Weile mit beschäftigen.



  • Machs doch einfach so, wie KPC vorgeschlagen hat. Für das Eigenwertproblem
    Ax=lambda*Bx
    gibts bestimmt schon was fertiges zum runterladen 🤡


Anmelden zum Antworten