Dipl.-Math. Robert Offinger Wintersemester 6/7 Otto-von-Guericke-Universität Magdeburg Fakultät für Mathematik Materialien zur Vorlesung Mathematik III für Ingenieure Ergänzungen zur Einführung in Matlab R und Scilab. Lineare Gleichungssysteme. Eigenwerte, Eigenvektoren 3. QR-, Cholesky-Zerlegung und positive Definitheit 4. Programmierung: Newton-Verfahren 5. Einfache Grafiken 6. Symbolisches Rechnen Die Einführung in Matlab R und Scilab ist wie dieses Dokument im Internet verfügbar unter http://www.math.uni-magdeburg.de/ rooff/mathe3/
Lineare Gleichungssysteme Hat man eine m n Matrix A und einen m Vektor b definiert, so kann man mit dem \ -Operator das zugehörige Gleichungssystem Ax = b lösen. Ist die Matrix A quadratisch und hat sie vollen Rang, dann ist die Lösung eindeutig und nichts weiter zu beachten. Ist die Matrix quadratisch, hat sie jedoch keinen vollen Rang, erhält man eine Warnung: >> A=[ 3 ; 4 ; 7 ] ; >> b = [ ; ; 7 ] ; >> A\b >> B=[ ; ; ] ; >> B\b Warning : Matrix i s s i n g u l a r to working p r e c i s i o n. NaN Inf Inf Ist die Matrix nicht quadratisch, so erhält man auch in Fällen mit unendlich vielen Lösungen oder keiner Lösung als Ergebnis immer einen Vektor! Ist das Gleichungssystem unlösbar, so erhält man die sogenannte Least-Squares-Lösung: Es wird dann versucht, einen bestmöglichen Lösungsvektor x zu finden in dem Sinne, dass Ax b minimal wird, d.h. Ax b = min x Ax b. Diese Fälle erkennt man daran, dass der Rang von A kleiner als der Rang der erweiterten Matrix [A, b] ist. >> B=[ ; ; ; ] ; >> b = [ ; ; ; ] ; >> x=b\b Warning : Rank d e f i c i e n t, rank =, t o l =.986 e 5. x =.5.5 >> B x.. >> rank (B)
>> rank ( [ B, b ] ) 3 Gibt es dagegen unendlich viele Lösungen, d.h. in Fällen mit Rang(A) = Rang([A, b]) < n, so wird nur eine spezielle Lösung (mit höchstens k = Rang(A) vielen Einträgen ungleich ) ausgegeben. Die allgemeine Lösung erhält man in diesem Fall, indem man noch den Nullraum berechnet, in unserem Falle ergibt sich die Lösungsmenge {(.5,,.5) t + λ(,, ) t : λ R}. Ist der Nullraum mehrdimensional, so geben die Spalten der Resultatsmatrix eine Basis des Nullraums an, hier N (D) = span{(,,, ) t, (,,, ) t } für die angegebene 4-Matrix D. Der Parameter r sorgt jeweils dafür, dass statt normierter Vektoren solche mit rationalen Einträgen ausgegeben werden. >> C=[ ; ] ; >> c = [ ; ] ; >> C\ c.5.5 >> rank (C) >> rank ( [ C, c ] ) >> null (C).48.865.48 >> null (C, r ) >> D=[ ; ] ; >> null (D, r ) Wollte man im Fall einer singulären quadratischen n n Matrix A für das Gleichungssystem Ax = b eine Least-Squares-Lösung (falls Rang(A) < Rang([A, b])) bzw. eine spezielle Lösung (falls Rang(A) = Rang([A, b]) < n), dann müsste man x = pinv(a)*b verwenden. 3
Eigenwerte, Eigenvektoren Die Eigenwerte einer Matrix erhält man mit der Funktion eig. Will man daneben noch die Eigenvektoren, muss man das Ergebnis einem Vektor zweier Variablen zuweisen. Der erste Eintrag, hier die Matrix V, enthält in den Spalten normierte Eigenvektoren, der zweite Eintrag, die Matrix D, ist die Diagonalmatrix der zugehörigen Eigenwerte, so dass V DV = F (in Matlab-Schreibweise: inv(v)*d*v) bzw. sogar V t DV = F (in Matlab- Schreibweise: V *D*V) gilt, falls die Voraussetzungen dazu erfüllt sind (siehe Theorem.4 bzw. Theorem.). Warnung: Falls algebraische und geometrische Vielfachheiten nicht übereinstimmen sollten, sind die Spalten der Matrix der Eigenvektoren nicht linear unabhängig! >> F=[6 ; 5 ; 9 ] ; >> eig (F) 5 5 >> [V,D]= eig (F) V =.6.8..8.6 D = 5 5 >> [ V, D]= eig ( [ ; ] ) ; V V =... 3 QR-, Cholesky-Zerlegung und positive Definitheit Eine QR-Zerlegung einer Matrix ermittelt die Funktion qr. Um beide Ergebnismatrizen angezeigt zu bekommen, muss man wieder an einen Vektor zweier Variablen zuweisen. >> G=[ 3 ; ; 3 ] ; >> [ Q,R]=qr (G) Q =.48.5774.77.865.5774..48.5774.77 R =.4495.4495.4 3.464.547.77 4
Die Cholesky-Zerlegung ist für positiv definite (und damit insbesondere symmetrische) Matrizen möglich. Matlab R führt dabei einen Test auf positive Definitheit durch, so dass man nicht die Eigenwerte ausrechnen und nachsehen muss, ob alle positiv sind. Für das berechnete Ergebnis (eine rechte Dreiecksmatrix) R der Cholesky-Zerlegung von H gilt dann R t R = H (in Matlab-Schreibweise: R *R), d.h. mit der linken Dreiecksmatrix L = R t gilt dann wie im Skript LL t = H (Theorem.3). >> F=[6 ; 5 ; 9 ] ; >> chol (F)??? Error using ==> chol Matrix must be p o s i t i v e d e f i n i t e. >> H=[ ; ; 5 ] ; >> eig (H).. 7. >> R=chol (H) R =.44.77.44.47.865.575 4 Programmierung: Newton-Verfahren Ein übliches Verfahren zur Lösung einer nichtlinearen Gleichung f(x) = (zu einer Funktion f : R R) ist das Newton-Verfahren, das wir hier zu Demonstrationszwecken programmieren. In Matlab R steht zur Lösung von nichtlinearen Gleichungssystemen die Funktion fsolve zur Verfügung, mit der wir dann unsere Lösung vergleichen. Das Newton-Verfahren besteht darin, zu einem gegebenen geeigneten Startwert x iterativ die Punkte x k+ = x k f(x k), k =,,,... f (x k ) zu berechnen und geeignet abzubrechen. Wir brechen hier (etwas naiv) ab, wenn die Änderung in den x-werten gering ist, d.h. falls x k+ x k ɛ für einen vorher gewählten Wert ɛ, oder - weniger erfolgreich mit einer Fehlermeldung - falls k > k max ist, d.h. eine vorher gewählte Maximalanzahl k max an Iterationen überschritten wird. Der Funktion newtonsolve, die in einer eigenen Datei mit dem Namen newtonsolve.m (einer sogenannten m-datei) im aktuellen Verzeichnis steht, werden dabei die Funktion f (Parameter func), ein Startwert x (Parameter startval), die Ableitung f (Parameter func_deriv), die gewünschte Genauigkeit ɛ (Parameter epsi) und die Maximalanzahl k max an Iterationen (Parameter max_steps) übergeben. Die Funktion f und die Ableitung f stehen unter dem Namen newtfunc bzw. newtablfunc wieder jeweils in einer eigenen m-datei namens newtfunc.m bzw. newtablfunc.m. Genauer wird beim Aufruf von newtonsolve ein sogenanntes Handle auf diese Funktionen übergeben, daher das einleitende @ -Zeichen bei der Übergabe der Funktionen. Wie auch bei der Verwendung 5
der Funktion fsolve geschehen, könnte alternativ die Funktion und Ihre Ableitung einmalig beim Funktionsaufruf ( inline ) definiert werden mittels des Aufrufs newtonsolve(@(x) x - exp(-/*x),,@(x) +/*exp(-/*x),e-6,). function y = newtfunc ( x ) y = x exp( / x ) ; function y=newtablfunc ( x ) y=+/ exp( / x ) ; function y = newtonsolve ( func, s t a r t v a l, f u n c d e r i v, epsi, max steps ) % L o e s u n g d e r n i c h t l i n e a r e G l e i c h u n g f u n c = mit H i l f e d e s % N e w t o n v e r f a h r e n s ; Abbruch, f a l l s d i e G e n a u i g k e i t e p s i e r r e i c h t % o d e r nach m a x s t e p s I t e r a t i o n e n % I n p u t p a r a m e t e r : % f u n c n i c h t l i n e a r e G l e i c h u n g mit f u n c = % s t a r t v a l S t a r t w e r t d e r I t e r a t i o n ( kann auch komplex s e i n ) % f u n c d e r i v A b l e i t u n g von f u n c nach d e r u n a b h a e n g i g e n V a r i a b l e n % e p s i G e n a u i g k e i t d e s E r g e b n i s s e s % m a x s t e p s M a x i m a l z a h l an I t e r a t i o n e n % % O u t p u t p a r a m e t e r : % y N u l l s t e l l e von f u n c xold = s t a r t v a l ; % H i l f s v a r i a b l e xnew = s t a r t v a l ; d i f f e r = e p s i ; % Laenge d e s a k t u e l l e n I n t e r v a l l s s t e p s = ; % Anzahl d e r b e r e i t s d u r c h g e f u e h r t e n S c h r i t t e while ( abs ( d i f f e r ) > e p s i ) & ( s t e p s < max steps ) abl = f u n c d e r i v ( xold ) ; i f ( abl==) error ( Ableitung hat N u l l s t e l l e ) end ; xnew = xold func ( xold )/ abl d i f f e r = xnew xold ; xold = xnew ; s t e p s = s t e p s + ; end i f s t e p s >= max steps error ( k e ine Konvergenz des Newton Verfahrens ) ; else y = xnew ; end Wir testen unser Programm für die Funktion f : R R, f(x) = x exp( x/) mit der Ableitung f (x) = +/ exp( x/). Die Funktion ist also streng monoton steigend. Der Graph der Funktion ist im Abschnitt 5 zu finden. Wir starten hier mit dem Startwert x = (beachte: f() = und f().39). Nach wenigen Schritten erreichen wir die gewünschte Genauigkeit für ɛ = 6 und ein vergleichbares Ergebnis wie Matlab R. Da 6
im Programm in der Zeile xnew = xold - func(xold)/abl kein abschließender Strichpunkt steht, wird der aktuelle Wert von x k+ in jeder Iteration mit ausgegeben. Um mehr gültige Stellen zu sehen, verwendeten wir zudem vor dem Programmaufruf den Befehl format long. Mit dem Befehl format short schaltet man wieder zur kurzen Ausgabe mit weniger gültigen Stellen zurück. >> format long >> newtonsolve ( @newtfunc,, @newtablfunc, e 6,) xnew =.6988968567 xnew =.7346553974 xnew =.7346744986 xnew =.73467449839.73467449839 >> x=f s o l v e (@( x ) x exp( / x ), ) Optimization terminated: first-order optimality is less than options.tolfun. x =.7346744987 >> format s h o r t 5 Einfache Grafiken 3 sqrt(x. + y. )..8.6.4..8.6 3.5.5.5.5 3.5 y.5..4 x.6.8 >> x = :.:3; >> y=newtfunc ( x ) ; >> plot ( x, y ) >> grid on >> grid o f f >> e z p l o t ( @newtfunc ) >> e z p l o t ( @newtfunc, [, 3 ] ) >> fh = @( x, y ) sqrt ( x. ˆ + y. ˆ ) ; >> e z s u r f ( fh, [, ], [ /, ] ) 7
Wir wiederholen kurz den Plot einer eindimensionalen Funktion, hier für obige Funktion f(x) = x exp( x/) im Intervall x 3. Mittels grid on legt man dabei ein Liniengitter über die Grafik, das man mit grid off wieder löschen kann. Man sieht so gut die Nullstelle bei x.7. Alternativ kann man die Funktion ezplot verwenden. Ferner wollen wir noch den Graph der Funktion f : R R, f(x, y) = x + y im Intervall x und / y ausgeben und verwenden dazu ezsurf, den einfachsten Befehl, der hierzu verfügbar ist. Weitere Informationen zu diesem und Querverweise zu ähnlichen (und komplizierteren) Befehlen mit vielen zusätzlichen Optionen erhält man z.b. mit dem Befehl doc ezsurf. 6 Symbolisches Rechnen Im Gegensatz zu Scilab kann Matlab R mit Hilfe der Symbolic Math Toolbox etwas symbolisch rechnen, wobei es dabei auf Routinen des Programms Maple R zurückgreift. Oft ist es in solchen Fällen empfehlenswert, dann gleich das Programm Maple R zu benutzen; trotzdem demonstrieren wir das Vorgehen in Matlab R. Nachdem die symbolischen Variablen x und y definiert wurden, kann man in dem Ausdruck y 3 x 4 die partielle Ableitung nach x oder nach y berechnen lassen. Ansonsten bestimmen wir noch die Jacobi-Matrix zur Funktion f(x, y) = ( y 3 x 4, exp( x y) ) und werten diese im Punkt (x, y) = (, ) aus. Abschließend lassen wir noch die gewöhnliche Differentialgleichung.Ordnung ( x )y xy + 6y = mit den Randwertbedingungen y() = y( ) = lösen und erhalten als Lösung die Funktion y(x) = + 3 x. >> syms x y >> f=yˆ3 x ˆ( 4); >> d i f f ( f, x ) 4 yˆ3/xˆ5 >> d i f f ( f, y ) 3 yˆ/xˆ4 >> j a c=j a c o b i a n ( [ yˆ3 x ˆ( 4);exp( xˆ y ) ] ) j a c = [ 4 yˆ3/x ˆ5, 3 yˆ/x ˆ 4 ] [ x exp( xˆ y ), exp( xˆ y ) ] >> subs ( jac, { x, y },{,}) 3...996.498 >> y=dsolve ( ( x ˆ) Dy x Dy+6 y=, y()=, y( )=, x ) y = /+3/ xˆ Hinweis: Die Ein- und Ausgabe geschah jeweils unter der Version 7. von Matlab R. 8