Kapitel 11 Jacobi–Verfahren
Kapitel 11 Jacobi–Verfahren
Kapitel 11 Jacobi–Verfahren
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)