Generalisiertes Eigenwertproblem / LAPACK

Hallo zusammen,

ich habe ein kleines Problem, bei dem Ihr mir hoffentlich helfen könnt.

Ich habe zwei Matrizen A und B und muss dafür das generalisierte Eigenwertproblem, also die Gleichung:

A*x = lambda*B*x

lösen. A ist die Laplacian Matrix eines Graphen, auf der Diagonalen steht also jeweils der Grad eines Knotens, sind zwei Knoten mit einander verbunden ist der korrespondierende Eintrag -1, sonst ist die Matrix mit 0 aufgefüllt. Damit ist sie ja symmetrisch. B hat einfach auf der Diagonalen jeweils den Grad des Knotens. Und damit ist B auch symmetrisch. Was ich weiss, ist, dass 0 immer einer der Eigenwerte sein soll, wenn man das Problem für diese beiden Matrizen löst.

Jetzt mein Problem: Als einziges Paket, dass das generalisierte Eigenwertproblem lösen kann (und das ich beim Programmieren benutzen kann), habe ich bisher LAPACK bzw. JLAPACK (ich programmiere in Java) gefunden. Allerdings gibt es hier ziemlich viele verschiedene Methoden, die das Problem für verschiedene Fälle lösen.
Die Lösungen für die Fälle, dass mehr als eine der Matrizen nicht symmetrisch ist, kann ich wohl aussen vor lassen. Bei den symmetrischen Fällen gibt es dann teilweise die Einschränkung, dass B positiv definit sein muss, also alle Eigenwerte > 0 sein sollen für B. Da das so ist (denke ich), habe ich mich letztlich für DSYGV entschieden (falls sich jemand mit LAPACK auskennt). Problem: 0 ist für ein konkretes Fallbeispiel, das ich reingesteckt habe, keiner der Eigenwerte.

Aus diesem Dilemma ergeben sich folgende Fragen:

  • Ist eine Matrix mit den Eigenschaften von B wirklich immer positiv definit? Wenn sie das nicht wäre, würde die Berechnung so wie ich sie habe machen lassen nicht funktionieren. Es klappt aber alles, nur ist 0 nicht wie gefordert einer der Eigenwerte.

  • 0 ist nicht bei den Eigenwerten dabei - naja, so ganz stimmt das nicht. Der niedrigste gefundene Eigenwert liegt im Bereich von 10^-16, ist also schon ziemlich klein. Der nächst größere ist 15 Größenordnungen größer. Kann es sein, dass ich durch die Beschränkungen meines Rechners nicht genau auf 0 sondern nur nahe an 0 komme?

  • Für die Berechnung von Eigenwerten findet man ziemlich viele Beispiele, so dass man immer schön überprüfen kann, ob man es richtig gemacht hat oder nicht - für das generalisierte Problem ist das etwas schwieriger, ich konnte bisher kein Beispiel dazu finden. Kann jemand ein einfaches kleines Beispiel für die Lösung des generalisierten Problems geben, wenn möglich mit Matrizen die die oben genannten Eigenschaften haben? Dann wüsste ich wenigstens, wann ich richtig liege.

  • Kennt sich jemand mit LAPACK aus und weiss ob ich für den oben beschriebenen Fall mit DSYGV die richtige Routine benutze?

  • Kennt jemand andere Programme / Bibliotheken, die das Problem lösen können? Wir haben hier sonst noch Mathematica, aber das ist anscheined zur Lösung auf irgendetwas externes angewiesen, mit dem ich nicht dienen kann.

Dann schonmal vielen Dank fürs zuhören.

Viele Grüße
Schorsch

Hallo zusammen

Hallo !

  • Ist eine Matrix mit den Eigenschaften von B wirklich
    immer positiv definit? Wenn sie das nicht wäre, würde die
    Berechnung so wie ich sie habe machen lassen nicht
    funktionieren. Es klappt aber alles, nur ist 0 nicht wie
    gefordert einer der Eigenwerte.

Wenn ich dich richtig verstanden habe ist B eine Diagonalmatrix. Damit ist B genau dann positiv definit wenn alle Diagonalelemente echt positiv sind.
Ist B nicht positiv definit kannst DSYGV trotzdem damit füttern, dann ist INFO danach aber nicht 0. Du solltest nach dem Aufruf von DSYGV auf jeden Fall den INFO-Parameter checken, damit du weißt ob das Ergebnis auch was sinnvolles zu bedeuten hat.

  • 0 ist nicht bei den Eigenwerten dabei - naja, so
    ganz stimmt das nicht. Der niedrigste gefundene Eigenwert
    liegt im Bereich von 10^-16, ist also schon ziemlich klein.
    Der nächst größere ist 15 Größenordnungen größer. Kann es
    sein, dass ich durch die Beschränkungen meines Rechners nicht
    genau auf 0 sondern nur nahe an 0 komme?

Genauso ist es, der Bereich um 10^-16 ist bei den meisten Rechnern die sogenannte Maschinengenauigkeit, d.h. die kleinste positive Zahl mit der der Computer noch rechnen kann. Wenn du von einem Computer irgendwas im Bereich von 10^-16 als Ergebnis einer Rechnung bekommst, kannst du getrost davon ausgehen, das eigentlich 0 rauskam.

  • Kennt sich jemand mit LAPACK aus und weiss ob ich
    für den oben beschriebenen Fall mit DSYGV die richtige Routine
    benutze?

Ich denke, das ist schon die richtige Routine. Du solltest nur wie gesagt danach checken ob der INFO-Parameter 0 ist.

Viel Erfolg !

hendrik

Hallo Hendrik,

vielen Dank für deine Antworten. Ja, B ist eine Diagonalmatrix, und alle Diagonaleinträge sind in meinem Fall immer positiv. Ja ausgezeichnet, dann haut das ja alles hin. INFO war in allen Fällen die ich ausprobiert habe 0, er ist also schön durchgelaufen. Und wenn ich jetzt doch immer die 0 bei den Eigenwerten dabei habe - wunderbar.

Dann klappt ja alles, wie ich gehofft habe :smile:

Vielen Dank
Schorsch