26.12.2013 Aufrufe

Kapitel 11 Jacobi–Verfahren

Kapitel 11 Jacobi–Verfahren

Kapitel 11 Jacobi–Verfahren

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

<strong>Kapitel</strong> <strong>11</strong><br />

<strong>Jacobi–Verfahren</strong><br />

Im vorigen <strong>Kapitel</strong> haben wir gesehen, wie man für eine reell-symmetrische Matrix einige<br />

wenige Eigenwerte (z.B. größten oder kleinsten) bestimmt. In den folgenden <strong>Kapitel</strong>n<br />

wird diskutiert werden, wie man sämtliche Eigenwerte und Eigenvektoren einer Matrix<br />

A berechnen kann.<br />

Im Prinzip basieren solche Diagonalisierungsverfahren auf einer Reihe von orthogonalen<br />

Ähnlichkeitstransformationen. Wir versuchen durch Transformationen der Form<br />

A −→ P T AP (<strong>11</strong>.1)<br />

die Matrix A auf Diagonalform zu bringen. Haben wir dies (innerhalb der gewünschten<br />

Rechengenauigkeiten) erzielt, so enthält die Diagonale der transformierten Matrix A die<br />

Eigenwerte. Die Eigenvektoren sind durch das Matrixprodukt der Transformationsmatrizen<br />

P gegeben.<br />

Die verschiedenen Diagonalisierungsverfahren unterscheiden sich durch die Wahl der P ’s.<br />

In diesem <strong>Kapitel</strong> stellen wir das sogenannte Jacobi-Verfahren vor, dass die Matrix A<br />

durch eine Reihe von Jacobi-Rotationen auf Diagonalform bringt. Es ist das einfachste<br />

Verfahren zur vollständigen Diagonalisierung einer Matrix, und ist darüber hinaus<br />

überaus stabil und einfach anzuwenden. Allerdings ist es deutlich langsamer als das im<br />

nächsten <strong>Kapitel</strong> besprochene QL-Verfahren. In tatsächlichen Anwendungen sollte man<br />

das Jacobi-Verfahren nur für relativ kleine Matrizen der Ordnung n ∼ 10 verwenden,<br />

während man für größere Matrizen dem QL-Verfahren den Vorzug geben sollte.<br />

<strong>11</strong>.1 Jacobi-Rotation<br />

Betrachten wir die Rotationsmatrix<br />

97


98 KAPITEL <strong>11</strong>. JACOBI–VERFAHREN<br />

⎛<br />

P pq =<br />

⎜<br />

⎝<br />

1 0<br />

...<br />

c s<br />

...<br />

−s c<br />

...<br />

0 1<br />

⎞<br />

, (<strong>11</strong>.2)<br />

⎟<br />

⎠<br />

die aus einer Diagonalmatrix hervorgeht, wenn man die Elemente in der p-ten und q-ten<br />

Spalte durch c ersetzt, sowie die Matrixelemente an der Position (pq) durch s und an der<br />

Position (qp) durch −s. Hier haben wir die Abkürzung c = cos φ und s = sin φ eingeführt.<br />

Offensichtlich ist die Matrix P pq eine verallgemeinerte Drehmatrix in n Dimensionen.<br />

Hier ist die Strategie des Jacobiverfahrens zur Diagonalisierung der Matrix A. Wir beginnen<br />

damit, das erste Nichtdiagonalelement a 01 auf Null zu setzen. Hierzu führen wir<br />

die Transformation<br />

P T 01AP 01 (<strong>11</strong>.3)<br />

durch und wählen den Winkel φ so, dass a 01 = 0 wird (siehe Diskussion unten). Für eine<br />

symmetrische Matrix wird dann entsprechend auch a 10 auf Null gesetzt.<br />

Als nächstes bringen wir das Matrixelement a 02 durch eine entsprechende Ähnlichkeitstransformation<br />

P 02 mit einem geeigneten Winkel φ auf Null. Allerdings kann diese Transformation<br />

dazu führen, dass das zuvor auf Null gebrachte Element a 01 wieder einen von<br />

Null verschiedenen Wert erhält. Wie jedoch weiter unten gezeigt werden wird, wird die<br />

Summe der Absolutbeträge der Nichtdiagonalterme durch jede Transformation verringert.<br />

Wenn wir also die Ähnlichkeitstransformationen (<strong>11</strong>.2) genügend lange durchführen,<br />

werden die Nichtdiagonalterme innerhalb der numerischen Genauigkeit vernachlässigbar<br />

klein und wir haben die Matrix auf die gewünschte Diagonalform gebracht.<br />

<strong>11</strong>.2 Transformierte Matrix<br />

Betrachten wir die Transformation<br />

A ′ = P T pqAP pq . (<strong>11</strong>.4)<br />

Man überzeugt sich leicht, dass diese Transformation nur die p-te und q-te Zeile bzw. p-te<br />

und q-te Spalte der Matrix A verändert. Wenn wir diese Matrixmultiplikationen explizit<br />

ausführen, erhalten wir für die transformierten Matrixelemente


<strong>11</strong>.2. TRANSFORMIERTE MATRIX 99<br />

a ′ pq = (c 2 − s 2 ) a pq + sc (a pp − a qq )<br />

a ′ pp = c 2 a pp + s 2 a qq − 2sc a pq<br />

a ′ qq = s 2 a pp + c 2 a qq + 2sc a pq<br />

a ′ rp = c a rp − s a rq<br />

a ′ rq = c a rq + s a rp , (<strong>11</strong>.5)<br />

wobei r ∈ [0, n − 1] eine Zahl ungleich p und q ist. Wir wollen c und s so bestimmen,<br />

dass a ′ pq = 0 wird. Es folgt dann, dass<br />

c 2 − s 2<br />

sc<br />

= a qq − a pp<br />

a pq<br />

= 2θ. (<strong>11</strong>.6)<br />

Hier ist der Winkel θ durch die letzte Gleichung bestimmt. Unter Benutzung von t =<br />

tan φ = s/c erhalten wir<br />

1<br />

t − t = 2θ, t2 + 2θt − 1 = 0. (<strong>11</strong>.7)<br />

Wir wählen den Wert, der einer Drehung um den kleineren Winkel entspricht. Umformung<br />

der Gleichung sowie Benutzung trigonometrischer Beziehungen liefert für t, c und s das<br />

Ergebnis<br />

t =<br />

c =<br />

sgn(θ)<br />

|θ| 2 + √ 1 + θ 2<br />

1<br />

√<br />

1 + t<br />

2<br />

s = tc, (<strong>11</strong>.8)<br />

sowie<br />

a ′ pq = 0<br />

a ′ pp = a pp − t a pq<br />

a ′ qq = a qq + t a pq<br />

a ′ rp = c a rp − s a rq<br />

a ′ rq = c a rq + s a rp (<strong>11</strong>.9)


100 KAPITEL <strong>11</strong>. JACOBI–VERFAHREN<br />

für die veränderten Matrixelemente.<br />

Um zu verstehen, dass das Jacobi-Verfahren tatsächlich konvergiert, führen wir die Größe<br />

S = ∑ r≠s<br />

|a rs | 2 (<strong>11</strong>.10)<br />

als Maß für den Betrag der Nichtdiagonalelement ein. Aus Glg. (<strong>11</strong>.9) erkennen wir, dass<br />

durch die Transformation mit P pq der Betrag von S auf<br />

S ′ = S − 2|a pq | 2 (<strong>11</strong>.<strong>11</strong>)<br />

vermindert wird. Da die Transformation orthogonal ist, muss die Summe der Betragsquadrate<br />

der Diagonalterme um 2|a pq | 2 erhöht werden.<br />

<strong>11</strong>.3 Sweeps<br />

Im Jacobi-Verfahren gehen wir nun so vor, dass wir sukzessive für die Matrixelemente<br />

der oberen (oder unteren) Dreieckshälfte der Matrix die Nichtdiagonalelemente auf Null<br />

setzen (ein solcher Durchlauf wird auch als sweep bezeichnet; engl. Ausdruck für Durchlauf).<br />

Offensichtlich werden durch Hintereinanderschalten solcher Ähnlichkeitstransformationen<br />

Matrixelemente, die zuvor bereits Null waren, wieder auf einen Wert ungleich<br />

Null gesetzt. Die sweeps müssen daher solange wiederholt werden, bis S genügend klein<br />

wird.<br />

<strong>11</strong>.4 Eigenvektoren<br />

Das soeben besprochene Verfahren bringt somit die Matrix A durch eine Ähnlichkeitstransformation<br />

der Form<br />

V T AV = D (<strong>11</strong>.12)<br />

auf Diagonalform, wobei die Matrix V durch das Matrixprodukt der hintereinandergeschalteten<br />

Jacobirotationen P i gegeben ist,<br />

Eine Jacobirotation P pq ändert die Matrix V bezüglich<br />

V = P 1 P 2 P 3 . . . . (<strong>11</strong>.13)


<strong>11</strong>.4. EIGENVEKTOREN 101<br />

Jacobi-Verfahren für eine reell-symmetrische n × n-Matrix A<br />

1. Initialisiere V = II und ɛ (z.B. ɛ = 10 −8 )<br />

2. Sweeps<br />

(a) Schleife p = 0, . . . n − 1 über Zeilen<br />

(b) Schleife q = p + 1, . . . n − 1 über Spalten<br />

i. Bestimme t, c und s entsprechend Glg. (<strong>11</strong>.8)<br />

ii. Bestimme die neuen Matrixelemente a ′ pq, a ′ rq und a ′ rp<br />

entsprechend Glg. (<strong>11</strong>.9)<br />

iii. Bestimme die neuen Matrixelemente v ′ rq und v ′ rp<br />

entsprechend Glg. (<strong>11</strong>.15)<br />

3. Falls ∑ i |a′ ii| 2 < ɛ ∑ i≠j |a′ ij| 2 zurück zu 2.<br />

Box <strong>11</strong>.1. Algorithmus des Jacobi-Verfahrens zur Bestimmung der Eigenwerte und Eigenvektoren<br />

einer Matrix A. Nach Abbruch des Algorithmus enthält die Diagonale der<br />

veränderten Matrix A die angenäherten Eigenwerte und die Spalten von V die zugehörigen<br />

Eigenvektoren.<br />

V ′ = V P pq , (<strong>11</strong>.14)<br />

wobei zu Beginn V = II gilt. Man rechnet leicht nach, dass sich bei dieser Transformation<br />

die Matrixelemente bezüglich<br />

v ′ rs = v rs (s ≠ p, s ≠ q)<br />

v rp ′ = c v rp − s v rq<br />

v rq ′ = s v rp + c v rq (<strong>11</strong>.15)<br />

ändern. Nach Abbruch des Jacobi-Verfahrens enthalten die Spalten von V die angenäherten<br />

Eigenvektoren der Matrix A.<br />

In Box <strong>11</strong>.1 ist das vollständige Jacobi-Verfahren dargestellt.


102 KAPITEL <strong>11</strong>. JACOBI–VERFAHREN<br />

<strong>11</strong>.5 Implementierung<br />

Eine Vorlage zur Implementierung des Jacobi-Verfahrens ist in den Dateien<br />

http://physik.uni-graz.at/~uxh/lineare-algebra/Jacobi.h<br />

http://physik.uni-graz.at/~uxh/lineare-algebra/Jacobi.cc<br />

gegeben. In Jacobi.h wird der namespace Jacobi definiert,<br />

1 namespace Jacobi {<br />

2<br />

3 extern double epsilon;<br />

4 extern double ∗e;<br />

5 extern matrix v;<br />

6<br />

7 void eigenvalue(const matrix& m, bool vec=false);<br />

8 };<br />

der in einem aufrufenden Programm über<br />

1 #include ”Jacobi.h”<br />

2<br />

3 using namespace Jacobi;<br />

eingelesen werden kann. epsilon ist der Genauigkeitsparameter, der den Abbruch des<br />

Jacobiverfahrens steuert (siehe Box <strong>11</strong>.1). Nach Aufruf von<br />

1 matrix a(”matrix.dat”);<br />

2<br />

3 eigenvalue(a);<br />

enthält das Array e die angenäherten Eigenwerte. Will man auch die zugehörigen Eigenvektoren<br />

bestimmen, sollte man die Funktion eigenvalue über<br />

1 eigenvalue(a,true);<br />

aufrufen, wobei die Eigenvektoren spaltenweise in v gespeichert werden.<br />

<strong>11</strong>.5.1 Abbruchkriterium<br />

Das Abbruchkriterium für das Jacobi-Verfahren ist in Jacobi.cc in der Funktion<br />

1 bool isDiagonal(const matrix& a)<br />

2 {<br />

3 double sumDiag=0;<br />

4 double sumOffDiag=0;


<strong>11</strong>.5. IMPLEMENTIERUNG 103<br />

5<br />

6 for (int i=0; i


104 KAPITEL <strong>11</strong>. JACOBI–VERFAHREN<br />

auch ihre gespiegelten Partner unterhalb der Diagonale denselben Wert erhalten. Offensichtlich<br />

führt dies zu einer unnötigen Komplikation. In Jacobi.cc lösen wir dieses Problem<br />

mit Hilfe der Definition<br />

1 #define a(i , j ) a(min(i,j ),max(i,j))<br />

Wenn wir später auf die Nichtdiagonalelemente von a über a(i , j) zugreifen, ist stets<br />

gewährleistet, dass wir ausschließlich die Matrixelemente oberhalb der Diagonale verwenden.<br />

Die Vorlage des Jacobi-Verfahrens hat dann die Form<br />

1 void eigenvalue(const matrix& m, bool vec)<br />

2 {<br />

3 matrix a(m); // matrix a must be symmetric<br />

4 int n=a.size(); // n x n matrix<br />

5 int it ; // counter for iterations<br />

6<br />

7 double c,s,t,theta,dum;<br />

8<br />

10<br />

9 if (vec) v=diagonal(n);<br />

<strong>11</strong> for ( it =0; !isDiagonal(a ); it++)<br />

12 {<br />

13 // sweep over upper half of matrix<br />

14 for (int p=0; pzero)<br />

20 {<br />

21 #define a(i , j ) a(min(i,j ),max(i,j))<br />

22<br />

23 // update a(p,p), a(q,q ), and a(p,q)<br />

24 // ...<br />

25<br />

26 for (int r=0; r


<strong>11</strong>.5. IMPLEMENTIERUNG 105<br />

34 if (vec)<br />

35 {<br />

36 // update v(r,p) and v(r,q)<br />

37 // ...<br />

38 }<br />

39 }<br />

40<br />

41 #undef a<br />

42<br />

43 } // end Jacobi rotation<br />

44 } // end sweep<br />

45 } // end iterations<br />

46<br />

47 sortEigenvalue(a,vec);<br />

48 }<br />

Aufgabe <strong>11</strong>.1— Vervollständigen Sie die Funktion eigenvalue. Fügen Sie die<br />

entsprechenden Befehle an den mit<br />

1 // ...<br />

gekennzeichneten Stellen ein. Benutzen Sie die Dateien<br />

http://physik.uni-graz.at/~uxh/lineare-algebra/Jacobi.h<br />

http://physik.uni-graz.at/~uxh/lineare-algebra/Jacobi.cc<br />

Eine Testroutine ist in<br />

http://physik.uni-graz.at/~uxh/lineare-algebra/test-Jacobi.cc<br />

gegeben, bei der die Eigenwerte und Eigenvektoren der Matrix<br />

bestimmt werden.<br />

A =<br />

⎛<br />

⎜<br />

⎝<br />

17 3 2 13<br />

3 <strong>11</strong> <strong>11</strong> 8<br />

2 <strong>11</strong> 8 12<br />

13 8 12 2<br />

⎞<br />

⎟<br />

⎠ , (<strong>11</strong>.16)

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!