Kapitel 11 Jacobi–Verfahren

Kapitel 11 Jacobi–Verfahren Kapitel 11 Jacobi–Verfahren

physik.uni.graz.at
von physik.uni.graz.at Mehr von diesem Publisher
26.12.2013 Aufrufe

Kapitel 11 Jacobi–Verfahren Im vorigen Kapitel haben wir gesehen, wie man für eine reell-symmetrische Matrix einige wenige Eigenwerte (z.B. größten oder kleinsten) bestimmt. In den folgenden Kapiteln wird diskutiert werden, wie man sämtliche Eigenwerte und Eigenvektoren einer Matrix A berechnen kann. Im Prinzip basieren solche Diagonalisierungsverfahren auf einer Reihe von orthogonalen Ähnlichkeitstransformationen. Wir versuchen durch Transformationen der Form A −→ P T AP (11.1) die Matrix A auf Diagonalform zu bringen. Haben wir dies (innerhalb der gewünschten Rechengenauigkeiten) erzielt, so enthält die Diagonale der transformierten Matrix A die Eigenwerte. Die Eigenvektoren sind durch das Matrixprodukt der Transformationsmatrizen P gegeben. Die verschiedenen Diagonalisierungsverfahren unterscheiden sich durch die Wahl der P ’s. In diesem Kapitel stellen wir das sogenannte Jacobi-Verfahren vor, dass die Matrix A durch eine Reihe von Jacobi-Rotationen auf Diagonalform bringt. Es ist das einfachste Verfahren zur vollständigen Diagonalisierung einer Matrix, und ist darüber hinaus überaus stabil und einfach anzuwenden. Allerdings ist es deutlich langsamer als das im nächsten Kapitel besprochene QL-Verfahren. In tatsächlichen Anwendungen sollte man das Jacobi-Verfahren nur für relativ kleine Matrizen der Ordnung n ∼ 10 verwenden, während man für größere Matrizen dem QL-Verfahren den Vorzug geben sollte. 11.1 Jacobi-Rotation Betrachten wir die Rotationsmatrix 97

<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!