MSE Mathe 4 SS Übungsblatt Musterlösung Lösung (Solution) Siehe MATLAB Codes function [x_new, it, rho] = jacobi (A, x_start, b, TOL, it_max) 3 % Set up all the quantities used during iteration 4 % Diagonal matrix part of A d = diag(a); 6 D = diag(d); 7 % Iteration matrix N = diag(./d); 9 0 % Spectral radius rho = max(abs(eigs(eye(3)-n*a))); 3 % Jacobi Iteration 4 % Initialize the iteration variable x with the initial value x = x_start; 6 7 % Iterate for a maximum number of iterations for it = :it_max 9 % Jacobi update 0 x_new = x + N * (b - A * x); % Check the size of the residuum, if it is smaller than TOL --> % done 3 if norm(x_new-x)/norm(x) < TOL 4 break; elseif norm(x) <= eps && norm(x_new-x) < e6*eps 6 break; 7 end x = x_new; 9 end 30 3 end function [x_new, it, rho] = gs (A, x_start, b, TOL, it_max) 3 % Set up all the quantities used during iteration 4 % Diagonal matrix part of A d = diag(a); 6 D = diag(d); 7 % Lower triangular part of A L = tril(a,-);
9 % Upper triangular part of A 0 U = triu(a,); % GS-Matrix to be inverted N = inv(d + L); 3 4 % Spectral radius rho = max(abs(eigs(eye(3)-n*a))); 6 7 % GS Iteration % Initialize the iteration variable x with the initial value 9 x = x_start; 0 % Iterate for a maximum number of iterations for it = :it_max 3 % GS update 4 x_new = x + N * ( b - A * x ); % Check the size of the residuum, if it is smaller than TOL --> 6 % done 7 if norm(x_new-x)/norm(x) < TOL break; 9 elseif norm(x) <= eps && norm(x_new-x) < e6*eps 30 break; 3 end 3 x = x_new; 33 end 34 3 end % Eingabe der Matrizen 3 A = [,-,0;-,,-;0,-,]; 4 B = [,,;,,;,,]; 6 % Eingabe der Parameter 7 nmax = 000; tol = e-; 9 x0 = [,,] ; 0 b = [0,0,0] ; % Matrix A 3 [x_jacobi, iter_jacobi, rho_jacobi] = jacobi (A,x0,b,tol,nmax); 4 [x_gs, iter_gs, rho_gs] = gs (A,x0,b,tol,nmax); 6 % Matrix B 7 [x_jacobi, iter_jacobi, rho_jacobi] = jacobi (B,x0,b,tol,nmax); [x_gs, iter_gs, rho_gs] = gs (B,x0,b,tol,nmax);
Lösung (Jacobi- und Gauß-Seidel-Verfahren) 0 0 0 0 0 Es sei: L = 0 0 0, U = 0 0 0 und D = 0 0 0 0 0 α 0 0 0 α 0 0 0 α Die Jacobi-Iteration konvergiert, falls der Spektralradius ρ(m Jac ) der Iterationsmatrix M Jac echt kleiner ist. Die Iterationsmatrix M Jac = I D A errechnet sich wie folgt: 0 0 M Jac = I D (D+L+U) = I D D D (L+U) = D α (L+U) = 0 0 0 0 0 α Die Matrix M Jac besitzt das folgende Spektrum: σ(m Jac ) = { 0, α α},. Damit ist die Konvergenzbedingung ρ(m Jac ) < erfüllt, falls α > gilt. Die Gauß-Seidel-Iteration konvergiert, falls der Spektralradius ρ(m GS ) der Iterationsmatrix M GS echt kleiner ist. Die Iterationsmatrix M GS = I (D +L) A errechnet sich analog zu vorhin wie folgt: M GS = (D+L) U = 0 0 α 0 0 0 0 0 α Die Matrix M GS besitzt das folgende Spektrum: σ(m GS ) = { 0,0, α }. Damit ist die Konvergenzbedingung ρ(m GS ) < erfüllt, falls α > gilt. Lösung 3 (Konvergenz von linearen Iterationsverfahren) a) Mit der Matrix M lässt sich bei Konvergenz (ρ(m) < ) die Fehlerreduktion schreiben als: e (k) = x (k+) x (k) ρ(m) k x () x (0) = ρ(m) k e (0) Um die Anzahl der Schritte für eine vorgegebene Toleranz T OL zu bestimmen, berechnen wir:. e (k) ρ(m) k x () x (0) = ρ(m) k e (0) TOL ( ) ρ(m) k TOL TOL log e (0) k e (0) log(ρ(m)) b) Erläutern Sie inwiefern It(M) := den Fehler der k-ten Iterierten gilt: log(ρ(m)) ein Maß für die Fehlerreduktion ist. Für u (k) u ρ(m) k u (0) u Logarithmieren liefert: log u (k) u klogρ(m)+log u (0) u Woraus sich log ρ(m) als Näherung für die Steigung des Fehlerabfalls ergibt (vgl. Abb. ). Damit ist It(M) := eine untere Abschätzung für die Anzahl der log(ρ(m)) Iterationen (siehe Abschätzung in a)). 3
0 0 Fehler 0 3 0 000 000 3000 4000 Iterationen Abbildung : Beispielhafter Fehlerabfall fürs Jacobiverfahren c) Gesamtkosten C ges des Verfahrens lassen sich bestimmen als C ges = #Iterationen C = k C. Diese lassen sich durch C ges It(M) C schätzen. d) Für It(M i ) gilt: It(M ) = log(ρ) It(M ) = log(ρ 3 ) = 3log(ρ) = 3 It(M ) It(M 3 ) = log(ρ 3) = 3 log(ρ) = 3 It(M ) e) Für die Gesamtkosten ergibt sich zunächst C,ges = It(M ) c C,ges = It(M ) c = 3 It(M ) c = 3 C,ges C 3,ges = It(M 3 ) c = 3 It(M ) c = 3 C,ges Woraus sich C,ges < C,ges < C 3,ges ablesen lässt. Lösung 4 (Vergleich von iterativen Verfahren) a) Um die beiden Löser vergleichen zu können, berechnen wir wieviele Schritte der Löser benötigt um einen Fehler e k um den Faktor zu reduzieren mit den Konvergenzraten ρ, ρ gilt für einen e Iterationsschritt: und für l bzw. l Iterationsschritte: e k+ = ρ e k bzw. e k+ = ρ e k e k+l = ρ l e k bzw. e k+l = ρ l e k. 4
Mit folgt: ρ l = e und ρl = e l = lnρ 0.63 und l = lnρ 0.333. Wegen l l ist das erste Verfahren zu bevorzugen, da der Aufwand des. Verfahrens in einem Schritt doppelt so hoch ist wie der Aufwand des ersten Verfahrens in einem Schritt. b) Eine analoge Rechnung wie in a) liefert, dass wirρ l = mitρ = 0. lösen möchten. 00 Die Lösung dieser Gleichung ist l.6, d.h. es sind ungefähr.6 Iterationsschritte nötig um den Fehler um den Faktor zu reduzieren. 00 c) Der erste Schritt des Jacobi-Verfahrens zur Lösung von Ax = b lautet: x = x 0 +D (b Ax 0 ) = x 0 +D (Ax Ax 0 ) = x 0 D Ax 0 +D Ax. Damit nun x = x unabhängig von x 0 gelten kann, muss A = D erfüllt sein. Das Jacobi-Verfahren ist also für Diagonalmatrizen im ersten Schritt exakt. Modellierung Lösung (Numerische Lösung der Wärmeleitungsleichung) Wir wollen das folgende System gewöhnlicher Differentialgleichungen { y (t) = A h y(t), y(0) = y 0, () lösen, wobei A h = h......... R N N, h = N + d.h. die Matrix A ist in der Zeit konstant. Aus der Aufgabe wissen wir, dass die Matrix A diagonalisierbar ist, d.h. es gibt eine Basiswechselmatrix V, so dass ( ) iπ V AV = Λ = diag(λ,...,λ N ), mit λ i = cos. N + Setze nun u(t) := V y(t). Dann erhalten wir das System V Vy (t) = V AVy(t) { u (t) = Λu(t) u(0) = V y 0.
a) Mit dem expliziten Euler-Verfahren lässt sich die Lösung komponentweise alsu k+,i = u k,i + tλ i u k,i schreiben. Die rekursive Anwendung des Verfahren führt zur Formel u k+,i = (+ tλ i ) k u 0,i. Damit die Lösung stabil bleibt, müssen wir + tλ i für jedes i =,...,N verlangen. Das ist äquivalent dazu + tλ i. Da alle Eigenwerte λ i < 0 sind, erhalten wir die Einschränkung (den Vorfaktor /h nicht vergessen und den betragsgrößten Eigenwert betrachten) t λ N = h cos ( ) h Nπ. N+ b) Beim impliziten Euler-Verfahren haben wir u k+,i = u k,i + tλ i u k+,i, das heißt ( ) ku0 u k+,i = tλ i. Damit wollen wir tλ i haben und das passiert genau dann, wenn tλ i ( tλ i ) tλ i tλ i, was immer erfüllt ist, weil λ i < 0 für jedes i. Also gibt es beim impliziten Euler- Verfahren keine Abhängigkeit von der Zeitschritten bzgl. der Ortdiskretisierung. c) Beim Crank-Nicolson-Verfahren haben wir die Situation u k+,i = u k,i + t ) (λ i u k,i +λ i u k+,i u k+,i = + t λ i tλ u k,i. i Da für jeden Eigentwert λ i < 0 gilt, ist dann + t λ i. Das bedeutet, das Crank- t λ i Nicolson-Verfahren ist numerisch stabil, unabhängig von der Ortdiskretisierung. d) Mögliche Implementierungen von den oben genannten Verfahren: function [tn,yn]=eulero_expl(f,tn,dt,y0) 3 % Inizialisierung der Lösung 4 yn(:,) = y0; 6 % Anzahl der Intervalle in der Zeitdiskretisierung 7 n=length(tn); 9 % Lösung der Differentialgleichung via explizites Euler-Verfahren 0 for i = :n yn(:,i) = yn(:,i-)+dt*feval(f,tn(i-),yn(:,i-)); end 3 end function [tn,yn]=eulero_imp(a,tn,dt,y0) 3 % Inizialisierung der Lösung 4 yn(:,) = y0; 6
6 % Anzahl der Intervalle in der Ortdiskretisierung 7 [N, ~]=size(a); 9 % Anzahl der Intervalle in der Zeitdiskretisierung 0 n=length(tn); % Lösung der Differentialgleichung via implizites Euler-Verfahren 3 for i = :n 4 yn(:,i) = (eye(n)-dt*a)\yn(:,i-); end 6 end function [tn,yn]=crank_nicolson(a,tn,dt,y0) 3 % Inizialisierung der Lösung 4 yn(:,) = y0; 6 % Anzahl der Intervalle in der Ortdiskretisierung 7 [N, ~]=size(a); 9 % Anzahl der Intervalle in der Zeitdiskretisierung 0 n=length(tn); % Lösung der Differentialgleichung via Crank-Nicolson-Verfahren 3 for i = :n 4 yn(:,i) = yn(:,i-)+(dt/)*a*yn(:,i-); yn(:,i) = (eye(n)-(dt/)*a)\yn(:,i); 6 end 7 end zusammen mit dem Main File: % Angabe der Paramenter des Problems a=0; b=; % Ortintervall, d.h. 0 <= x <= b 3 t0 = 0; T = ; % Anfangs- und Endszeitpunkt 4 N=0; % Anzahl der Unterintervalle von [a,b] dx=(b-a)/(n+); % Definition der Ortsschrittweite 6 xn=a:dx:b; 7 y0 = ; % Anfangswert 9 % Aufbau der Matrix A, die aus der Ortsdiskretisierung der 0 % Wï rmeleitungsgleichung durch symmetrische finite Differenzen herkommt. A = diag(-*ones(n,))+diag(ones(n-,),-)+diag(ones(n-,),); A=A/(dx^); 3 4 % Implementierung der rechten Seite der Differentialgleichung y =f(t,y). % In diesem Fall ist f(t,y)=ay, 6 func = @(t,y) A*y; 7 % Anfangswert der Lï sung 7
9 y = -4*y0*xn.*(xn-); 0 y = y(:end-); 3 % Verschiede Wahl der Zeitschrittweite 4 for i=:3 if (i==) 6 dt = (dx^)/; 7 elseif (i==) dt = (dx^)/.9; 9 else 30 dt =.0; 3 end 3 tn=t0:dt:t; % Vektor der Zeiten, wobei wir die Lï sung approximieren 33 34 % Berechnung der numerischen Lï sung mit dem expliziten Euler-Verfahren 3 [tn,yn_ee] = eulero_expl(func,tn,dt,y); 36 % Berechnung der numerischen Lï sung mit dem imliziten Euler-Verfahren 37 [tn,yn_ei] = eulero_imp(a,tn,dt,y); 3 % Berechnung der numerischen Lï sung mit dem Crank-Nicolson-Verfahren 39 [tn,yn_cn] = crank_nicolson(a,tn,dt,y); 40 4 % Plot der approximierten Lï sungen 4 subplot(3,3,i); 43 set(gca, FontSize,); 44 if (i==) 4 title(sprintf( dt=dx^/ )) 46 elseif (i==) 47 title(sprintf( Explizites Euler-Verfahren\n dt=dx^/.9 )) 4 else 49 title(sprintf( dt=.0 )) 0 end hold on; plot(tn,yn_ee(0,:), b ); 3 xlabel( Zeit ); 4 ylabel( Loesung ); hold all 6 7 subplot(3,3,3+i); set(gca, FontSize,); 9 if (i==) 60 title(sprintf( Implizites Euler-Verfahren )) 6 end 6 hold on; 63 plot(tn,yn_ei(0,:), b ); 64 xlabel( Zeit ); 6 ylabel( Loesung ); 66 hold all 67 6 subplot(3,3,6+i);
69 set(gca, FontSize,); 70 if (i==) 7 title(sprintf( Crank-Nicolson-Verfahren )) 7 end 73 hold on; 74 plot(tn,yn_cn(0,:), b ); 7 xlabel( Zeit ); 76 ylabel( Loesung ); 77 hold all 7 end 79 clear; 9