Matlab-Praktikum zur Numerik
Transcrição
Matlab-Praktikum zur Numerik
Matlab-Praktikum zur Numerik Sommersemester 2007 M.Sc. Ivan Cherlenyak Prof. Dr. Hans-Jürgen Reinhardt Fachbereich Mathematik Universität Siegen Version: 17 September 2007 Inhaltsverzeichnis 1 Einführung in MATLAB und Octave 1.1 Was ist MATLAB und Octave? . . . . . . . . . . . 1.2 Grundlagen . . . . . . . . . . . . . . . . . . . . . . 1.2.1 Vektoren . . . . . . . . . . . . . . . . . . . . 1.2.2 Matrizen und Manipulationen mit Matrizen 1.2.3 Datentypen in MATLAB . . . . . . . . . . . 1.2.4 Logische Operationen und Relationen . . . . 1.2.5 Steuerstrukturen . . . . . . . . . . . . . . . 1.2.6 Visualisieren mit MATLAB (Octave) . . . . 1.2.7 Dateien lesen und schreiben . . . . . . . . . 1.3 m-Files: Matlab als Programmiersprache . . . . . . 1.3.1 Scripts . . . . . . . . . . . . . . . . . . . . . 1.3.2 Definition von Funktionen . . . . . . . . . . 2 Numerische Algorithmen, ihre Komplexität 2.1 Numerische Algorithmen und Fehlerquellen . 2.2 Computerarithmetik . . . . . . . . . . . . . 2.3 Zur Komplexität numerischer Algorithmen . und . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 6 6 7 8 9 9 10 14 14 14 15 Fehleranalyse 19 . . . . . . . . . . . . . . 19 . . . . . . . . . . . . . . 22 . . . . . . . . . . . . . . 23 3 Graphische Benutzeroberflächen und MATLAB 3.1 Erstellung einer GUI mit MATLAB . . . . . . . . . . . . . . . . . . . . . 3.1.1 GUI Elemente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1.2 Darstellung kontrollieren (Größe, Position, Farben, Eigenschaften ändern) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2 Programmierung(Callbacks, Datenstruktur, Spezialfunktionen, handles) . 3.2.1 Darstellung von Daten in Grafiken . . . . . . . . . . . . . . . . . 4 Einfache numerische Algorithmen mit MATLAB 4.1 Polynome . . . . . . . . . . . . . . . . . . . . . . . . . 4.1.1 Berechnung von Polynomwerten. Horner-Schema 4.1.2 Polynome in MATLAB . . . . . . . . . . . . . . 4.2 Nullstellenberechnung . . . . . . . . . . . . . . . . . . . 4.2.1 Bisektions-Methode . . . . . . . . . . . . . . . . 4.2.2 Methode der sukzessiven Approximation . . . . 4.2.3 Newton-Verfahren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 . 27 . 27 . 30 . 31 . 33 . . . . . . . 35 35 35 37 38 38 40 41 INHALTSVERZEICHNIS 4.3 4.2.4 Die Sekantenmethode (Regula falsi) . . . . . . . . . . . . . Lineare Gleichungssysteme: Direkter und iterativer Löser . . . . . 4.3.1 Inverse Matrix, Normen und Konditionszahl der Matrix . . 4.3.2 Direkte Verfahren . . . . . . . . . . . . . . . . . . . . . . . 4.3.3 Iterative Verfahren zur Lösung linearer Gleichungssysteme . . . . . . . . . . . . . . . . . . . . . . . . . 42 43 43 44 46 II Kapitel 1 Einführung in MATLAB und Octave 1.1 Was ist MATLAB und Octave? MATLAB ist ein sehr leistungsfähiges Softwaresystem für technische Berechnungen. Der Name MATLAB kommt von MATrix-LABoratory. Grundelemente sind Matrizen und ihre Manipulationen, die in numerischen Verfahren optimal eingesetzt werden können. Typische Anwendungen sind • Numerische Berechnungen aller Art • Entwicklung von Algorithmen • Modellierung, Simulation und Entwicklung von Prototypen technischer Probleme • Analyse, Auswertung und grafische Darstellung von Datenmengen; Visualisierung • Wissenschaftliche und technische Darstellungen • Applikationsentwicklung mit Aufbau einer grafischen Benutzerschnittstelle Berechnung MATLAB verfügt über eine numerische - qualitativ hochwertige - Progammsammlung. Dem Benutzer bleibt es dadurch erspart, Standardalgorithmen neu programmieren zu müssen. Visualisierung MATLAB verfügt über moderne Visualisierungsmöglichkeiten. Dadurch ist der Benutzer in der Lage, Daten auf verschiedene Weisen zu visualisieren. Programmierung MATLAB verfügt über eine eigene Programmiersprache. Dadurch stellt MATLAB ein offenes System dar. Der Benutzer hat somit die Möglichkeit, die Funktionalität von MATLAB durch eigene Programme beliebig zu erweitern. Dies kann dadurch geschehen, dass er MATLAB-Programme schreibt - sogenannte m-Files - oder Cbzw. Fortran-Codes einbindet. Folgende Punkte tragen außerdem zum Erfolg von MATLAB bei: 1 1.1 Was ist MATLAB und Octave? • Syntax MATLAB besitzt eine benutzerfreundliche, intuitive Syntax, die kurz und einfach ist. Sie lehnt sich stark an die mathematischen Schreibweisen an. • Toolboxen In Form sogenannter Toolboxen lässt sich der Funktionsumfang von MATLAB auf vielen Gebieten erweitern. Unter anderem stehen folgende Toolboxen zur Verfügung: (Extended) Symbolic Math Toolbox, Financial Toolbox, Image Processing Toolbox, Neural Network Toolbox, Optimization Toolbox, Partial Differential Equation Toolbox, Spline Toolbox, Wavelet Toolbox, Image Processing Toolbox, Statistic Toolbox. • Matrizen Grundlage von MATLAB sind reelle und komplexe (einschließlich dünn besetzter) Matrizen. Die Einführung einer Matrix als grundlegendes Datenelement hat sich nicht nur in der (numerischen) Mathematik, sondern in vielen anderen rechnerorientierten Bereichen als sehr vorteilhaft herausgestellt. • Prototyprealisierung In der Praxis kommt es vor, daß man - aus den verschiedenen Gründen heraus - darauf angewiesen ist, Algorithmen in anderen Programmiersprachen, wie zum Beispiel C/C++,Fortran, Pascal oder Java, zu implementieren. Aber auch dann ist es vorteilhaft, einen Prototyp des Verfahrens in MATLAB zu realisieren, da dies meist sehr schnell möglich ist, bevor man den Algorithmus überträgt bzw. automatisch übertragen lässt. • Grafiken bearbeiten Das MATLAB-Grafiksystem umfasst Hochsprachenbefehle für die Bildverarbeitung, für Trickbewegungen und Präsentationsgrafiken. Hierzu gehören auch einfache Befehle, mit denen sich Grafiken kundenspezifisch gestalten oder auch vollständig grafische Benutzerschnittstellen für eigene Applikationen aufbauen lassen. • Bibliothek von mathematischen Funktionen MATLAB verfügt über eine umfangreiche Sammlung von mathematischen Algorithmen und Funktionen. Diese Funktionalität reicht von elementaren Funktionen über Eigenwertberechnungen bis hin zur schnellen Fourier-Transformation. • Simulink Simulink - ein Partnerprogramm zu MATLAB - ist ein blockorientiertes, interaktives System zur Simulation linearer und nicht lineare dynamischer Systeme. Es handelt sich um ein mausgesteuertes Grafikprogramm, das ein Modell eines technischen oder physikalischen Systems, das als Blockdiagramm auf dem Bildschirm darzustellen ist, unter dynamischen Einwirkungen nachbildet. Grundlage sind MATLAB-Funktionen zur Lösung gewöhnlicher Differentialgleichungen (ODELöser). 2 Kapitel 1. Einführung in MATLAB und Octave • Platformunabhängig MATLAB läuft sowohl unter Windows als auch unter Linux. Octave Octave ist ein linuxbasiertes Softwaresystem, das freizugänglich ist, ein sogenanntes Open Source Produkt. Genauso wie MATLAB besitzt Octave eine interaktive Scriptsprache, die speziell für vektorisierbare Berechnungen optimiert ist und dabei Standardroutinen der numerischen Mathematik (z.B. Eispack oder Lapack) auf einfache Weise zugänglich macht. Der Syntax von Octave ist der von MATLAB sehr ähnlich, d.h. ein Octave Programm kann meist auch von MATLAB ausgeführt werden. Die Rückwärtskompatibilität ist nicht immer gegeben, da MATLAB besonders im Grafikbereich um einen erheblich größeren Funktionsumfang verfügt. Die KDE-Komponente von Octave heißt Koctave und sollte extra installiert werden. Das Octave-Forge Paket ist für mehr Kompatibilität mit MATLAB zuständig. Starten und Beenden Bei vielen kommandoorientierten Rechnersystemen wird MATLAB bzw. Octave durch das Kommando matlab bzw. octave gestartet. Oder - bei grafischen Oberflächen - klickt man nach dem Start auf ein entsprechendes MATLAB- oder Octave-Icon bzw. Koctave-Icon. Dann sollten Sie den MATLAB Prompt » oder den Octave Prompt octave:1> sehen, der auf ihre erste Eingabe wartet. Mit der Kommando quit verlassen sie beide Programme. Eingabekonventionen • Alle Befehle können sowohl interaktiv als auch über Skriptdaten (m-Files von MATLAB) eingelesen werden • Skripts (m-Files) sind Textdateien mit dem Suffix .m. Sie werden durch Aufruf des Dateinamens ohne Suffix eingelesen, und verhalten sich so, als ob ihr Inhalt Zeile für Zeile am Prompt eingegeben würde. • ; trennt mehrere Befehle in einer Zeile, und unterdrückt die Ausgabe von Werten. • , trennt Befehle, gibt aber Werte aus. • ... am Zeilenende bedeutet, dass der Ausdruck in der nächsten Zeile weitergeht. 3 1.1 Was ist MATLAB und Octave? • Kommentare werden mit % eingeleitet. Auf vielfachen Kundenwunsch wurde ab Release 14 eine Möglichkeit für blockweise Kommentare im MATLAB Editor eingeführt. Das Anfangszeichen ist „%} “ das Endzeichen „%} “. • MATLAB und Octave unterscheiden zwischen Groß- und Kleinbuchstaben. Hilfe MATLAB verfügt über umfangreiche Online-Hilfen. Mit diesen erhalten Sie detaillierte Informationen zur Funktionalität von MATLAB. Die Hilfsysteme können mit den Kommandos help, helpwin und helpdesk usw. aufgerufen werden. Jetzt wollen wir detailliert einige Informationsdienste vorstellen: • Das help- Kommando. >> help name gibt Hilfetext zur Variable oder Funktion „name“ aus. Alle MATLAB-Funktionen sind in logische Gruppen(Themen) eingeteilt, und die MATLAB-Verzeichnisstruktur basiert auf dieser Einteilung. Gibt man alleine help ein, so wird diese Gruppierung angezeigt. Hiermit kann man sich nun weiter vortasten. Gibt man zum Beispiel help elmat ein, so erhält man alle zur Verfügung stehenden MATLAB-Funktionen zum Bereich Grundlegende Matrizen und Matrixmanipulationen. • Das lookfor- Kommando Basierend auf einem Schlüsselwort können Sie mit dem lookfor-Kommando nach Funktionen suchen. Dabei wird die erste Zeile des help-Textes jeder MATLABFunktion ausgegeben, die das angegebene Schlüsselwort beinhaltet. Sucht man zum Beispiel Informationen über Splines, dann gibt man am Prompt >> lookfor spline an. Will man, dass alle help-Zeilen durchsucht werden, so muss man im Aufruf die Option -all verwenden. • Das Hilfefenstersystem helpwin Gibt man den Befehl helpwin ein, so wird ein neues Windowsfenster geöffnet, das verwenden werden kann, um interaktive Hilfe über MATLAB Funktionen zu erhalten. Das helpwin-System ist das interaktive Analog des help-Systems. Durch Doppelklicken auf ein Thema in diesem Textfenster, erhält man eine Liste zu diesem Thema. Der helpwin-Befehl läßt sich analog dem help-Befehl mit dem gewünschten Thema bzw. der gewünschten Funktion direkt aufrufen. • Das Hilfesystem helpdesk Das MATLAB-Hilfesystem helpdesk liefert HTML-basierte Hilfe. Diese HTML-Dokumente 4 Kapitel 1. Einführung in MATLAB und Octave haben den Vorteil, dass sie Grafiken beinhalten können und Verweise auf andere Dokumente leicht machbar sind. Hilfesystem helpdesk-Befehle: helpdesk ruft Hilfefenster mit Themenliste auf doc < F unktionsname > Gibt Informationen über diese Funktion • Die Mathworks Webseite http : //www.mathworks.com Zahlen und Formate MATLAB arbeitet mit Dezimalzahlen. Alle Zahlen werden im double-Format gemäß der Spezifikation durch die Gleitpunktform der IEEE abgespeichert. Vordefinierte Zahlenausgaben in MATLAB erfolgen nach mehreren Regeln. Eine ganze Zahl wird ganzzahlig ausgegeben. Reelle Zahlen aus dem Bereich [10−3 , 103 ] werden auf 4 Dezimalen gerundet ausgegeben. Andernfalls gibt MATLAB Zahlen in exponentieller Form aus, z.B. >> 2.374e-5, 3.1829e+4. Man kann das Ausgabeformat mit Hilfe des Befehls format variieren. Um Speicherplatz zu sparen sind in MATLAB noch weitere Zahlentypen implementiert. Diese sind • single • int8, uint8, int16, uint16, int32, uint32 Für weitere Informationen siehe doc datatypes. Komplexe Zahlen können in MATLAB wie folgt eingegeben werden: a1= 7-8i, b1 = -21+3*j √ Die imaginäre Zahl i = −1 kann als i oder j eingegeben werden. Variable und Standardoperationen • varname = expression weist varname den Wert expression zu. • Es gibt die „üblichen“ Operationen und Funktionen +, −, ∗, /,, , sin, cos, usw. Weitere Informationen unter Aufruf von : helpwin ops und helpwin elfun. • Die elementaren logischen Operatoren werden auch nach Aufruf helpwin ops angezeigt. • Allgemeine Kommandos ( General Purpose Commands) sind unter helpwin general aufrufbar. Beispiele: >> x_1 = 12/34, xStr = ’Ein String’, >> im = sqrt(-1)-i 5 1.2 Grundlagen Und hier ist ein Script test1, der in m-File test1.m gespeichert ist: >>a = 12; >>b = 13; >>s = a + b; >> p = a * b; >>disp(’Die Summe ist’); disp(s); >>disp(’Der Produkt ist’); disp(p); 1.2 1.2.1 Grundlagen Vektoren Zeilen- oder Spaltenvektoren >> x1 = [ 1 3 5 7] Erzeugt einen Zeilenvektor mit angegebenen Elementen. >> x2 = [1; 3; 5; 7] Erzeugt einen Spaltenvektor. Beachte x2 entspricht x10 (’ bewirkt Transponation). >> x = Komponente1:KomponenteN Erzeugt einen Zeilenvektor x, der mit Komponente1 beginnt, um 1 erhöht wird und mit oder vor KomponenteN endet. >> x = Komponente1:Schrittweite:KomponenteN Erzeugt einen Zeilenvektor x, der mit Komponente1 beginnt, um Schrittweite erhöht wird und mit oder vor KomponenteN endet. >> x =linspace(Komponente1,KomponenteN,n) Erzeugt einen äquidistanten Zeilenvektor x der mit Komponente1 beginnt und mit der KomponenteN endet, wobei der Vektor n Komponenten hat. >> x =logspace(start,end,n) Erzeugt einen Zeilenvektor x der mit Komponente 10start beginnt und mit der Komponente 10end endet, wobei der Vektor n Komponenten hat. 6 Kapitel 1. Einführung in MATLAB und Octave 1.2.2 Matrizen und Manipulationen mit Matrizen Befehl A = [1 2 3; 4 5 6] B =[1 2]+ i*[5 6] zeros(3,4) zeros(3) eye ones rand randn hadamard v(k) A(k,l) v(m:n) A(k,:) A(:,l) A(3:7,2:5) A(2:4,[1 3 5:7]) A(k,:)=[] diag rot90 fliplr flipud repmat reshape tril triu A(:) size length isempty Aktion Zuweisung einer Matrix Zuweisung eines komplexen Vektors Nullmatrix mit 3 Zeilen und 4 Spalten quadratische Nullmatrix der entsprechenden Größe Einheitsmatrix , Syntax wie zeros Matrix mit allen Elementen 1, Syntax wie zeros Gleichmäßigverteilte Zufallsmatrix Normalverteilte Zufallsmatrix Hadamard-Matrix das k-te Element des Zeilen- oder Spaltenvektors v das Matrixelement akl Teilvektor des Vektors v die k-te Zeile der Matrix A die l-te Spalte der Matrix A Zugriff auf Matrixbereich(Teilmatrix); ... auch mit beliebigen Indexvektoren Löschen eine Matrixzeile Extrahiert Diagonale oder erzeugt Diagonalmatrix Drehung um 90◦ Vertauscht Spalten von links nach rechts Vertauscht Zeilen von oben nach unten Erzeugt Blockmatrix Ändert die Struktur Untere Dreiecksmatrix Obere Dreiecksmatrix Formt Matrix zu Spaltenvektor um Ermittelt Matrixgröße Länge eines Vektors Wahr, wenn Matrix leer ist Andere Matrizen bekommt man mit Hilfe des Befehles >> helpwin elmat 7 1.2 Grundlagen Matrixoperationen Symbol Operation + Addition Subtraktion * Multiplikation rechte Division / \ linke Division Potenzieren ^ ’ Konjugiert Transponieren .’ Transponieren kron Kronecker Tensorprodukt MATLAB Syn. A+B A-B A*B A/B A\B A^p A’ Math. Syntax A+B A-B AB Löst XA=B mit Lösung X Löst AX = B mit Lösung X Ap (Ā)T A.’ kron(A,B) AT A⊗B Bemerkung x = A\B löst Ax = b mit Hilfe des Gauss-Verfahrens. Es ist sogar erlaubt, dass LGS mehrere rechte Seiten besitzt. Deshalb steht in der Tabelle ein großes B. Matrixaddition und -Subtraktion sind elementweise definiert. Die Multiplikation und andere dagegen nicht, es sind echte Matrixoperationen. Es ist möglich, die Operationen .∗, .ˆ, .\, ./ elementweise durchzuführen. Beispiel: A = [1 2; 3 4]; B = [5 6;7 8]. Dann ist A.*B=[5 12; 21 32]; A./B=[0.2000 0.3333; 0.4286 0.5000]; A.^B=[1 64; 2187 65536]. 1.2.3 Datentypen in MATLAB Es gibt in MATLAB mehrere Datentypen (Klassen), die alle durch ein mehrdimensionales Feld(Array) dargestellt werden. Vektoren und Matrizen sind die bekanntesten Beispiele für Felder. Unter anderem sind dies: double, char, sparse, cell und struct. Typ double char sparse cell struct Beschreibung Internes MATLAB-Zahlenformat Zeichen(ketten) Format Format für dünn besetzte Matrizen Zelle besteht aus Feldern des Typs double und char verschiedene Typen struct ist ein Datentyp, welcher verschiedene Werte von verschiedenen Typen beinhalten kann. Der MATLAB-Typ struct ist mit dem Datentyp Record in der Sprache Pascal vergleichbar. 8 Kapitel 1. Einführung in MATLAB und Octave Beispiele: a = 10.5 (double) c = ’Zeichenkette’ (char) b = sparse(2,3) (sparse) d = {1:5,’Matlab’,ones(3)} (cell) 1.2.4 Logische Operationen und Relationen Die logischen Operatoren sind in MATLAB aus Sonderzeichen aufgebaut. Werden Matrizen mit logischen Operatoren verknüpft, so geschieht dies komponentenweise. Folgende Tabelle zeigt die logischen Operatoren. Logische Operatoren & | ~ Logische Funktionen iscell ischar isempty isieee xor Relationen == ~= >= <= > < 1.2.5 Beschreibung logisches UND logisches ODER logisches NICHT Beschreibung WAHR, falls Argument cell-Feld WAHR, falls Argument char-Feld WAHR, falls Argument leeres Feld WAHR bei Rechnern mit IEEE-Standard Exklusives ODER Beschreibung gleich nicht gleich größer oder gleich kleiner oder gleich größer kleiner Steuerstrukturen Programmiersprachen erlauben es, den Ablauf eines Programms zu steuern. Man spricht von einer Steuerstruktur, die aus mehreren Steuerelementen bestehen kann. Diese sind Verzweigungen und Schleifen. 9 1.2 Grundlagen Schleifen Befehle for n=3:10 i=i*n end while <Ausdruck> <Anweisung(en)> end Aktion for-Schleife while-Schleife; <Ausdruck> wird vor der Ausführung der <Anweisungen> ausgewertet. Solange der <Ausdruck> ungleich 0 ist, werden die <Anweisungen> ausgeführt. Die break-Anweisung ist eine Sprunganweisung und dient dazu, aus einer Schleife herauszuspringen. Liegt eine geschachtelte Schleife vor, so springt MATLAB aus dieser in die nächstübergeordnete. Verzweigungen If-Anweisung Befehle if <Test_1> <Anweisungen_1> elseif<Test_2> <Anweisungen_2> else <Anweisungen_3> end Switch-Anweisungen Befehle switch <Ausdruck> case<Konstante_1> <Anweisungen> case <Konstante_2> <Anweisungen> otherwise <Anweisungen> end 1.2.6 Aktion Ist der <Test_1> ungleich 0 (WAHR), so werden <Anweisungen_1> ausgeführt. Ist <Test_1> gleich 0, so wird <Test_2> ausgewertet und <Anweisungen_1> nicht ausgeführt. Ist jetzt der <Test_2> ungleich 0, so werden <Anweisungen_2> ausgeführt. Andernfalls führt das Programm <Anweisungen_3> aus. Aktion switch lässt Gruppen von Anweisungen entsprechend dem Wert einer Variablen (hier <Konstante_1> oder <Konstante_2>) oder eines Ausdrucks ausführen. Es wird nur die erste Übereinstimmung ausgeführt. Visualisieren mit MATLAB (Octave) Was ist wissenschaftliches Visualisieren? Diese Frage kann mit der Darstellung von Daten beantwortet werden. Wozu ist wissenschaftliche Visualisierung nützlich? Hierzu gibt es folgende Gründe: • Man erkennt Strukturen und Merkmale in den Daten. 10 Kapitel 1. Einführung in MATLAB und Octave • Man identifiziert Trends. • Man kann komplexe Informationen vergleichen. • Man kann Gegenstände untersuchen, die physikalisch nicht untersuchbar sind. 2D-Grafiken Die plot-Funktion ist eine der grundlegenden Grafikfunktionen in MATLAB. Wenn x und y zwei Vektoren der gleichen Länge sind, dann öffnet der Befehl plot(x,y) ein Grafikfenster mit einer entsprechenden Grafik. Beispiel >> x =[0 0.1 0.2 0.3 0.4 0.5] >> y =[10 18 12 -3 8 25] Der mögliche Aufruf des plot-Befehls mit Optionen und mehreren Grafiken: >> plot(x1,y1,linspec1,x2,y2,linspec2,x3,y3,linspec3) Damit definieren wir, dass in einem Fenster drei Grafiken gezeichnet werden. Die Option linspec* beschreibt Farbe, Gestaltung der Linie und Markierung von Punkten der jeweiligen Grafik. Markierung von Punkten Gestaltungsvarianten für Linien Sym. Bed. Sym. Bedeutung ’o’ ◦ ’-’ Linie(Default) × ’x’ ’––’ gestrichelte Linie ’+’ + ’:’ punktierte Linie ∗ ’*’ ’square’ ’diamond’ Farben Sym. ’r’ ’g’ ’b’ ’k’ Bedeutung rot grün blau (Default) schwarz Andere nützliche Funktionen zum plot-Befehl sind in der folgenden Tabelle aufgelistet: Funktion subplot hold on hold off grid text title xlabel ylabel 11 Bedeutung ermöglicht ein Grafikfenster in mehrere Figuren zu unterteilen gibt die Möglichkeit weitere Plots zum aktiven Fenster einfügen schaltet hold on ab erzeugt ein Gitter positioniert Text an spezifizierten Koordinaten erzeugt eine Überschrift Beschriftung der x-Achse Beschriftung der y-Achse 1.2 Grundlagen Beispiel %-----------------------------------------------% Test1.m m-File zum Erzeugung verschiedener Grafiken %-----------------------------------------------x = linspace(-10,10,50); y1 = x.^2 + 5.*x + 7; y2 = exp(2.*x).*cos(4.*x); y3 = (x.^2-3.*x)./(x.^2+7.*x) subplot(2,2,1) plot(x,y1,’ro’) grid on title(’Quadratisches Polynom’) xlabel(’x’), ylabel(’y1’) subplot(2,2,2) plot(x,y1,’ro’,x,y2,’--k*’); grid on title(’Zwei verschiedene Grafiken in einem Plotfenster’) subplot(2,2,3) plot(x,y2-y1,’:g’) grid on title(’ Grafik der y2-y1’) subplot(2,2,4) plot(y3) Funktionsgraphen im R2 mit ezplot Mit dem ezplot-Befehl lassen sich auch Graphen von Funktionen zeichnen. Ein möglicher Aufruf für eine Grafik im ersten Subplot des vorigen Beispiels wäre: >>ezplot(’x^2+5*x+7’,[-10,10]) Die Funktion ezplot erlaubt auch das Zeichnen von Kurven im R2 , die implizit definiert sind und sowohl parametrisierte Kurven als auch Kurven in Polarkoordinaten sein können: Bedeutung Funktion ezplot(’-x^2/4+y^2/25=1’, implizit definierte Kurve [-15,15]) ezplot(’t-sin(t)’, parametrisierte Kurve (Zykloide) ’1-cos(t)’,[0,4*pi]) Kurven in Polarkoordinaten (Kardioide) ezpolar(’1+cos(phi)’) 3D-Grafiken Damit man die Funktionswerte einer Funktion f(x,y) zweier unabhängiger Variablen ausrechnen kann, muss man zunächst ein zweidimensionales Gitter in der xy-Ebene erzeugen. Dann kann man die Funktion in diesen Gitterpunkten berechnen. Somit hat man Punkte auf der Fläche der Funktion bestimmt, und man kann dann den Graphen der Funktion zeichnen. Ein zweidimensionales Gitter in der xy-Ebene wird in MATLAB durch zwei Matrizen definiert. Eine Matrix besteht aus den x-Koordinaten und die andere aus den 12 Kapitel 1. Einführung in MATLAB und Octave y-Koordinaten aller Gitterpunkte. Das Erzeugen dieser Matrizen kann mit der meshgrid-Funktion automatisiert werden. Hierzu muss man die Vektoren x und y der Funktion als Argumente übergeben. Wenn wir z.B. den Bereich [2, 7] × [1, 6] mit 40 Punkten diskretisieren wollen, dann geben wir folgende Befehle an: >> x = 2:0.5:7; >> y = 1:0.5:6; >> [X,Y] = meshgrid(x,y); Nun können wir die Funktionswerte einer zweidimensionalen Funktion ausrechnen. Beachte, dass X,Y Matrizen sind; deswegen benutze man elementweise Operationen. Wollen wir etwa die Funktionswerte von f (x, y) = x2 − y 2 auf obigem Gitter bestimmen, so geht das in einer Zeile: >> Z = X.^2-Y.^2. In der Matrix Z stehen die Funktionswerte der entsprechenden Gitterpunkte. In MATLAB stehen mehrere Funktionen zur Verfügung, um den Graphen von f zu zeichnen. Wir geben zwei Möglichkeiten an Erzeugt eine 3D-Darstellung (offenes Gitter) der Fläche mesh surf Erzeugt eine 3D-Darstellung (schattiertes Gitter) der Fläche Funktionsgraphen im R3 ezmesh(’x^2-y^2’) ezsurf(’x*exp(y^2)’) ezmeshc(’2+x^2-y^2’) ezplot3(’cos(t)’, ’sin(t)’,’2*t’,[0,20]) plot3(2,3,4) 13 zeichnet die Fläche der angegebenen Funktion(offenes Gitter) zeichnet die Fläche der angegebenen Funktion(schattiertes Gitter) zeichnet den Graphen einer Sattelfläche mit Höhenlinien zeichnet eine 3D-Kurve zeichnet einen Punkt im R3 mit den Koordinaten (2, 3, 4) 1.3 m-Files: Matlab als Programmiersprache 1.2.7 Dateien lesen und schreiben In MATLAB kann man Daten- bzw. Textdateien lesen und schreiben. Hierbei kann man zwischen binärem MATLAB- und lesbarem ASCII-Format wählen. Binärdateien haben gegenüber ASCII-Dateien die Vorteile, dass sie weniger Speicherplatz benötigen und schneller gelesen und geschrieben werden können. Aktion Befehl save myfile.mat komplette Sitzung in Datei speichern (MATLABFormat) Variable M in Datei speichern (MATLAB-Format) save(’c:\temp \myfile2.mat’,’M’) save myfile3.mat p Variable p in Datei speichern (ASCII-Format) -ascii Einlesen (default: MATLAB-Format) load myfile3.mat importiert Daten aus den verschiedenen Formaten importdata(’f1.m’) print -depsc myplot.eps aktuellen Plot speichern als Farb-EPS Plot Nr. 4 speichern als 24bit-JPEG print -djpeg -f4 myplot.eps 1.3 1.3.1 m-Files: Matlab als Programmiersprache Scripts Bisher wurden Anweisungen zeilenweise eingegeben und von MATLAB verarbeitet. Diese interaktive Arbeitsweise ist unzweckmäßig für Algorithmen, die mehrere Programmzeilen benötigen und wieder verwenden sollen. Hierfür eignen sich so-genannte m-Files, die mit einem Editor erzeugt werden und unter einem Filenamen mit dem Kürzel .m abgespeichert werden. Es gibt zwei Arten von m-Files: die Script-Files und die Function-Files. Script-Files Ein Script-File ist eine Folge von MATLAB-Anweisungen. Die Anweisungen in einem Script-File werden ausgeführt, wenn man den File-Namen ohne den Suffix .m angibt. Ist zum Beispiel der File-Name test1.m, so gibt man einfach test1 ein. Variablen in einem Script-File sind global. Auch kann in einem Script-File ein anderes m-File aufrufen. Einige nützliche Funktionen für Programmieren mit m-Files sind in der folgenden Tabelle zusammengefasst. Beschreibung MATLAB-Funktion disp Zeigt Resultate am Bildschirm Kontrolle der Bildschirmausgabe echo input Wartet auf Eingabe iöh keyboard Kontrolle auf Tastatur pause Pause bis Tastendruck pause(n) Pause für n Sekunden waitforbuttonpress Pause bis Mausklick oder Tastendruck 14 Kapitel 1. Einführung in MATLAB und Octave 1.3.2 Definition von Funktionen Wenn man intensiver mit MATLAB arbeitet, dann wird man bald feststellen, dass es nicht für alle Wünsche eingebaute Funktionen oder Kommandos gibt. In diesem Fall kann man sich eigene Funktion schreiben und damit die Funktionalität von MATLAB erweitern. Variable in Function-Files sind lokale Variable. Die Übergabe einzelner Variablen erfolgt über eine Parameterliste im Funktionsaufruf. Die allgemeine Form von Functions-Files ist: function [out_1,...,out_n] = Name(In_1,...,In_m) Um einen Funktion-file zu schreiben, muss man ein paar Regeln beachten: • Der File-Name und der Funktionsname müssen übereinstimmen. • Der Name darf bis zu 31 Zeichen haben. Das erste Zeichen muss ein Buchstabe sein. Ziffern und Unterstrich dürfen verwendet werden. • Das Schlüsselwort function muss in der erste Zeile stehen. Dort sind auch die Einund Ausgabeargumente anzugeben. • Die Kommentarzeilen nach der ersten Zeile dienen als Hilfstext. Man bekommt sie mit help < functionname> am Bildschirm angezeigt. • Funktionen können untereinander auch mit dem MATLAB-Workspace über globale Variable kommunizieren. • Ein Funktion-File muss kein Eingabe- oder Ausgabeargument haben. • In einem Funktion-File können mehrere Funktionen stehen. Dabei gibt es eine Erstfunktion und weitere Unterfunktionen. Diese Unterfunktionen können von der Erstfunktion aufgerufen werden und sich gegenseitig aufrufen. Wie alle Funktionen so haben auch Unterfunktionen ihren eigenen Workspace. Beispiel: Berechne die zwei Lösungen einer quadratischen Gleichung x2 + px + q = 0 function [x1,x2] = testfunktion2(p,q) x1 = -p/2 + sqrt(p^2-4*q)/2; x2 = -p/2 - sqrt(p^2-4*q)/2; Achtung: Bei einem Aufruf >>testfunktion2(0,-1) 15 1.3 m-Files: Matlab als Programmiersprache wird nur der erste Ausgabeparameter am Bildschirm ausgegeben. Um beide zu bekommen, muss die Funktion mittels >>[a,b]=testfunktion2(0,-1) aufgerufen werden. Funktionen von Vektoren und Matrizen Wenn eine reellwertige Funktion mit einem Vektor oder einer Matrix als reellwertigem Argument aufgerufen wird, wird die Funktion elementweise für jeden Eintrag des Vektors oder der Matrix ausgeführt. Dies muss man auch bei selbst geschriebenen Funktionen beachten. Wenn man dabei nur bereits (korrekt!) definierte mathematische Operationen verwendet, genügt es, alle Multiplikationen, Divisionen und Potenzierungen mit dem „. “ zu versehen. function y = vektorfunktion1(x) y = x.^2+2.*x+1; Das sollte man auch bei selbst geschriebenen Funktionen beachten. Wenn man in der Funktion „if“-Anweisungen verwendet, muss man dann etwas komplizierter programmieren. Die bereits bekannte (reelle) Betragsfunktion kann man wie folgt modifizieren, damit sie auch für Matrizen korrekt funktioniert: function y = vektorfunktion2(x) s = size(x) size liefert die Anzahl von Zeilen und Spalten von x in einem 2-dimensionalen Vektor zurück . Jetzt kann man den reellen Betrag komponentenweise berechnen: for i=1:s(1) for j=1:s(2) if x(i,j)>0 y(i,j) = x(i,j); else y(i,j) = -x(i,j); end end end Funktionen von Funktionen Die Funktion eval Die Funktion eval stellt in Verbindung mit Textvariablen(Zeichenketten) ein leistungsfähiges Makro zur Textverarbeitung dar. Der Ausdruck bzw. die Anweisung eval(s) lässt mit Hilfe des MATLAB-Interpreters den Ausdruck auswerten oder die Anweisungen ausführen, die in der Textfolge s enthalten sind. Die Funktion feval Die Funktion feval evaluiert eine Funktion, die mit einer Zeichenkette (String) spezifiziert ist. Zum Beispiel ist >>a = feval(’TestFunktion1’,x) zu 16 Kapitel 1. Einführung in MATLAB und Octave >>a = TestFunktion1(x) gleichwertig. feval erlaubt auch mehrere Ein- und Ausgabeargumente. Zum Beispiel sind >>[a,b] = feval(’TestFunktion2’,x,y,z) und >>[a,b] = TestFunktion2(x,y,z) äquivalent. Viele eingebaute MATLAB-Funktionen wie z.B. fzero,fplot,fminbnd verwenden diese Programmiertechnik. Inline-Funktionen Benötigt man während einer MATLAB-Sitzung eine Funktion, so kann man die inline Funktion verwenden. Ist zum Beispiel >> f = inline(’sqrt(x.^2+y.^2)’,’x’,’y’) dann kann man diese Funktion in gewohnter Weise auswerten >>f(4,5) Bisher haben wir Funktionen benutzt, deren Parameter Zahlen bzw. Vektoren oder Matrizen waren. Es gibt in MATLAB aber auch die Möglichkeit, ganze Funktionen an andere Funktionen als Parameter zu übergeben. Als Beispiel für eine Anwendung programmieren wir hier eine Funktion, die eine gegebene Funktion plottet. Ein Beispielaufruf lautet >>funplot(’sin(x)’,1,5,100) Der erste Parameter bestimmt die zu plottende Funktion, der zweite und dritte die untere bzw. obere Intervallgrenze des zu plottenden Bereichs. Der vierte Parameter bestimmt die Anzahl der Stützstellen, die in der Grafik verwendet werden sollen. function funplot(fun,a,b,n,format) inline wandelt den übergebenen Funktionsnamen in eine ausführbare MATLAB Funktion um, g = inline(fun); Wie üblich erzeugen wir den Vektor der Stützstellen t = [a:(b-a)/(n-1):b]; dazu den Vektor von Funktionswerten y = g(t); und plotten das Ganze. plot(t,y,format) Diese Beispielfunktion funplot plottet eine Funktion mit abhängiger Variable x. Beispielaufruf: >>funplot(’sin(x)’,0,2*pi,50,’-’) >>input(´Druecke RETURN´) Eine wichtige Operation mit Funktionen ist die Integration. Die MATLAB Routine zur Integration lautet quad, da numerische Integration üblicherweise als „Quadratur“ bezeichnet wird. >> x = quad(’sin’,0,2*pi) input(’Druecke RETURN’) 17 1.3 m-Files: Matlab als Programmiersprache 18 Kapitel 2 Numerische Algorithmen, ihre Komplexität und Fehleranalyse 2.1 Numerische Algorithmen und Fehlerquellen • Numerische Mathematik beschäftigt sich mit Entwicklung und Analyse numerischer Algorithmen. • Mathematische Größen sind meist stetiger Natur. • Zahlen werden in Computern in Registern oder Zahlenspeichern aufbewahrt. • Computerzahlen können nur eine feste endliche Anzahl von Ziffern aufnehmen. • Man unterscheidet zwischen iterativen und exakten Verfahren. Unter einem numerischen Algorithmus versteht man einer Rechenvorschrift, die aus einer endlichen Folge elementarer Rechenschritte besteht und jede dabei auftretende Rechenoperation nach Art und Reihenfolge eindeutig festlegt. Probleme: • Nicht jede reelle Zahl kann exakt in einem digitalen Computer dargestellt werden. • Komplexe Probleme stetiger Natur sollen durch diskrete einfachere Probleme ersetzt werden. • Iterative Methoden sind theoretisch unendlich. 19 2.1 Numerische Algorithmen und Fehlerquellen Lösungsstrategien • Approximative Darstellung der reellen Zahlen. • Man ersetzt Funktionen durch einfachere Funktionen, z.B durch Polynome. • Man ersetzt nichtlineare Probleme durch lineare Probleme. • Man ersetzt Differentialgleichungen durch algebraische Gleichungen. • Man ersetzt unendlich-dimensionale Räume durch endlich-dimensionale. • Man ersetzt einen unendlichen Prozess durch einen endlichen, z.B. eine unendliche Summe durch eine endliche oder die Ableitungen durch Differenzenquotienten. Fehlerquellen Mögliche Fehlerquellen sind a) Modellierungsfehler: Einige physikalische Eigenschaften des Problems oder des Systems müssen vereinfacht oder weggelassen werden. b) Reale Messfehler: Laborinstrumente haben nur endliche Genauigkeit. Aus Kostengründen werden oft nur wenige Messreihen durchgeführt. c) Eingabefehler: Eingabedaten sind oft selbst nur Näherungen. Fehler, die beim Rechnen entstehen • Diskretisierungsfehler: Mathematische Modelle müssen oft genähert werden. Zum Beispiel muss man den Differentialquotienten durch den Differenzenquotienten annähern. • Abbruchfehler: Bei iterativen Verfahren müssen Abbruchkriterien verwendet werden. • Rundungsfehler: Die Darstellung reeller Zahlen im Computer und die Rechnung mit ihnen ist im allgemeinen unexakt. Beispiel Sei f : R → R eine Funktion und x, x̃ ein exakter bzw. ungenauer Eingabewert. Zudem 20 Kapitel 2. Numerische Algorithmen, ihre Komplexität und Fehleranalyse sei f˜ eine Approximation an f . Dann setzt sich der Gesamtfehler aus Rechenfehler und Datenfehler zusammen: Gesamtfehler = f˜(x̃) − f (x) = f˜(x̃) − f (x̃) + (f (x̃) − f (x)) = Rechenfehler + Datenfehler Rechenfehler = Diskretisierungsfehler + Rundungsfehler • Ein Diskretisierungsfehler ist die Differenz zwischen dem wahren Ergebnis und dem Ergebnis, das man erhalten würde, wenn man mit einem gegebenen Algorithmus am Computer exakt rechnen könnte. • Ein Rundungsfehler ist die Differenz zwischen dem exakt berechneten Ergebnis und dem Ergebnis, das ein gegebener Algorithmus in endlich genauer Arithmetik berechnet. Absoluter und relativer Fehler Ist b ein Näherungswert einer Zahl a, dann gibt es zwei mögliche Wege, den Grad der Abweichung von b gegenüber a zu messen. Absoluter Fehler = |a − b|. Relativer Fehler = Absoluter Fehler |a − b| = . |a| Wahrer Wert Die Kondition eines Problems Kondition = Relative Änderung im Ergebnis Relative Änderung in den Eingangsdaten Ein mathematisches Problem mit kleiner Konditionszahl heißt gut konditioniert, und entsprechende Probleme mit großen Konditionszahlen nennt man schlecht konditioniert. Beispiel Das Problem zur Berechnung der Funktionswerte der Kosinusfunktion für Argumente in der Nähe von π/2. Es gilt: Kondition = cos(x+h)−cos(x) cos(x) (x+h)−x x ≈ −h sin(x) cos(x) h x = − tan(x) ≈ ∞(x → π/2). x Dies bedeutet, dass kleine Störungen in x ≈ π/2 relativ große Änderungen in cos(x) verursachen, unabhängig davon mit welchem Verfahren man die Rechnung durchführt. 21 2.2 Computerarithmetik 2.2 Computerarithmetik Will man auf einem Computer zwei reelle Zahlen addieren oder irgendeine andere arithmetische Operation ausführen, so muss man die reellen Zahlen in den Rechner eingeben. Der Rechner aber kann im allgemeinen eine reelle Zahl nicht genau darstellen. Z.B. Periodische Zahl 1.112 hat unendlich viele Ziffern und kann somit nicht exakt abgebildet werden. Deshalb müssen reelle Zahlen zur Darstellung im Rechner approximiert wiedergegeben werden. Diese Zahlen nennt man Maschinenzahlen. Digitaler Rechner benutzen Gleitpunktarithmetik (Fließpunktarithmetik), das heißt, man kann nur endlich viele Zahlen mit endlicher Genauigkeit darstellen. Dies führt auf Phänomene wie Rundungsfehler, Underflow und Overflow. Gleitpunktzahlen Idee: eine dezimale Zahl als Potenz von 10 zu schreiben. z.B 125678 = 1.25678 ∗ 105 , 0.000000123 = 1.23 ∗ 10−7 . In diesem Format bewegt sich (gleitet oder fließt) der Dezimalpunkt entsprechend der Änderung der Potenz von 10. Jede Zahl x aus einem Gleitpunktsystem lässt sich wie folgt darstellen: x = ±(d0 + dn−1 d1 d2 + 2 + ... + n−1 ) ∗ β e = ±d0 .d1 d2 ...dn−1 ∗ β e , β β β wobei di ∈ {0, ..., β − 1} für i = 0, ..., n − 1 und emin ≤ e ≤ emax gilt. Die Ziffernfolge d0 .d1 d2 ...dn−1 bezeichnet man als Mantisse, e ist der Exponent, β die Basis, n die Mantissenstellenzahl („Genauigkeit“) und {e ∈ Z | emin ≤ e ≤ emax } der Exponentenbereich, wobei auch emin , emax ∈ Z. Computer verwenden heutzutage fast ausschließlich binäre Arithmetik, das heißt β = 2. Taschenrechner dagegen benutzen aus nahe liegenden Gründen dezimale Arithmetik (β = 10). Unabhängig davon, welche Basis ein Computer verwendet, konvertiert er bei einer Eingabe eine dezimale Zahl in die entsprechende Maschinenzahl und wieder in eine dezimale Zahl zurück. Ein Gleitpunktsystem ist normalisiert, wenn die erste Ziffer d0 der Mantisse ungleich Null ist, sofern die darzustellende Zahl nicht gerade die Null ist. Für die Mantisse m gilt dann immer 1 ≤ m < β. Normalisierte Gleitpunktsysteme haben folgende Eigenschaften: • Die Darstellung ist eindeutig. • Die Genauigkeit ist maximal, weil keine Ziffer durch führende Nullen unnötig verbraucht wird. • In einem binärem Gleitpunktsystem ist die führende Ziffer immer 1. Deshalb muss man sie nicht explizit speichern und gewinnt ein zusätzliches Bit, um die Genauigkeit zu erhöhen. 22 Kapitel 2. Numerische Algorithmen, ihre Komplexität und Fehleranalyse Kann eine gegebene reelle Zahl x nicht als Gleitpunktzahl dargestellt werden, so muss sie approximiert werden. Diese Gleitpunktnäherung bezeichnet man mit f l(x) und der Prozess heißt Runden. Der Fehler, der dadurch entsteht, heißt Rundungsfehler. Die Genauigkeit eines Gleitpunktsystems kann durch eine Größe charakterisiert werden, die man Maschinengenauigkeit nennt. Den Wert bezeichnen wir mit εM . Alle in MATLAB abgebildeten reellen Zahlen sind mit einem relativen Fehler kleiner oder gleich εM = 2−52 ≈ 2.2204 ∗ 10−16 behaftet. Es ist also wenig sinnvoll, mehr als sechzehn Stellen in der Mantisse ein - oder auszugeben. Computerarithmetik in MATLAB In MATLAB ist der IEEE-Standard 754 mit doppelter Genauigkeit(64Bit) realisiert, wann immer Hardware und Software dies zulassen. Deshalb hat in MATLAB jede Zahl x die Form: x = ±(1 + f ) · 2e , wobei f = d1 2 + ... + d52 . 252 MATLAB-Name εM realmin realmax Für die Exponenten e gilt −1022 ≤ e ≤ 1023. Beschreibung Maschinengenauigkeit; IEEE: 2−52 ≈ 2.2 · 10−16 Kleinste positive reelle Zahl; IEEE: 2−1022 ≈ 2.2 · 10−308 Größte positive reelle Zahl; IEEE: (2 − 2−52 ) · 21023 ≈ 1.8 · 10308 In MATLAB spricht man von flints, wenn man eine Gleitpunktzahl meint, deren Wert eine ganze Zahl ist. Bei flint-Zahlen gibt es keine Rundungsfehler. Die IEEE-Gleitpunktarithmetik erlaubt spezielle Werte für folgende Ausnahmefälle: • Inf für unendlich, zum Beispiel wenn eine Zahl durch Null dividiert wird. • N aN für not-a-number, wenn Operation undefiniert oder unbestimmt ist, wie 0/0 oder 1/0 Zeichen0 . 2.3 Zur Komplexität numerischer Algorithmen Für Probleme der numerischen Mathematik gibt es meist mehr als einen Lösungsweg. Wählt man zur Lösung einen Algorithmus aus mehreren aus, dann benutzt man dafür drei Hauptkriterien: Geschwindigkeit, Speicheraufwand und Stabilität. Zählen arithmetischer Gleitpunktoperationen In weiteren werden wir n-Vektoren und n × n−Matrizen benutzen, um die Anzahl der 23 2.3 Zur Komplexität numerischer Algorithmen Operationen zu zählen. Addition zweier Vektoren. Für die Berechnung der Summe werden n Additionen benötigt. Skalarprodukt benötigt: • n Additionen • n Multiplikationen Addition zweier quadratischer Matrizen. Hier sind n2 Additionen notwendig. Multiplikation zweier quadratischer Matrizen Matrix C = A ∗ B hat n2 Elemente, und ein Element beinhaltet ein Skalarprodukt zweier Vektoren. Damit benötigt der Algorithmus • n3 Additionen • n3 Multiplikationen Lösen eines linearen Systems mit Dreiecksmatrix. Das Lösen eines linearen GS mit dreiecksförmiger Matrix folgende Operationen benötigt: • 1/2n2 − 1/2n Additionen • 1/2n2 -1/2n Multiplikationen • n Divisionen Der dominante Term. Für große n ist der Term 21 n2 im Ausdruck 12 n2 − 21 n dominant gegenüber dem Term 21 n. Ist z. B. n = 100, so ist das Verhältnis hundert zu eins. Den variablen Faktor im dominanten Term - hier n2 nennt man den dominanten Term des Algorithmus. Damit ist die Ordnung des Algorithmus zur Lösung eines linearen Systems mit Dreiecksmatrix von der Ordnung n2 ,das Skalarprodukt die Ordnung n hat. Hierfür benutzt man die sogenannten Landauschen Symbole und schreibt gewöhnlich O(n2 ) bzw. O(n). Der Faktor 1/2 im Term 1/2n2 heißt die Ordnungskonstante. Es stellt sich heraus, dass man die Ordnung Algorithmus oft leicht bestimmen kann, die Ordnungskonstante aber nicht. Aus diesem Grund wird sie oft unterdrückt und nicht angegeben. Sie ist dann von der Bedeutung, wenn man zwei Algorithmen gleicher Ordnung vergleichen will. Traditionell wurden in der numerischen Mathematik vorwiegend die Multiplikation und Divisionen gezählt, da sie gewöhnlich rechenintensiver als Additionen und Subtraktionen sind, und weil bei vielen Algorithmen ähnlich viele Additionen bzw. Subtraktionen 24 Kapitel 2. Numerische Algorithmen, ihre Komplexität und Fehleranalyse wie Multiplikationen bzw. Divisionen auftreten. Neuerdings gibt es kaum noch nennenswerte Unterschiede zwischen Additionen bzw. Subtraktionen und Multiplikationen bzw. Divisionen. Daher wird zunehmend jede arithmetische Operation gezählt. Gleitpunktoperationen heißen im Englischen floating point operations oder kurz flops. Jede Addition, Subtraktion, Multiplikation, Division und das Berechnen der Quadratwurzel zählt als eine Gleitpunktoperation(flop). Die MATLAB-Funktion flops kann (approximativ) die Anzahl der Gleitpunktoperationen zählen. 25 2.3 Zur Komplexität numerischer Algorithmen 26 Kapitel 3 Graphische Benutzeroberflächen und MATLAB 3.1 Erstellung einer GUI mit MATLAB Grafische Benutzeroberflächen (GUI) vereinfachen die Verwendung von MATLAB-Programmen und machen sie anderen Benutzern zugänglich. MATLAB bietet ein einfaches und leicht erlernbares Konzept zur GUI-Entwicklung. • GUI Elemente • Darstellung kontrollieren (Größe, Position, Farben, Eigenschaften ändern) • Programmierung (Callbacks, Datenstruktur, Spezialfunktionen, handles) • Darstellung von Daten in Grafiken 3.1.1 GUI Elemente 1. Starten Sie MATLAB 2. Rufen Sie im MATLAB-Command-Window das Programm guide auf >>guide 3. Auf der nun erschienenen Arbeitsfläche können verschiedene GUI Elemente positioniert werden. Um die Namen der GUI -Komponenten anzeigen zu lassen, wähle in Menu File Zeile Preferences und in aufgemachtem Fenster setze das Häkchen in Show names in 27 3.1 Erstellung einer GUI mit MATLAB component palette. Wir stellen einzelne GUI-Komponenten dar. Die Beschreibungen einzelner Komponenten wurden aus der MATLAB-Hilfe in englischer Sprache entnommen. • Push Button Push buttons generate an action when clicked. For example, an OK button might close a dialog box and apply settings. When you click a push button, it appears depressed; when you release the mouse, the button appears raised and its callback executes. • Toggle Button Toggle buttons generate an action and indicate whether they are turned on or off. When you click a toggle button, it appears depressed, showing that it is on. When you release the mouse button, the toggle button’s callback executes. However, unlike a push button, the toggle button remains depressed until you click the toggle button a second time. When you do so, the button returns to the raised state, showing that it is off, and again executes its callback. • Radio Button Radio buttons are similar to check boxes, but are typically mutually exclusive within a group of related radio buttons. That is, you can select only one button at any given time. To activate a radio button, click the mouse button on the 28 Kapitel 3. Graphische Benutzeroberflächen und MATLAB object. The display indicates the state of the button. • Check Box Check boxes generate an action when checked and indicate their state as checked or not checked. Check boxes are useful when providing the user with a number of independent choices that set a mode, for example, displaying a toolbar or generating callback function prototypes. • Edit Text Edit text controls are fields that enable users to enter or modify text strings. Use edit text when you want text as input. The String property contains the text entered by the user. The callback executes when you press Enter for a single-line edit text, Ctl+Enter for a multi-line edit text, or the focus moves away. • Static Text Static text controls display lines of text. Static text is typically used to label other controls, provide directions to the user, or indicate values associated with a slider. Users cannot change static text interactively and there is no way to invoke the callback routine associated with it. • Slider Sliders accept numeric input within a specific range by enabling the user to move a sliding bar, which is called a slider or thumb. Users move the slider by pressing the mouse button and dragging the slider, by clicking in the trough, or by clicking an arrow. The location of the slider indicates a percentage of the specified range. • List Box List boxes display a list of items and enable users to select one or more items. • Pop-Up Menu Pop-up menus open to display a list of choices when users click the arrow. • Axes Axes enable your GUI to display graphics (e.g., graphs and images). Like all graphics objects, axes have properties that you can set to control many aspects of its behavior and appearance. See ’Axes Properties’ in the MATLAB Graphics documentation for more information on axes objects. • Panel Panels group GUI components. Panels can make a user interface easier to understand by visually grouping related controls. A panel can have a title and various borders. Panel children can be panels and button groups as well as axes and user interface controls. The position of each component within a panel is interpreted relative to the panel. If you move the panel, its children move with it and maintain their positions on the panel. 29 3.1 Erstellung einer GUI mit MATLAB • Button Group Button groups are like panels but can be used to manage exclusive selection behavior for radio buttons and toggle buttons. For radio buttons and toggle buttons that are managed by a button group, you must include the code to control them in the button group’s SelectionChangeFcn callback function, not in the individual uicontrol Callback functions. A button group overwrites the Callback properties of radio buttons and toggle buttons that it manages. • ActiveX Component ActiveX components enable you to display ActiveX controls in your GUI. ActiveX components are available only on the Microsoft Windows platform. 3.1.2 Darstellung kontrollieren (Größe, Position, Farben, Eigenschaften ändern) Die Eigenschaften der GUI - Komponenten können in Property Inspector angesehen und geändert werden. Der Property Inspektor wird aktiviert durch Doppelklick auf der ausgewählten Komponente. Alle GUI-Komponente besitzen folgende Eigenschaften: Tag Die Tag-Eigenschaft ist ein Identifikationswert für die Komponente. Der wird von dem MATLAB Guide selbst benannt (z.B. pushbutton1), wenn man die Komponente auf das Layout setzt. Mit diesem Tag wird dann auch der Callback-Name der Komponente erweitert ( pushbutton1_Callback). Man sollte die Tag’s abändern, damit sie leichter mit den Komponenten und Callbacks identifiziert werden können (z.B. Okbutton, quitbutton_Callback). Wenn Sie den Tag der Komponenten geändert haben, wird der entsprechende Name des Callbacks beim Speichern auch geändert. String Die String-Eigenschaft enthält Text und wird in der Komponente oder bei der Komponente eingeblendet. Value Die Value-Eigenschaft enthält den numerischen Wert der Komponenten, deren Bereich mit den Eigenschaften Max und Min spezifiziert ist. Für Radio Button und Check Box sind Max und Min mit 1 und 0 voreingestellt. Die Value-Eigenschaft ist 1, wenn Radio Button oder Check Box gewählt ist. 30 Kapitel 3. Graphische Benutzeroberflächen und MATLAB Callback Die Callback-Eigenschaft bestimmt die Callback-Funktion, die im GUI M-File aufgerufen wird, wenn der Benutzer diese Komponente aktiviert. GUI-Komponenten benutzen Callbacks um seine Mission zu erfüllen. Solche Aktionen sind z.B. Klick der Push Button- Taste, Auswahl eines Menüpunktes, Aktivierung der Radio Button-Taste oder Verschiebung des Schiebereglers. Neben der Callback-Funktion, die durch die Callback-Eigenschaft der Komponente bestimmt wird, haben verschiedene graphische Objekte noch zusätzliche Callbacks wie z.B. CreateFcn, DeleteFcn, ResizeFcn. In diesen Callback-Funktionen beschreibt man die Anweisungen, die beim Erzeugen der Komponente (CreateFcn) oder bei der Vernichtung der Komponente (DeleteFcn) usw. durchgeführt werden. 3.2 Programmierung(Callbacks, Datenstruktur, Spezialfunktionen, handles) Nachdem die Grafische Benutzeroberfläche entworfen ist und die Eigenschaften der Komponenten gesetzt sind, fängt man an, GUI zu programmieren. Der Programmcode zum 31 3.2 Programmierung(Callbacks, Datenstruktur, Spezialfunktionen, handles) Gui befindet sich im Gui M-File. Wenn man das GUI speichert oder startet, generiert MATLAB das GUI M-File. In diesem File befindet sich der Initialisierungscode und die Callbacks zu den einzelnen Komponenten. Der generierte Initialisierungscode sollte nicht geändert werden. Daten-Freigabe mit der Handles-Struktur Wenn man GUI startet, erzeugt MATLAB die handles -Struktur. Diese beinhaltet alle Komponenten des gestarteten GUI, z.B. Menüs, Push Buttons, Edit Text und Axes. Wir können handles-Strukturen benutzen für • Freigabe der Daten zwischen Callbacks • Zugriff auf GUI-Data • Zum Speichern der Variable X: handles.current_data = X; guidata(hObject,handles); • Zum Abrufen der im handles gespeicherten Daten: X = handles.current_data; Zugriff auf GUI-Data Wir können die Information der GUI-Komponenten aus der handles-Struktur bekommen: val = str2double(get(handles.edit1,’String’)); Funktionen und Callbacks im M-File Man kann den Code zu den folgenden Teilen des M-Files addieren. • Opening Funktion wird durchgeführt, bevor GUI für den Benutzer sichtbar wird. Man hat hier schon Zugriff auf alle GUI-Komponenten, weil diese schon vor dem Aufruf OpeningFcn erzeugt sind. Man kann hier den Code hineinschreiben, um alle Aufgaben zu erledigen, die man am Anfang machen will. Z.B. gibt man am Anfang in Edit Text etwas aus, zeichnet Grafiken in Axes, blockiert GUI mit dem uiwaitBefehl. functionmy_gui_OpeningFcn(hObject,eventdata,handles,varargin) my_gui(’Position’, [71.8 44.9 74.8 19.7]). • Output Funktion gibt die Output-Argumente in die Kommandozeile zurück. Es kann nützlich sein, wenn man von einer GUI zu einer anderen etwas übergeben will. • Callbacks: Callbacks benutzt man, um mit Hilfe von GUI-Komponenten die Ausführung des Programms zu steuern. Jetzt stellen wir die drei wichtigsten Befehle beim Arbeiten mit GUI vor: 32 Kapitel 3. Graphische Benutzeroberflächen und MATLAB 1) findobj h = findobj(objhandles,’PropertyName’,PropertyValue,...) Findobj findet alle grafischen Objekte mit vorgegebenen Eigenschaften und gibt Objekt-Handles zurück. 2) get a=get(h,’PropertyName’) - gibt den Wert des grafischen Objekts h zurück. 3) set set(H,’PropertyName’,PropertyValue,...) - setzt in Objekt H die Eigenschaft ’PropertyName’ auf den Wert PropertyValue. 3.2.1 Darstellung von Daten in Grafiken Zur Darstellung von Grafiken benutzen wir die GUI-Komponente Axes\index{Axes}. Damit wird definiert, in welchem Objekt der Plot eigentlich dargestellt werden soll. Die Erzeugung von Grafiken übernehmen die Befehle plot(), surf(), ezplot(), plot3d() mit Parametern in der Form, die wir schon in Abschnitt Visualisieren mit MATLAB kennen gelernt haben, z.B. axes(handles.axes1); plot(xDataFull(xIndex),Y2,’-.r’,uax_out(:,3),uax_out(:,2),’-’). 33 3.2 Programmierung(Callbacks, Datenstruktur, Spezialfunktionen, handles) 34 Kapitel 4 Einfache numerische Algorithmen mit MATLAB 4.1 Polynome Polynome spielen in der Mathematik eine wichtige Rolle. Durch Polynome lässt sich eine große Klasse von Funktionen approximieren. Polynome lassen sich einfach differenzieren und integrieren, und man kann leicht die Nullstellen der Polynome numerisch approximieren. Wenn man mit Polynomen höherer Ordnung arbeitet, ist es wichtig, effiziente Methoden zur Auswertung der Polynomwerte zu haben. Dies hat vor allem in Hinsicht auf Rundungsfehler bei Fließkommazahlen große Bedeutung. Im wissenschaftlichen Rechnen ist es darüber hinaus wichtig, die Anzahl der Rechenoperationen einzelner Berechnungen zu minimieren. 4.1.1 Berechnung von Polynomwerten. Horner-Schema Eine effiziente Auswertung eines Polynoms und seiner Ableitungen an bestimmten Stellen wird im Horner-Schema realisiert. Idee des Horner-Schemas: Die Berechnung des Polynoms p(x) = a0 + a1 x + a2 x2 + a3 x3 + a4 x4 an einer Stelle x0 liefert uns folgendes Ergebnis: p(x) = a0 + a1 x0 + a2 x20 + a3 x30 + a4 x40 = a0 + (a1 + (a2 + (a3 + a4 x0 )x0 )x0 )x0 . Die Verallgemeinerung des obigen Rechenvorschrifts in der rekursiven Schreibweise liefert uns folgende Resultat. 35 4.1 Polynome Sei p ein Polynom (an 6= 0) p(x) = n X ak x k . k=0 Zur Auswertung von p an der Stelle x0 setze a0k = ak , k = 0, ..., n, und a1n = a0n a1j = a0j + a1j+1 x0 für j = n − 1, ..., 0. Dann gilt p(x0 ) = a10 . Mit Hilfe des Horner-Schemas lässt sich das Polynom durch den linearen Faktor (x − x0 ) teilen. Seien pn (x) = pn−1 (x) = n X j=0 n X a0j xj a1j xj−1 j=1 Dann gilt für beliebiges x0 und nach obigem Schema entwickelten a10 : pn (x) = pn−1 (x)(x − x0 ) + a10 . Jetzt sind wir in der Lage, das vollständige Horner-Schema zu präsentieren. Für k = 0, ..., n und j = k, .., n definieren wir ak+1 = akj + ak+1 j j+1 x0 . Diese Rekursionformel bedeutet nun, dass das Element ak+1 sich aus der Summe des j darüberstehenden Elements und des links danebenstehenden Elements multipliziert mit x0 ergibt. Wir stellen das vollständige Horner-Schema tabellarisch dar. x0 x0 x0 .. . a0n a1n a2n a3n .. . a0n−1 a1n−1 a2n−1 a3n−1 .. . a0n−2 a1n−2 a2n−2 a3n−2 .. . ... ... ... ... a02 a12 a22 a32 a01 a11 a21 a00 a10 x0 an−1 an−1 an−1 n−1 n−2 n x0 ann ann−1 x0 an+1 n Als Anwendung lassen sich die Koeffizienten einer Taylorreihe durch das Horner-Schema berechnen, n X p(k) (x0 ) Tx0 p(x) = (x − x0 )k . k! k=0 Hierbei ergibt sich p(k) (x0 ) = k! · ak+1 k . 36 Kapitel 4. Einfache numerische Algorithmen mit MATLAB 4.1.2 Polynome in MATLAB Polynome werden in MATLAB durch einen Zeilenvektor repräsentiert, wobei die Komponenten des Vektors die Koeffizienten des Polynoms darstellen. Die Reihenfolge ist absteigend festgelegt z.B. die Polynome p1 (x) = 3x2 − 2 und p2 (x) = 14x4 − 7x2 + 9x − 6 werden durch folgende Vektoren in MATLAB gegeben: >>p1 = [3 0 -2] >>p2 = [14 0 -7 9 -6] Die Nullstellen des Polynoms lassen sich anhand der Funktion roots() berechnen. >> r = roots(p1) Mit dem Befehl poly() können wir aus den Nullstellen das Polynom konstruieren. Da ein Polynom aber durch seine Nullstellen nur bis auf ein Vielfaches eindeutig bestimmt ist, wählt MATLAB das Polynom mit Koeffizient 1 vor dem höchsten Monom. In MATLAB sind andere nützliche Funktionen, die dem Anwender das Arbeiten mit Polynomen erleichtern implementiert. Die folgende Tabelle fasst die Funktionen zusammen: Funktion Beschreibung conv() Multipliziert Polynome deconv() Dividiert Polynome poly() Berechnet Polynom aus Nullstellen polyder() Berechnet die Ableitung eines Polynoms polyval() Berechnet Polynomwerte roots() Berechnet Nullstellen eines Polynoms 37 4.2 Nullstellenberechnung 4.2 Nullstellenberechnung Wir betrachten eine nichtlineare Funktion f : Rd → Rd und die damit resultierende nichtlineare Gleichung f (x) = 0 (4.1) Wir nennen x eine Nullstelle der nichtlinearen Gleichung (4.1), wenn x eine Lösung der Gleichung (4.1) ist. Unser Ziel ist es verschiedene Methoden zur Lösung solcher Gleichungen vorzustellen. Bevor man zur Vorstellung einzelner Methoden übergeht, diskutieren wir die Fragen der Existenz und Eindeutigkeit der Lösung. Im Falle linearer Probleme haben wir bekannte Ergebnisse, z.B. hat ein lineares Gleichungssystem entweder keine, eine oder unendlich viele Lösungen. Für die Eindeutigkeit der Lösung muss die Matrix regulär sein. Im nichtlinearen Fall können die Gleichungen jede Anzahl von Lösungen haben. Darüber hinaus können nichtlineare Gleichungen mehrfache Nullstellen besitzen. Lineare Gleichungen bzw. lineare Gleichungssysteme lassen sich in endlich vielen Schritten lösen. Dagegen sind nichtlineare Gleichungen nicht immer direkt lösbar. Diese Gleichungen können im allgemeinen nur approximativ gelöst werden, und zwar durch die Anwendung des geeigneten iterativen Verfahrens. 4.2.1 Bisektions-Methode Als Einführung in die Problematik stellen wir das Intervallschachtellungsverfahren (BisektionsMethode) vor. Im folgenden interessieren wir uns nur für reelle Nullstellen nichtlineare Gleichungen im R1 . Idee der Bisektions-Methode: Wechselt eine stetige Funktion f auf einem Intervall ihr Vorzeichen, so muss sie nach dem Zwischenwertsatz (ZWS) in diesem Intervall mindestens eine Nullstelle haben. Algorithmus der Bisektions-Methode Angenommen f sei eine stetige Funktion auf dem Intervall [a0 , b0 ] mit mindestens einer Nullstelle in [a0 , b0 ]. Die Bisektions-Methode hat dann folgende Form: 1) Für n = 0, 1, 2, 3, ... 2) berechne Mittelpunkt mn = an +bn . 2 3) Wenn f (mn )f (an ) < 0 ist, dann liegt die Nullstelle in [an , mn ]; bn+1 := mn , an+1 := an . Gehe zu 1) und erhöhe n um 1. 5) Wenn f (mn )f (bn ) < 0 ist, dann liegt die Nullstelle in [mn , bn ]; bn+1 := bn , an+1 := mn . Gehe zu 1) und erhöhe n um 1. 38 Kapitel 4. Einfache numerische Algorithmen mit MATLAB Konvergente iterative Methoden erzeugen eine Folge von Approximationen {xn }n∈N ⊂ R, so dass mit der Nullstelle x gilt lim xn = x (4.2) n→∞ Weil iterative Methoden theoretisch unendlich viele Schritten haben, muss man ein Abbruchkriterium festlegen. Für die Bisektions-Methode werden wir folgendes Abbruchkriterium verwenden: Führe den Algorithmus solange durch, bis |a − b| kleiner als eine vorgegebene Zahl tol ist. Wie schon erwähnt wurde, konvergiert die Iterationsfolge. Es stellt sich die Frage nach Konvergenzgeschwindigkeit der Methode. Es lässt sich leicht zeigen, dass 1 1 |xn − x| ≤ (bn − an ) = n+1 (b0 − a0 ) 2 2 (4.3) gilt, wobei xn der Intervallmittelpunkt des Intervalls (an , bn ) und x die Nullstelle der nichtlinearen Gleichung ist. Diese Abschätzung nennt man a-priori-Fehlerabschätzung, und damit sind wir in der Lage zu sagen, wie viele Schritte höchstens erforderlich sind, um eine Approximation der Nullstelle x mit einer vorgegebener Genauigkeit zu berechnen. Fassen wir zusammen: Für die Implementierung einer iterativen Methode sollten folgende Fragen beantwortet werden. • Angabe des Startpunktes bzw. Startintervalls des Verfahrens. • Konvergiert die Iterationsfolge? Wenn die Folge konvergiert, ermitteln wir die Konvergenzgeschwindigkeit der Methode. • Wann wird die Iterationsfolge abgebrochen? Für die Charakterisierung der Konvergenzgeschwindigkeiten führen wir folgende Definitionen ein. Definition 4.1 Eine Iterationsfolge {xn }n∈N konvergiert linear mit der Rate c (0 ≤ c < 1) gegen die Nullstelle x, wenn lim sup n→∞ |xn+1 − x| =c |xn − x| (4.4) gilt. Definition 4.2 Eine Iterationsfolge {xn }n∈N konvergiert mindestens mit der Ordnung p und der Rate c (0 ≤ c < 1) gegen die Nullstelle x, wenn |xn+1 − x| p lim sup ≤c |xn − x| n→∞ 39 (4.5) 4.2 Nullstellenberechnung gilt. Ist p = 2, so ist die Ordnung mindestens quadratisch usw. Gilt sogar |xn+1 − x| p = c 6= 0 lim sup |xn − x| n→∞ (4.6) so konvergiert die Folge genau mit der Ordnung p. Ist c = 0 so nennt man die Konvergenz superlinear (p = 1), superquadratisch (p = 2) usw. Aus (4.3) erhalten wir unmittelbar, dass die Konvergenzgeschwindigkeit der BisektionsMethode linear mit p = 1 und c = 0.5 ist. Vorteile und Nachteile der Bisektions-Methode Ein Vorteil der Bisektions-Methode ist ihre globale Konvergenz; ein Nachteil ist ihre langsame lineare Konvergenzgeschwindigkeit. 4.2.2 Methode der sukzessiven Approximation Sei F : Rd → Rd eine skalare(d = 1) oder vektorwertige(d > 1) Funktion. Definition 4.3 Eine Zahl x∗ ∈ Rd heißt Fixpunkt von F , wenn x∗ Lösung der folgenden Gleichung ist: x∗ = F (x∗ ) (4.7) Die Iterationsvorschrift der Methode der sukzessiven Approximation (Fixpunktiteration) hat die Form xn+1 = F (xn ), n = 0, 1, 2, ... (4.8) Dabei ist x0 die Anfangsapproximation. Jetzt stellt sich die Frage, ob die Fixpunktiteration eine konvergente iterative Methode ist. Die Antwort ist ja, wenn die Funktion F eine Kontraktion ist. Satz 4.4 (Theorem 5.7 in [Pla00]) Sei M ⊂ Rd eine abgeschlossene Teilmenge, und die Abbildung F : M → M sei bezüglich einer Vektornorm k.k : Rd → R eine Kontraktion, das heißt, für eine Konstante 0 < L < 1 sei kF (x) − F (y)k ≤ Lkx − yk x, y ∈ M, (4.9) erfüllt. Dann gilt folgendes: a) F besitzt genau einen Fixpunkt x∗ ∈ M ; 40 Kapitel 4. Einfache numerische Algorithmen mit MATLAB b) Für jeden Startwert x0 ∈ M liefert die Fixpunktiteration (4.8) eine gegen x∗ konvergierende Folge, und es gelten die Fehlerabschätzungen kxn − x∗ k ≤ Ln L kxn − xn−1 k ≤ kx1 − x0 k, 1−L 1−L n = 1, 2, 3, ... (4.10) Für stetig differenzierbare Funktionen F können wir ein wichtiges Kriterium für die Lipschitz-Bedingung (4.9) angeben. Satz 4.5 ([SH82] S. 35) Die Funktion F sei stetig differenzierbar auf der Teilmenge M = Kρ (c) = {x ∈ Rd | kx − ck ≤ ρ}. Dann ist die Bedingung kF 0 (x)k ≤ L, x ∈ M, (4.11) notwendig und hinreichend für die Lipschitz-Bedingung (4.9): kF (x) − F (y)k ≤ Lkx − yk x, y ∈ M. Auf der Basis der Methode der sukzessiven Approximation lassen sich vergleichsweise effiziente Methoden zur Nullstellenberechnung bilden. Die Nullstellen von f : M → Rd sind gerade die Fixpunkte der folgenden Funktion F : f (x) = 0 ⇔ x = F (x), F (x) = x − Cf (x), x ∈ M. Dabei ist M eine abgeschlossene Teilmenge des Rd und C eine reguläre d × d−Matrix. 4.2.3 Newton-Verfahren Die Iterationsfolge des Newtonsverfahrens ist im R1 durch folgende Formel definiert: xn+1 = xn − 1 f 0 (x n) f (xn ), n = 0, 1, 2, ... (4.12) Im weiteren bezeichnet G eine offene Teilmenge des R. Folgender Satz sichert uns die Konvergenz der Newton-Methode mit quadratischer Konvergenzgeschwindigkeit für einfache Nullstelle unter den im Satz getroffenen Voraussetzungen. Satz 4.6 ([SH82], S. 39) Die Funktion f ∈ C 2 (G) möge mit positiven Zahlen m, M den Bedingungen genügen |f 0 (x)| ≥ m, |f 00 (x)| ≤ M, x ∈ G. (4.13) Zu jeder Nullstelle z ∈ G gibt es dann eine Umgebung Kρ (z) ⊆ G, ρ > 0, so dass z die einzige Nullstelle von f in Kρ (z)ist, für jeden Anfangswert x0 ∈ Kρ (z) die Näherungen x1 , x2 , ... in Kρ (z) bleiben und gegen die Nullstelle z konvergieren mit der a-prioriFehlerabschätzung q= 41 M |x0 − z| < 1, 2m |xn − z| ≤ 2m 2n q , n = 0, 1, 2, ..., M 4.2 Nullstellenberechnung und den a-posteriori-Fehlerabschätzungen |xn − z| ≤ 1 M |f (xn )| ≤ |xn − xn−1 |, n = 0, 1, 2, .... m 2m Bei einer einfachen Nullstelle ist das Newton-Verfahren lokal quadratisch konvergent. Bei einer mehrfachen Nullstelle x∗ konvergiert das Newton-Verfahren superlinear, xn+1 − x∗ 1 = 1 − , x∗ m-fache Nullstelle. n→∞ xn − x∗ m lim Kennt man m nicht, so kann man mit Hilfe der Asymptotik xn−1 − xn 1 xn − xn−2 ≈1− ⇒ m≈ xn−2 − xn m xn−1 − xn−2 m approximieren. Wenn x∗ eine m − f ache Nullstelle ist, dann können wir das NewtonVerfahren beschleunigen: f (xn ) . xn+1 = xn − m 0 f (xn ) Diese modifizierte Iterationsfolge konvergiert quadratisch gegen eine m−fache Nullstelle x∗ . Vorteile und Nachteile des Newton-Verfahrens Vorteil • Bei einfacher Nullstelle lokal quadratisch konvergent Nachteile • Benötigt Ableitungswerte • Nur lokal konvergent 4.2.4 Die Sekantenmethode (Regula falsi) Wenn man die in der Newton-Methode benötigte Ableitung f 0 nicht ausrechnen kann, so approximiert man die Ableitung f 0 durch einen Differenzenquotienten. Damit erhält man folgende Iterationsformel: xn+1 = xn − f (xn ) xn − xn−1 , f (xn ) − f (xn−1 ) n = 0, 1, 2, ... (4.14) Dabei benötigt die Sekantenmethode zwei Anfangswerten x0 , x1 . Der Konvergezsatz für die Sekantenmethode lässt sich ganz analog wie beim Newton-Methode formulieren und beweisen. Einzige Unterschied stellt die Konvergenzgeschwindigkeit dar. Es lässt sich zeigen, dass Sekantenmethode superlinear gegen die einfache Nullstelle x∗ konvergiert. 42 Kapitel 4. Einfache numerische Algorithmen mit MATLAB Vorteile und Nachteile der Sekantenmethode Vorteile • Benötigt keine Ableitung der Funktion • Benötigt nur eine neue Funktionsauswertung pro Iteration • Bei einfacher Nullstelle superlinear konvergent Nachteil • Nur lokal konvergent 4.3 4.3.1 Lineare Gleichungssysteme: Direkter und iterativer Löser Inverse Matrix, Normen und Konditionszahl der Matrix Zuerst betrachten wir MATLAB-Name dot(a,b) norm(b) norm(b,p) cross(a,b) det(A) inv(A) eye(n) norm(A)=norm(A,2) norm(A,1) norm(A,inf) cond(A)=cond(A,2) cond(A,1) cond(A,inf) einige nützliche Funktionen: Bedeutung Skalarprodukt zwei Vektoren Euklidische Länge eines Vektors P 1 kbkp = ( ni=1 |bi |p ) p Kreuzprodukt Determinant von A Inverse von A n × n Einheitsmatrix Spektralnorm P maxj P ni=1 |aij | maxi nj=1 |aij | Konditionszahl von A bezüglich der Spektralnorm cond(A) bzgl. der Spaltensummennorm k.k1 . cond(A) bzgl. der Zeilensummennorm k.k∞ . Man kann lineare Gleichungssysteme Ax = b mittels der Inversen der Matrix A lösen: x=inv(A)*b. Dies ist aber numerisch ineffizient im Vergleich zu anderen Vorgehensweisen. 43 4.3 Lineare Gleichungssysteme: Direkter und iterativer Löser 4.3.2 Direkte Verfahren MATLAB hat eine Reihe von Algorithmen zur Lösung von linearen Gleichungssystemen und verwandten Problemen eingebaut. Sei A = [ 1 5 6; 7 9 6; 2 3 4], b = [29; 43; 20]. Der Grundbefehl zur Lösung eines linearen Gleichungssystems ist der umgekehrte Schrägstrich x=A\b Die Rechnung wird mit der Gauß-Elimination (mit Pivotierung) durchgeführt. Wenn A in obererer oder unterer Dreiecksform vorliegt, wird Rückwärts- bzw. Vorwärtseinsetzen durchgeführt. Anmerkung: Wenn A nicht quadratisch ist, wird keine Fehlermeldung ausgegeben, sondern automatisch das zugehörige lineare Ausgleichsproblem gelöst (Verallgemeinerte bzw. Quasi-Lösung). Vorwärtseinsetzen Wir betrachten zunächst untere System gegeben: l11 l21 l31 Dreieckssysteme Lx = b. Hierzu sei folgendes 3 × 3 0 0 x1 b1 l22 0 x2 = b2 l32 l33 x3 b3 Die Unbekannten x1 , x2 und x3 können wie folgt berechnet werden: b1 l11 b2 − l21 x1 = l22 b3 − l31 x1 − l32 x2 = l33 x1 = x2 x3 Rückwärtseinsetzen Das Lösen eines linearen Systems U x = b mit einer oberer Dreiecksmatrix U geschieht analog zum unteren Dreiecksfall. u11 u12 u13 x1 b1 0 u22 u23 x2 = b2 0 0 u33 x3 b3 Die Unbekannten x1 , x2 und x3 können wie folgt berechnet werden: 44 Kapitel 4. Einfache numerische Algorithmen mit MATLAB b3 u33 b2 − u23 x3 = u22 b3 − u12 x2 − l13 x3 = u11 x3 = x2 x1 Die Grundlage der Gauss-Elimination Methode bildet eine LU-Zerlegung. Die Matrix A lässt sich in ein Produkt A = LU einer unteren Dreiecksmatrix L und einer oberen Dreiecksmatrix U zerlegen. Ist nun eine LU −Faktorisierung gegeben, dann kann man das lineare Gleichungssystem Ax = b auch als LU x = b schreiben. Damit läßt sich das untere Dreieckssystem Ly = b durch Vorwärtseinsetzen und das obere Dreieckssystem U x = y durch Rückwärtseinsetzen lösen. Bei Vertauschung (P A = LU ) muss Ly = P b durch Vorwärts- und dann U x = y durch Rückwärtseinsetzen gelöst werden. Vereinbart man noch, dass bei L nur jeweils 1 in der Diagonale steht, dann ist die obige Zerlegung eindeutig. LU-Zerlegung in MATLAB In MATLAB erfolgt eine LU-Zerlegung einer Matrix A mit dem Befehl lu(A). Je nach Anzahl der Ausgabeargumente erhält man unterschiedliche Antwortmatrizen. >>[L,U,P] =lu(A) Mit Hilfe von 3 Ausgabeargumenten erhält man die untere Dreiecksmatrix L, die obere Dreiecksmatrix U sowie die Permitationsmatrix P. Es gilt dann P A = LU. >>[L,U] =lu(A) Hier bekommt man die obere Dreiecksmatrix U und die verallgemeinerte Dreiecksmatrix L. A = LU. >>Y=lu(A) Man findet im oberen Teil der Matrix Y die obere Dreiecksmatrix U wieder und unter der Hauptdiagonalen die untere Dreiecksmatrix L ohne Hauptdiagonale als Untermatrizen. Deswegen ist Y = U+L-eye(size(X)), wenn [L,U,P] = lu(X) gilt. 45 4.3 Lineare Gleichungssysteme: Direkter und iterativer Löser 4.3.3 Iterative Verfahren zur Lösung linearer Gleichungssysteme Die direkten Verfahren stellen bei einer kleinen Anzahl von Unbekannten oftmals eine effiziente Vorgehensweise dar. Iterative Methoden lösen ein lineares System dadurch, dass sie mit einem Startpunkt beginnen und diesen solange sukzessiv verbessern, bis die gewünschte Genauigkeit erreicht ist. Theoretisch müssen unendlich viele Iterationsschritte durchgeführt werden. In der Praxis aber hört man auf, sobald das Residuum kb − Axk oder ein anderes Fehlermaß klein genug ist. MATLAB stellt eine Reihe von Verfahren zur iterativen Lösung linearer Gleichungssysteme zur Verfügung. Wir werden nun einige wichtige Verfahren durchgehen, die alle - im Gegensatz zum Jacobi oder Gauss-Seidel Verfahren - für allgemeine quadratische Matrizen funktionieren. Alle diese Methoden basieren sich auf die Methode der konjugierten Gradienten. Die Methode der konjugierten Gradienten Die Methode der konjugierten Gradienten basiert auf Ideen der mathematischen Optimierung. Sie ist anwendbar auf lineare Systeme mit symmetrischen und positiv definiten Matrizen. In exakter Arithmetik konvergiert das Verfahren in einer endlichen Anzahl von Schritten. Aufgrund von Rundungsfehlern auf dem Computer muss die Methode jedoch als ein iteratives Verfahren betrachtet werden. Algorithmus zur Lösung des GS Ax = b Ist x0 der Startpunkt und p0 = r0 = b − Ax0 , dann wiederholt man für k =0,1,... folgende Schritte bis Konvergenz eintritt: 1. αk = rkT rk pT k Ask (Schrittweite) 2. xk+1 = xk + αk pk (Approximierte Lösung, Iterierte) 3. rk+1 = rk − αk Apk (Residuum) 4. βk+1 = T rk+1 rk+1 rkT rk 5. pk+1 = rk+1 + βk+1 pk (Schrittrichtung) Verfahren für reguläre Matrizen Zunächst definieren wir uns ein Beispiel-Gleichungssystem und zwar eins, das sehr schlecht konditioniert ist A = [0.7800.563; 0.913 0.659]; b = [0.217; 0.254]; cond(A,2) Die exakte Lösung dieses Systems ist [1; -1]. Wir stellen jetzt cg- basierte Verfahren dar. Im Einzelnen sind dies bicgstab - „stabilisiertes bikonjugiertes Gradientenverfahren “ 46 Kapitel 4. Einfache numerische Algorithmen mit MATLAB cgs -„quadriertes konjugiertes Gradientenverfahren “ bicg-„bikonjugiertes Gradientenverfahren“ gmres - „verallgemeinertes Minimalresiduumsverfahren“ Bei dem ersten Beispiel, dem ´´bicgstab´´ Verfahren, betrachten wir genauer, welche Parameter angegeben werden können. Alle Verfahren haben die gemeinsame Eigenschaft, dass sie verschiedene Abbruchkriterien verwenden. Nach Abbruch des Verfahrens wird ausgegeben, aus welchem Grund die Iteration beendet wurde. 1) Abbruch bei erreichter gewünschter Genauigkeit: Hier wird für eine vorgegebene Toleranz ´´tol´´ so lange iteriert, bis das relative Residuum kAx − bk/kbk < tol (für die 2-Norm) ist. Der Vorteil dieses Verfahrens liegt darin, dass sich der Fehler in der Lösung dann aus der Kondition der Matrix A abschätzen lässt. Die gewünschte Genauigkeit ist mit 10−6 voreingestellt. 2) Abbruch nach maximaler Anzahl an Iterationen: Wenn eine maximale Anzahl von Iterationen erreicht ist, wird das Verfahren in jedem Fall abgebrochen, auch wenn die gewünschte Genauigkeit noch nicht erreicht ist. Die maximale Anzahl der Iterationen ist mit n (=Dimension des Problems) voreingestellt. 3) Abbruch bei Stagnation: Wenn sich das Residuum nicht mehr verbessert, wird ebenfalls abgebrochen, auch wenn die gewünschte Genauigkeit noch nicht erreicht ist. Wir illustrieren nun die verschiedenen Abbruchkriterien. Beachte: Die Anzahl der Iterationen, die nach dem Abbruch angegeben wird, kann ein nichtganzzahliger Wert sein, da viele Verfahren mehrstufige Iterationsschritte durchlaufen, die nach einem Teildurchlauf abgebrochen werden können. Wir rufen das Verfahren zunächst ohne weitere Paremeter auf. >> bicgstab(A,b) input(’druecke RETURN’) Hier tritt nun ein Abbruch wegen erreichter maximaler Anzahl der Iterationen auf. Als optionale Parameter können nun die Toleranz als drittes Argument und die maximale Anzahl der Iterationen als viertes Argument angegeben werden. Wir erhöhen nun die Anzahl der Iterationen und belassen die Toleranz bei dem voreingestellten Wert 1e-6. >>bicgstab(A,b,1e-6,20) input(’druecke RETURN’) Hier tritt ein Abbruch bei erreichter Genauigkeit ein, das Ergebnis ist aber noch nicht zufriedenstellend, da A schlecht konditioniert ist. Wir erhöhen also die gewünschte Toleranz: >>bicgstab(A,b,1e-10,20) input(’Druecke RETURN’) Jetzt kann man mit dem Ergebnis zufrieden sein. Wir verwenden jetzt den gleichen Aufruf für andere Verfahren >>cgs(A,b,1e-10,20) input(’Druecke RETURN’) >>bicg(A,b,1e-10,20) input(’Druecke RETURN’) >>qmr(A,b,1e-10,20) input(’Druecke RETURN’) Eine Ausnahme macht das gmres-Verfahren, das eine verschachtelte Iteration verwendet. Hier muss als dritter Parameter die maximale Anzahl der Schritte der inneren Iteration angegeben werden. >>gmres(A,b,3,1e-10,20) input(’Druecke RETURN’) Welches Verfahren für welche Problemklasse am angemessensten ist, hängt stark vom betrachteten Problem ab. 47 4.3 Lineare Gleichungssysteme: Direkter und iterativer Löser 48 Literaturverzeichnis [DR05] F.-J. Delvos, H.-J. Reinhardt, Numerik I, Skript, Universität Siegen, August 2005. [GW00] G. Gramlich, W. Werner, Numerische Mathematik mit Matlab: eine Einführung für Naturwissenschaftler und Ingenieure, dpunkt-Verlag, 2000. [MF99] J. H. Mathews, K. D. Fink, Numerical Methods using MATLAB, Prentice Hall, 1999. [Mat05a] Matlab: Mathematics, The MathWorks, Natick, MA, USA, 2005. htpp://www.mathworks.de [Mat05b] Matlab: Graphics, pp://www.mathworks.de The MathWorks, Natick, MA, USA, 2005. ht- [Mat05c] Matlab: Programming, The MathWorks, Natick, MA, USA, 2005. htpp://www.mathworks.de [Mol04] C. Moler, Numerical Computing with MATLAB, SIAM, 2004. [Pla00] R. Plato, Numerische Mathematik kompakt, Vieweg, Wiesbaden, 2000. [SH82] F. Stummel, K. Hainer, Praktische Mathematik, B.G. Teubner, Stuttgart, 1982. 49 Stichwortverzeichnis Algorithmus, 19 Callback, 31 Datentyp, 8 Fehler absoluter, 21 relativer, 21 Datenfehler, 21 Rechenfehler, 21 Rundungsfehler, 23 File Funktion-File, 15 Script-File, 14 findobj, 33 flop, 25 for, 10 Format double-Format, 5 MATLAB-Format, 14 Zahlenformat, 5 ASCII-Format, 14 Funktion von Funktionen eval, 16 feval, 16 inline, 17 von Vektoren und Matrizen, 16 Gauss-Algorithmus, 44 get, 33 Gleitpunktsystem, 22 Gleitpunktzahl Basis, 22 Exponent , 22 Mantisse, 22 Grafik 2D-Grafik, 11 3D-Grafik, 12 Funktionsgraph im R2 , 12 Funktionsgraph im R3 , 13 GUI, 27 Gui Element Axes, 29, 33 Button Group, 30 Edit Text, 29 Panel, 29 Push Button, 28 Radio Button, 28 Static Text, 29 Handles, 32 help, 4 helpdesk, 4 helpwin, 4 IEEE, 5 IEEE-Standard, 23 if, 10 KDE, 3 Koctave, 3 Kommentar, 4 Kondition, 21 Kontraktion, 40 Konvergenzgeschwindigkeit, 40, 41 Lapack, 3 linspec, 11 lookfor, 4 LU-Zerlegung, 45 Maschinengenauigkeit, 23 Matrix, 2, 7 meshgrid, 13 Methode 50 STICHWORTVERZEICHNIS Bisektions-Methode, 38 Methode der konjugierten Gradienten, 46 Methode der sukzessiven Approximation, 40 Newton-Verfahren, 41 Sekantenmethode, 42 Nullstelle, 38 Octave, 3 Operation logische, 9 Standardoperation, 5 elementweise Operation, 8 Ordnung des Algorithmus, 24 Ordnungskonstante, 24 plot, 11 Polynom Horner-Schema, 35 Polynome in Matlab, 37 Property Inspektor, 30 Prototyp, 2 set, 33 Simulink, 2 Steuerstruktur Schleife, 9 Sprunganweisung, 10 Verzweigung, 10 switch, 10 Toolbox, 2 Variable, 5 Vector, 6 Visualisierung, 1, 10 while, 10 51