NumLinAlg WS56 Übungsblatt 2 Musterlösung Lösung 44 (QR-Algorithmus mit Wilkinson-Shift und Deflation) a)+b) Die QR-Iteration zur Berechnung aller Eigenwerte einer Matrix A kann wie folgt implementiert werden: function [V,D] = qr_eig(a,max_iter) 2 % Berechnet die Eigenwerte und Eigenvektoren von A mittels 3 % QR Iteration, wobei A schon in Hessenberg Form ist. 4 % max_iter ist die maximale Anzahl von Iterationen 5 % Rueckgabe: D Diagonalmatrix mit Eigenwerten von A 6 % V Orthonormalbasis mit Eigenvektoren von A 7 8 % QR Schleife mit Givens Rotationen 9 [n, ~] = size(a); 0 Qall = eye(n); for k=:max_iter 2 A_old = A; 3 [Q,R] = qr_givens(a); 4 A = R*Q; 5 Qall = Qall*Q; 6 if(norm(a A_old,'fro')<eps*norm(A,'fro')) 7 break; 8 end 9 end 20 % Eigenwerte stehen auf der Diagonalen von R 2 D = diag(a); 22 % Berechnung der Eigenvektoren der oberen Dreiecksmatrix R. 23 % Nicht noetig wenn R Diagonalmatrix 24 V = qr_eigenvect(a); 25 % Transformation auf die Eigenvektoren von A 26 V = Qall*V; Die Funktion qr_givens(a) ist die selbe Routine aus Aufgabe 23. Die Funktion qr_eigenvect(r) ist wie folgt definiert: function V = qr_eigenvect(r) 2 3 % Berechnet die Eigenvektoren der oberen Dreiecksmatrix R 4 % durch (R lambda*i)v=0 5 6 % Groesse der Matrix R 7 n = size(r,); 8 % Initialisieren der Loesung 9 V = zeros(n,n);
0 % Durchfuehrung des Algorithmus for k=:n 2 % Setze untersten Eintrag auf 3 V(k,k) = ; 4 % Berechne die anderen Eintraege 5 for i=k : : 6 V(i,k) = (R(i,i+:k)*V(i+:k,k))/(R(k,k) R(i,i)); 7 end 8 % normiere die Vektoren 9 V(:,k) = V(:,k)/norm(V(:,k)); 20 end Wir generieren die zwei Matrizen mit dem Skript % Maximale Anzahl von Iterationen des QR Algorithmus 2 max_iter = 2000; 3 4 % Definition der D Poisson Matrix 5 v = 2*ones(20,); 6 w = ones(9,); 7 P = diag(v)+diag(w,)+diag(w, ); 8 9 % Definition der Gauss Matrix 0 n = 4; beta = ones(n,); 2 G = zeros(n+,n+); 3 for i=:n 4 beta(i) = 0.5*( (2*i)^( 2))^( 0.5); 5 G(i,i+) = beta(i); 6 G(i+,i) = beta(i); 7 end Wir wenden die QR-Iteration an den zwei angegebenen Matrizen an. % Teil a) und b) 2 [eigvp, eigwp] = eig(p); 3 [eigvg, eigwg] = eig(g); 4 fehler_p = zeros(max_iter/00,); 5 fehler_g = zeros(max_iter/00,); 6 for i=00:00:max_iter 7 [VP,DP] = qr_eig(p,i); 8 fehler_p(i/00) = norm(sort(dp) sort(diag(eigwp)),2); 9 if(fehler_p(i/00)<0^ 3) 0 break end 2 end 3 for i=00:00:max_iter 4 [VG,DG] = qr_eig(g,i); 5 fehler_g(i/00) = norm(sort(dg) sort(diag(eigwg)),2); 6 end 7 for i = :size(dp,) 8 err_p_matlab(i) = norm(p*eigvp(:,i) eigwp(i,i)*eigvp(:,i),2); 9 err_p_qr_eig(i) = norm(p*vp(:,i) DP(i)*VP(:,i),2); 20 end 2 norm(err_p_matlab,inf) 2
22 norm(err_p_qr_eig,inf) 23 for i = :size(dg,) 24 err_g_matlab(i) = norm(g*eigvg(:,i) eigwg(i,i)*eigvg(:,i),2); 25 err_g_qr_eig(i) = norm(g*vg(:,i) DG(i)*VG(:,i),2); 26 end 27 norm(err_g_matlab,inf) 28 norm(err_g_qr_eig,inf) 29 30 % grafische Ausgabe des Fehlers in Abhaengigkeit von n 3 semilogy(00:00:max_iter,fehler_p,00:00:max_iter,fehler_g,'linewidth',3); 32 set(gca,'fontsize',4); 33 legend('poisson Matrix','Gauss Matrix','Location','South'); 34 xlabel('iterationen des QR Alg'); 35 ylabel('fehler'); 36 title('fehler der EW Berechnung mit QR Alg') 37 38 %% Teil c) und d) 39 % QR Algorithmus mit Rayleigh Shift 40 [VR, DR, fehler_rayleigh] = qr_eig_shift(g,); 4 lr = size(fehler_rayleigh,2); 42 subplot(,2,) 43 semilogy(:lr,fehler_rayleigh,'linewidth',3); 44 set(gca,'fontsize',4); 45 xlabel('iterationen des QR Alg'); 46 ylabel('fehler'); 47 title('fehler der EW Berechnung beim QR Alg mit Rayleigh Shift') 0 5 Fehler der EW-Berechnung mit QR-Alg 0 0 Fehler 0-5 0-0 Poisson Matrix Gauss-Matrix 0-5 0 500 000 500 2000 Iterationen des QR-Alg Der QR-Iteration für die Matrix G konvergiert nicht, weil die Eigenwerte von G symmetrisch sind, d.h. falls λ ein Eigenwert von G ist, dann ist λ auch ein Eigenwert. Beispiel dazu: ( ) 0 A = 0 3
Die Eigenwerte der Matrix A berechnen sich zu λ = und λ 2 =. Dann folgt mit der QR-Zerlegung A (0) = Q (0) R (0) mit ( ) ( ) 0 0 Q (0) =, R (0) = 0 0 und somit A () = R (0) Q ( (0) )( ) 0 0 = 0 0 ( ) 0 =. 0 Also konvergiert die QR-Iteration auf A nicht. c)+d) Die QR-Iteration mit Shift µ kann wie folgt implementiert werden: function [V,D,fehler] = qr_eig_shift(a,shift) 2 % qr_eig_shift berechnet die Eigenwerte der Matrix A mittels... QR Iteration 3 % mit Shift, wobei A schon in Hessenberg Form ist. 4 % Das Input Parameter shift beziechnet die Wahl des Shiftes: 5 % shift = => Rayleigh Shift 6 % shift!= => Wilkinson Shift 7 % Rueckgabe: D : Diagonalmatrix mit den Eigenwerten von A 8 % V : Orthonormalbasis mit Eigenvektoren von A 9 % fehler: Vektor der Werten a^k_{(n,n)} a^(k )_{(n,n)}. 0 [N,~] = size(a); 2 tol = 0^( 6); % Tolleranz 3 D = zeros(n,); % Initialisierung des Vektors der Eigenwerte 4 k = ; % Iterationszaehler 5 Qall = eye(n); % Initialisierung der orthogonalen Matrix 6 Rall = zeros(n,n); % Initialisierung der oberen Dreiecksmatrix 7 8 for n=n: :2 9 Atemp = A(n,n); 20 while (k<3000 &&... abs(a(n,n ))>tol*(abs(a(n,n))+abs(a(n,n )))) %... Abbruchkriterien 2 if shift == % Rayleigh Shift 22 mu = A(n,n); 23 else % Wilkinson Shift 24 d = (A(n,n ) A(n,n))/2; 25 if (d ~= 0) 26 mu = A(n,n)+d sign(d)*sqrt(d^2+a(n,n)^2); 27 else 28 mu = A(n,n) A(n,n)^2; % Falls d=0, setze sign(0)=+ 29 end 30 end 3 [Q,R] = qr_givens(a mu*eye(n)); % QR Zerlegung 32 A = R*Q+mu*eye(n); % Neue Iterierte A(k+) 33 fehler(k) = abs(a(n,n) Atemp); 4
34 k = k+; 35 Qall(:n,:n) = Qall(:n,:n)*Q; 36 Atemp = A(n,n); 37 end 38 D(n) = A(n,n); % Speicher den n ten Eigenwert von A 39 Rall(:n,n) = A(:n,n); 40 A = A(:n,:n ); % Deflation 4 if n==2 % Letzter Fall 42 D()=A(,); 43 Rall()=A(,); 44 end 45 end 46 % Berechnung der Eigenvektoren der oberen Dreiecksmatrix R. 47 % Nicht noetig wenn R Diagonalmatrix 48 V = qr_eigenvect(rall); 49 % Transformation auf die Eigenvektoren von A 50 V = Qall*V; % Teil c) und d) 2 % QR Algorithmus mit Rayleigh Shift 3 [VR, DR, fehler_rayleigh] = qr_eig_shift(g,); 4 lr = size(fehler_rayleigh,2); 5 subplot(,2,) 6 semilogy(:lr,fehler_rayleigh,'linewidth',3); 7 set(gca,'fontsize',4); 8 xlabel('iterationen des QR Alg'); 9 ylabel('fehler'); 0 title('fehler der EW Berechnung beim QR Alg mit Rayleigh Shift') 2 3 % QR Algorithmus mit Wilkinson Shift 4 [VW, DW, fehler_wilkison] = qr_eig_shift(g,2); 5 lw = size(fehler_wilkison,2); 6 subplot(,2,2) 7 semilogy(:lw,fehler_wilkison,'linewidth',3); 8 set(gca,'fontsize',4); 9 xlabel('iterationen des QR Alg'); 20 ylabel('fehler'); 2 title('fehler der EW Berechnung beim QR Alg mit Wilkinson Shift') Lösung 45 (Konvergenz von Iterationsverfahren) a) Für eine aus einer Vektornorm erzeugte Matrixnorm gilt es: M = sup x 0 Mx x λ i für alle Eigenwerte λ i von M. Daraus folgt direkt 0 2 (M) = max i ( λ i ) M. ( ) b) Sei M = 2. Es folgt, dass λ,2 = gilt. Damit gilt auch (M) =. Es gilt: 2 2 Mx M = sup x =0 x = sup Mx. 5
Mit = 2 die euklidische Norm folgt M = sup = sup Mx = sup ( 2 x ) +x 2 2 x 2 4 x2 +x x 2 +x 2 2 + 4 x2 2 5 4 >, wobei wir den Vektor x = (0,) gewählt haben. Damit gilt: Nein, der Umkehrschluss aus Teilaufgabe a) folgt nicht. Die in Teilaufgabe a) gegebene Bedingung zur Konvergenz eines Verfahrens ist nur hinreichend, aber nicht notwendig! 6