2. Okt. 2006 ... Einführung. 1.1 Allgemeines. 1.1.1 Ziel des Kurses. Erlernen von grundlegenden
Kenntnissen und erste Erfahrungen im Umgang mit Matlab.
Programmieren mit Matlab — Eine Einfu¨hrung — J. Berns-M¨ uller 2. Oktober 2006
Inhaltsverzeichnis 1 Einf¨ uhrung 1.1 Allgemeines . . . . . . . . . . . . . . . . . . . 1.1.1 Ziel des Kurses . . . . . . . . . . . . . 1.1.2 Was ist Matlab . . . . . . . . . . . . 1.1.3 Wieso Sie Matlab lernen sollten . . . 1.1.4 Vorteile von Matlab . . . . . . . . . 1.1.5 Andere mathematische Softwarepakete 1.2 Erste Schritte . . . . . . . . . . . . . . . . . . 1.2.1 Starten und Beenden . . . . . . . . . . 1.2.2 Demo . . . . . . . . . . . . . . . . . . 1.2.3 Help . . . . . . . . . . . . . . . . . . . 1.3 Literatur . . . . . . . . . . . . . . . . . . . . . 1.4 Aufgaben . . . . . . . . . . . . . . . . . . . . 2 Zahlen, Vektoren und Matrizen 2.1 Grundlegendes . . . . . . . . . . . . . 2.2 Definitionen von Zahlen, Vektoren und 2.2.1 Zahlen . . . . . . . . . . . . . . 2.2.2 Matrizen . . . . . . . . . . . . 2.2.3 Definition von Vektoren . . . . 2.3 Arbeiten mit Matrizen . . . . . . . . . 2.3.1 Matrix versus Vektor . . . . . . 2.4 Matrix Operationen . . . . . . . . . . 2.4.1 Unit¨ are Operatoren . . . . . . 2.4.2 Bin¨ are Operatoren . . . . . . . 2.5 Matrizen, Funktionen und Konstanten 2.5.1 Konstanten . . . . . . . . . . . 2.5.2 Trigonometrische Funktionen . 2.5.3 Einige Standard-Funktionen . . 2.5.4 Weitere Matrixoperationen . . 2.6 Aufgaben . . . . . . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
4 4 4 4 4 4 5 5 5 6 6 7 7
. . . . . . Matrizen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
9 9 9 9 10 12 12 13 14 14 14 15 15 16 16 16 16
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
18 18 18 18 19 20 21 22 23 23
. . . . . . . . . . . .
3 Skripte, Funktionen und Debugging 3.1 Allgemeines . . . . . . . . . . . . . . . . . . . . 3.2 Editor . . . . . . . . . . . . . . . . . . . . . . . 3.3 Ein erstes Skript . . . . . . . . . . . . . . . . . 3.4 Skript f¨ ur Einsendeaufgaben . . . . . . . . . . . 3.5 Eine erste Funktion . . . . . . . . . . . . . . . . 3.6 Einzeilige-Funktionen . . . . . . . . . . . . . . 3.7 Unterfunktionen und Funktionen als Parameter 3.8 Fehlersuche . . . . . . . . . . . . . . . . . . . . 3.9 Aufgaben . . . . . . . . . . . . . . . . . . . . .
1
. . . . . . . . .
2
INHALTSVERZEICHNIS 4 Schleifen und Verzweigungen 4.1 Verzweigungen . . . . . . . 4.1.1 if-Verzweigung . . . 4.1.2 switch-Verzweigung . 4.1.3 Die Suchabfrage find 4.2 Schleifen . . . . . . . . . . . 4.2.1 Die f or-Schleife . . . 4.2.2 Die while-Schleife . 4.3 Aufgaben . . . . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
24 24 24 25 25 26 26 26 27
5 Weitere Datentypen 5.1 Zeichenkette (string) . . . . 5.2 Struktur (struct) . . . . . . 5.3 Der Datentyp Block (cell) . 5.4 Mengen . . . . . . . . . . . 5.5 Arbeiten mit Zeichenketten 5.6 Arbeiten mit Bl¨ ocken . . . . 5.7 Aufgaben . . . . . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
28 28 29 30 30 31 32 33
6 Speichern und Lesen von Datens¨ atzen 6.1 Speichern und Lesen von Matlab Daten . . . . 6.2 Exportieren und Importieren von ASCII Daten 6.2.1 Schreiben von ASCII Daten . . . . . . . 6.2.2 Einlesen von der Tastatur . . . . . . . . 6.2.3 Einlesen aus einer Datei . . . . . . . . . 6.3 Importieren und Exportieren von Datenbanken 6.4 Ein ausf¨ uhrliches Beispiel . . . . . . . . . . . . 6.5 Aufgaben . . . . . . . . . . . . . . . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
34 34 35 35 36 36 37 37 38
7 Graphik ¨ 7.1 Ubersicht . . . . . . . . . . . . . . . . 7.2 Der plot-Befehl . . . . . . . . . . . . . 7.2.1 plot mit einem Argument . . . 7.2.2 plot mit mehreren Argumenten 7.2.3 Ein ausf¨ uhrliches Beispiel . . . 7.3 F¨ ur Fortgeschrittene . . . . . . . . . . 7.4 Images . . . . . . . . . . . . . . . . . . 7.5 Aufgaben . . . . . . . . . . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
40 40 42 42 42 43 43 44 44
8 Verfahren der numerischen linearen Algebra 8.1 Gew¨ ohnliche Matrizen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.1.1 Erzeugen von Matrizen und Vektoren . . . . . . . . . . . . . . . 8.1.2 Rechnen mit Matrizen . . . . . . . . . . . . . . . . . . . . . . . . 8.1.3 Zerlegen von Matrizen . . . . . . . . . . . . . . . . . . . . . . . . 8.2 D¨ unnbesetzte Matrizen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.2.1 Erzeugen d¨ unnbesetzter Matrizen . . . . . . . . . . . . . . . . . . 8.2.2 Iterative Verfahren zum L¨ osen von linearen Gleichungssystemen 8.3 Aufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
45 45 45 45 46 47 47 48 48
9 Numerische Verfahren 9.1 Polynome . . . . . . . . . . . . . . . 9.2 Quadratur . . . . . . . . . . . . . . . 9.3 Stochastik . . . . . . . . . . . . . . . 9.4 Andere Funktionen . . . . . . . . . . 9.5 Gew¨ ohnliche Differentialgleichungen
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
50 50 51 52 52 53
. . . . .
. . . . . . . .
. . . . .
. . . . . . . .
. . . . .
. . . . . . . .
. . . . .
. . . . . . . .
. . . . .
. . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
INHALTSVERZEICHNIS 9.6 9.7
3
Partielle Differentialgleichungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Aufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
54 54
10 Beispiele 10.1 Zufallszahlengeneratoren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
56 56
Kapitel 1
Einfu ¨ hrung 1.1 1.1.1
Allgemeines Ziel des Kurses
Erlernen von grundlegenden Kenntnissen und erste Erfahrungen im Umgang mit Matlab.
1.1.2
Was ist Matlab
Matlab ist ein kommerzielles Softwarepaket zum numerischen Rechnen. Dieses Paket wird vertrieben durch die Firma MathWorks The MathWorks Inc. 3 Apple Hill Drive, Natick, MA 01760-2098 http://www.mathworks.com mit dem deutschen Zweigsitz The MathWorks GmbH: Friedlandstraße 18 D-52064 Aachen Phone: 024147075-0 Fax: 024147075-12
Studentenlizenzen? http://www.mathworks.de/academia/student center/ 1.1.3
Wieso Sie Matlab lernen sollten
• In der Industrie verwendet man Matlab, um einfache mathematische Probleme numerisch zu l¨ osen. • Im Bereich der mathematischen Software-Entwicklung (Industrie und Forschung) wird Matlab als Entwicklungsumgebung verwendet, um dann numerische Codes, die z.B. in Fortran oder C geschrieben werden, zu testen und zu verbessern. • Es gibt bereits heute sehr viele Zusatzbausteine f¨ ur Matlab, um komplexe Aufgaben einfach zu l¨ osen.
1.1.4
Vorteile von Matlab
• Einfaches Programmieren • Automatische Speicherverwaltung
4
¨ KAPITEL 1. EINFUHRUNG
5
• Automatische Typkonvertierung • Detaillierte Fehlermeldungen • Hohe Qualit¨ at der implementierten Routinen • Open Source vieler Routinen • Vielf¨ altige M¨ oglichkeiten der Visualisierung von Daten • Einfaches Einlesen von Daten • Routinen f¨ ur d¨ unnbesetzte Matrizen
1.1.5
Andere mathematische Softwarepakete
Es gibt zahlreiche weitere mathematische Softwarepakete und Bibliotheken, nachfolgend eine kleine Auswahl: maple Computeralgebra-System, speziell f¨ ur Funktional-Analysis gap Computeralgebra-System f¨ ur Experten, speziell f¨ ur Algebra femlab Finite Elemente Software Paket zum numerischen L¨ osen von partiellen Differentialgleichungen LAPACK numerische Verfahren der linearen Algebra (direkte Methoden) SCALAPACK numerische Verfahren der linearen Algebra f¨ ur gr¨ oßere Probleme (direkte Methoden) ARPACK numerische Verfahren der linearen Algebra (iterative Methoden) NAG Bibliothek numerischer Verfahren (Fortran) Petsci Bibliothek paralleler numerischer Verfahren (C++/MPI) Weitere Pakete und Bibliotheken kann man zum Beispiel unter www.netlib.org“ finden. ”
1.2 1.2.1
Erste Schritte Starten und Beenden
Angenommen Sie besitzen einen account auf einem Unix bzw. Linux Rechner, auf dem Matlab installiert ist, dann kann Matlab durch matlab“ bzw. durch matlab -nojvm“ aus jedem Verzeich” ” nis aufgerufen werden. Der Aufruf von matlab“ ben¨ otigt eine Java-Umgebung und liefert daf¨ ur die ” volle Matlab-Entwicklungsumgebung. F¨ ur Fortgeschrittene und falls die Java-Umgebung Schwierigkeiten verursachen sollte, gibt es den Aufruf matlab -nojvm“. In diesem Falle wird das xterm ” zum Kommandofenster. Zum Beenden von Matlab gibt man exit“ im Kommandofenster ein und dr¨ uckt die [Return]” Taste.
¨ KAPITEL 1. EINFUHRUNG
1.2.2
6
Demo
Das Starten von Matlab kann je nach Betriebssystem auf verschiedene Weise erfolgen und dauert in der Regel einige Sekunden. Zum Beispiel ist auf Linux/Unix Systemen der Aufruf matlab ausreichend. Matlab ¨ offnet dann ein kleines Fenster mit einem Logo, bevor es das eigentliche Hauptfenster mit einigen Unterfenstern ¨ offnet. Viele der standardm¨ aßig ge¨ offneten Unterfenster ¨ sind eher st¨ orend. Um eine bessere Ubersicht zu erlangen, schließen Sie folgende Unterfenster in beliebiger Reihenfolge, sofern diese offen sind: • Workspace • Current Directory • Command History • Help • Profiler Nun sollten Sie nur noch ein Fenster offen haben, das eine Begr¨ ußung enth¨ alt und einen Matlab-Prompt (Eingabe-Aufforderung). >> Geben Sie nun in diese Zeile >> demo >>
ein und beenden Sie die Zeile mit der [Return]-Taste (erst durch das Bet¨ atigen der Returntaste wird Matlab aufgefordert, diese Zeile zu bearbeiten). Mit dem Einr¨ ucken und der senkrechten Linie machen wir Matlab-Code deutlich, wie er im Command-Fenster eingegeben wird, gelegentlich auch seine Wirkung. Spielen Sie ein wenig mit den dort gegebenen Demos.
1.2.3
Help
Eine der wichtigsten Hilfefunktionen ist die help Funktion. Geben Sie >> help >>
ein. Zu allen hier aufgef¨ uhrten Stichw¨ ortern gibt es weitere Informationen. Geben Sie zum Beispiel >> help general >>
ein. Matlab verf¨ ugt u uhrliche online-Dokumentation, ¨ber viele Hilfestellungen. Zum einen eine ausf¨ viele Informationen in den Hilfstexten ( help“), zahlreiche Beispiele ( demos“) und h¨ aufig ist der ” ” Programmcode frei zug¨ anglich ( type“). Ferner gibt es viele Hilfefunktionen, die in Matlab im” plementiert sind.
¨ KAPITEL 1. EINFUHRUNG
1.3
7
Literatur
Da die in Matlab integrierten Hilfefunktionen sehr ausf¨ uhrlich sind, sollte dieses Tutorial als Einstieg gen¨ ugen. Dennoch geben wir hier eine kurze Auswahl an Hilfen zum Arbeiten mit Matlab.
F¨ ur Anf¨ anger sind die B¨ ucher Rudra Pratap Getting Started with Matlab (Oxford) Duane Hanselman & Bruce Littlefield Mastering Matlab (Prentice Hall) geeignet. F¨ ur fortgeschrittenes numerisches Programmieren empfehlen wir Desmond Higham & Nicholas Higham Matlab guide (SIAM) Darren Redfern & Colin Campbell The Matlab Handbook (Springer) Ferner sei das Graphik Handbuch von Mathworks, das zu jedem Installationspaket von Matlab geh¨ ort, empfohlen. Allgemeine Lernhilfen zum Programmieren f¨ ur Einsteiger Klaus Menzel Algorithmen. Vom Problem zum Programm. (Teubner)
1.4
Aufgaben
Nachfolgende Aufgaben sollen Ihnen die Arbeitsweise von Matlab etwas n¨ aherbringen, also nicht verzweifeln falls sie derzeit etwas nicht verstehen, probieren sie es trotzdem. Aufgabe 1.1 Starten Sie Matlab und schließen Sie alle Matlab-Fenster bis auf das Kommando Fenster. F¨ uhren Sie nun den Befehl help help“ aus. ” Aufgabe 1.2 Geben Sie im Kommando-Fenster die Befehle clear“ und area = pi*r b2“ ein. ” ” (Der zweite Befehl sollte zu einer Fehlermeldung f¨ uhren.) Nun geben Sie die Befehle >> r=2; >> area = pi*r b2 >> area >> area = @(r) pi*r b2 >> area(2) >> area(3) >>
ein.
Aufgabe 1.3 Testen Sie das Demo zum Traveling Salesman“-Problem, travel“ und lesen Sie ” ” sich die zugeh¨orige Hilfe, help travel“, durch. Den Code kann man sich mit type travel“ an” ” schauen. Aufgabe 1.4 Geben Sie den Befehl help“ und anschließend den Befehl help ops“ ein. (Auf ” ” ¨ diese Weise kann man sich sehr viele Hilfen und Ubersichten anschauen, eine Alternative ist das demo-Paket.)
¨ KAPITEL 1. EINFUHRUNG
8
Aufgabe 1.5 Selbst schwierigere Aufgaben sind leicht zu l¨osen, z.B. das L¨osen eines Anfangswertproblems. Gegeben sei das Anfangswertproblem
d dt
2
x(t) = −x(t)
x(0) = 1,
welches die Cosinusfunktion als L¨osung hat. Mit dem nachfolgenden Code wird eine numerische L¨osung berechnet und graphisch dargestellt. Der letzte Befehl bewirkt die graphische Darstellung der Abweichung der numerischen von der exakten L¨osung. >> f=@(t,x) [0,1;-1,0]*x; >> [t,x] = ode45(f,[0:0.1:10],[1;0]); >> plot(t,x(:,1)) >> plot(t,x(:,1)-cos(t)) >> ein. (Nicht verzweifeln! Das werden Sie in K¨ urze selber k¨onnen.)
Kapitel 2
Zahlen, Vektoren und Matrizen 2.1
Grundlegendes
Da Matlab automatisch Datentypen anpasst, ben¨ otigt man gew¨ ohnlich nicht mehr als die grundlegenden Datentypen: matrix, string, cell, struct. Dabei ist der Datentyp matrix der wichtigste Datentyp. Jede Zahl wird als eine 1 × 1 Matrix, jeder Zeilenvektor der L¨ ange n als eine 1 × n Matrix und jeder Spaltenvektor der L¨ ange n als eine n×1 Matrix interpretiert. Eine formale Unterscheidung von reellen und komplexen Zahlen findet nicht statt. Matlab stellt selbst fest, ob die Zahl eine ganze Zahl, eine reelle Zahl oder eine komplexe Zahl ist. Ferner sind die Werte Inf (infinity = unendlich) und NaN (not a number = keine Zahl) als Zahlen zugelassen. Dabei ist aber zu beachten, dass Matlab damit nur eingeschr¨ ankt rechnen kann. Da Matrizen so wichtig sind im Umgang mit Matlab, werden wir uns im Folgenden sehr intensiv mit Matrizen besch¨ aftigen. Zuerst betrachten wir zahlreiche M¨ oglichkeiten, eine Matrix zu definieren und anschließend mit ihr zu arbeiten. ¨ Eine umfassende Ubersicht aller Datentypen erh¨ alt man mit >> help datatypes >> Die weiteren wesentlichen Datentypen werden in Kapitel 5 vorgestellt.
2.2 2.2.1
Definitionen von Zahlen, Vektoren und Matrizen Zahlen >> a=1 >>
Mit dem Einr¨ ucken und der senkrechten Linie machen wir Matlab-Code, wie er im CommandFenster eingegeben wird, und gelegentlich auch seine Wirkung deutlich. Dabei bezeichnen wir das Zeichen >> am Zeilenanfang als Matlab-Prompt. a Name der neuen/ver¨anderten Variablen: Um das Ergebnis einer Rechnung zu speichern, kann durch name = der Variablen name“ ein Wert zugewiesen werden. Matlab erlaubt kompli” ziertere Zuweisungen, wir werden sp¨ ater noch einige Beispiele kennenlernen. 9
KAPITEL 2. ZAHLEN, VEKTOREN UND MATRIZEN
10
Namen von Variablen m¨ ussen mit einem Buchstaben beginnen, der durch eine beliebige Folge von Buchstaben und Zahlen sowie dem Unterstrich, “, gefolgt werden kann. Generell ” unterscheidet Matlab zwischen Groß- und Kleinschreibung. (Einschr¨ankung f¨ur WindowsSysteme 2000 und abw¨ arts: keine Unterscheidung der Groß- und Kleinschreibung von Dateinamen und damit auch nicht von selbstgeschriebenen Funktionen und Skripten, sowie vieler importierter Funktionen)
= Zuweisung: Im Gegensatz zu einigen Programmiersprachen verwendet Matlab ein einfaches ¨ Gleichheitszeichen als Zuweisungsoperator. (Der bin¨are Operator, der zur Uberpr¨ ufung der Gleichheit dient, ist in Matlab ==“ das doppelte Gleichheitszeichen!) ”
>> >> >> >> >>
b=2 c=3.1 d=1e2 e=2.1e-2
Matlab erkennt automatisch, ob eine Zahl ganzzahlig oder reell ist. Man kann aber explizite Konvertierungen benutzen, zum Beispiel liefert int16(a) eine ganze Zahl zwischen -32768 und 32767. >> g=1+3i >> h=i >> i=1 >> j >> k=i >> 1+2i komplexe Zahlen: Mittels der Eingabe von 1 + 2i bzw. von 1 + 2j kann die komplexe Zahl mit Realteil eins und Imagin¨ arteil zwei dargestellt werden. Matlab erkennt automatisch, dass die Eintr¨ age komplexwertig sind und passt die interne Zahlendarstellung an. Simultan andert sich das Ausgabeformat. ¨
Achtung: Falls die Variablen i und j nicht belegt sind, so gilt 1 + 2i = 1 + 2 ∗ i = 1 + 2 ∗ j. Da i und j h¨aufig als Laufvariablen benutzt werden, empfiehlt sich die zweite Notation nicht! (Man kann Matlab-Befehle und Variablen u¨ berschreiben, indem man einer Variablen etc. diesen Namen gibt und der Variablen einen Wert zuweist. Um die urspr¨ ungliche Bedeutung des Matlab-Befehls wiederherzustellen, muss die eigene Variable gel¨ oscht werden. Dies geht mit dem Befehl clear, siehe help clear.)
2.2.2
Matrizen >> A = [1, 2, 3; 4, 5, 6; 7, 8, 9; 10, 11, 12]; >>
[ ] eckige Klammern/Matrix: Ein Paar eckiger Klammern definiert eine Matrix. Die Gr¨ oße der Matrix wird automatisch anhand der Eintr¨ age zwischen den eckigen Klammern ermittelt. Steht kein Zeichen zwischen den eckigen Klammern, so handelt es sich um eine 0 × 0 Matrix, oder leere Matrix. Wir werden sp¨ ater eine Verwendung f¨ ur eine leere Matrix sehen. Kommas, ,“, trennen zwei Eintr¨ age, die in der gleichen Zeile stehen, und Semikolons, ;“, ” ” trennen zwei Zeilen voneinander. Es ist darauf zu achten, dass die Anzahl der Elemente f¨ ur alle Zeilen gleich ist. Sonst erscheint eine Fehlermeldung und die Zuweisung erfolgt nicht. Im obigen Beispiel haben wir also eine 4 × 3 Matrix mit den Eintr¨ agen von 1 bis 12 definiert.
KAPITEL 2. ZAHLEN, VEKTOREN UND MATRIZEN
11
; abschließendes Semikolon: Ein Semikolon, ;“, am Ende eines Befehls hat zwei Bedeutungen: ” Erstens definiert dies das Ende eines Befehls und zweitens unterdr¨ uckt es die Ausgabe. Die Ausf¨ uhrung erfolgt nach Beendigung der Zeile durch die [Return]-Taste. Alternativ kann das Semikolon weggelassen werden, dann entspricht das Bet¨ atigen der [Return]-Taste dem Befehlsende, aber die Ausgabe wird nicht unterdr¨ uckt. Wenn wir uns den Wert einer Variablen anschauen wollen, z.B. den Inhalt der Matrix A, so geben wir einfach den Namen ein und dr¨ ucken [Return]. >> A ans = 1 2 3 4 5 6 7 8 9 10 11 12 >>
Das Ausgabeformat h¨ angt im Wesentlichen von vier Faktoren ab: vom Format der Zahlendarstellung, vom Format der Matrix, von dem zur Verf¨ ugung stehenden Platz und, ob die Zahlen reell oder komplex sind. Das Zahlenformat kann durch die format-Anweisung ge¨ andert werden, n¨ aheres siehe help format“. ” ¨ Die Anderung des Formats hat keinen Einfluss auf die Rechengenauigkeit. (Mehr zu diesem
Thema in der Vorlesung Einf¨ uhrung in die numerische Mathematik“.) ”
Es gibt viele weitere M¨ oglichkeiten, eine Matrix zu definieren. Zuerst l¨ oschen wir die Matrix A >> clear A >>
nun k¨ onnen wir andere Varianten testen >> A=[1,2,3;... 4,5,6;... 7,8,9;... 10,11,12]; >>
Diese Definition der Matrix ist ¨ aquivalent zur urspr¨ unglichen Definition, aber viel u ¨bersichtlicher. ... Befehlsfortsetzung: Der dreifache Punkt erlaubt eine saubere Notation, die dem sp¨ ateren Leser hilft. Wird der dreifache Punkt von einem Return oder einem anderen Zeichen gefolgt, so werden diese ignoriert. Hier noch einige weitere Varianten, die Matrix A zu definieren: >> clear >> A=[[1,2;4,5],[3;6];... [7;10],[8,9;11,12]]; >> A=[[1;4;7;10],[2;5;8;11],[3;6;9;12]]; >> clear >> A=[]; >> A=[A;1,2,3]; >> A=[A;4,5,6]; >> A=[A;7,8,9]; >> A=[A;10,11,12];
KAPITEL 2. ZAHLEN, VEKTOREN UND MATRIZEN >> >> >> >> >> >> >> >> >> >> >> >> >> >>
12
clear A(1,1)=1; A(1,2)=2; A(1,3)=3; A(2,1)=4; A(2,2)=5; A(2,3)=6; A(3,1)=7; A(3,2)=8; A(3,3)=9; A(4,1)=10; A(4,2)=11; A(4,3)=12;
Es gibt noch viele weitere M¨ oglichkeiten. Hier sollten nur einige Ideen vorgestellt werden. Der Befehl A = [ ] definiert die Variable A, somit kann in der nachfolgenden Zeile auf A zugegriffen werden. Die zuletzt vorgef¨ uhrte Variante nutzt aus, dass Matlab die Gr¨ oßenanpassung automatisch vornimmt, nicht definierte Eintr¨ age werden auf 0 gesetzt. Matrixeintr¨ age m¨ ussen nicht ganzzahlig sein! >> B=[-1.1,2.2;1,-exp(1)]; >>
2.2.3
Definition von Vektoren
Vektoren werden in Matlab als Matrizen interpretiert. >> a=[1,2,3]; >> b=[1;2;3]; >> c=1; >> d=[1:5]; >> e=[2:-0.1:1.05]; >>
: Doppelpunkt: Die Anweisung a : b erzeugt einen Zeilenvektor mit den Eintr¨ agen a, a + 1, a + 2, . . . , a + k, wobei k die gr¨ oßte ganze Zahl kleiner gleich b − a ist. Falls a und b ganze Zahlen sind, so ist a:b“ ein Vektor, der als Indexvektor f¨ ur eine Matrix benutzt werden kann. ” Die Anweisung a:b:c“ erzeugt einen Vektor mit den Eintr¨ agen a, a+b, a+2b, a+3b, . . . , a+kb, ” wobei k die kleinste ganze Zahl kleiner gleich (c − a)/b ist.
2.3
Arbeiten mit Matrizen
Der Zugriff auf einzelne Elemente einer Matrix erfolgt durch >> a=A(2,3); >>
Man kann auch auf einen ganzen Vektor zugreifen >> b=A(:,2); >> b=A(1:3,2); >>
KAPITEL 2. ZAHLEN, VEKTOREN UND MATRIZEN
13
oder auf eine Untermatrix >> B=A(1:3,2:3); >>
(Die hier verwandte Großschreibung von Namen f¨ ur Matrizen und die Kleinschreibung von Namen f¨ ur Zahlen und Vektoren ist in der numerischen Algebra u andnis ¨ blich. Sie dient vor allem dem schnelleren Verst¨ der einzelnen Operationen.)
2.3.1
Matrix versus Vektor
Intern werden Matrizen linear gespeichert, d.h. f¨ ur eine n×k Matrix werden alle Eintr¨ age von 1 bis n · k indiziert, dieser Index wird nachfolgend als Gesamtindex bezeichnet. Zur Veranschaulichung definieren wir eine Matrix und weisen jedem Element den entsprechenden Indexwert zu >> A = zeros(3,4); >> [1:12] >> A(:) = [1:12] >> A(5:9) >> F¨ ur die Umrechnung von den Indices i, j auf den Gesamtindex gibt es die Funktion sub2ind“ ” und f¨ ur die Umkehrung die Funktion ind2sub“. ” Seien I und J Index-Mengen (das bedeutet, ihre Werte sind positive ganze Zahlen, hier zwischen 1 und 4, bzw. 1 und 3), dann kann man auch mehrere besondere Elemente gleichzeitig zuweisen. >> I=[1,1,4,4]; >> J=[1,3,1,3]; >> f=A(sub2ind(size(A),I,J)); >>
Um auf eine Liste von Matrixelementen gleichzeitig zugreifen zu k¨ onnen, ben¨ otigen wir entweder eine k × 1 Liste, die den Gesamtindex der jeweiligen Elemente beinhaltet, oder wir ben¨ otigen den Befehl sub2ind“ und eine k × 2 Matrix, die je Zeile den Zeilen- und Spaltenindex des jeweiligen ” Matrixelements enth¨ alt. (In einigen fr¨uheren Varianten von Matlab funktionierten auch einige weitere Blockabfragen“ .) ” ¨ Ahnlich wie beim Zugriff auf Elemente einer Matrix, kann man einzelne Elemente einer Matrix andern. ¨ >> A(4,1)=0; >> A(3,2)=-1; >> Man kann auch mehrere Eintr¨ age einer Matrix simultan ¨ andern. >> A(1,:)=2+A(1,:); >> A(2:3,1:2)=[15,16;-1,-2]; >>
¨ Diese simultanen Anderungen sind sehr effektiv, sie werden schneller ausgef¨ uhrt, als wenn die ¨ Anderungen durch einzelne Ausf¨ uhrungen erfolgen. Falls eine Zahl zu/von einem Vektor oder einer Matrix addiert/subtrahiert wird, wird die Zahl als ein Vektor bzw. eine Matrix der gleichen Gr¨ oße betrachtet mit allen Eintr¨ agen gleich der Zahl, die Anweisung 2+A(1,:)“ kann also durch 2*[1,1,1]+A(1,:)“ ersetzt werden. Allerdings ben¨ otigt ” ” man im ersten Fall keine Informationen u oße von A. Zudem ist die erste Variante sch¨ oner ¨ber die Gr¨ und schneller.
KAPITEL 2. ZAHLEN, VEKTOREN UND MATRIZEN
2.4
14
Matrix Operationen
H¨ aufig wird zwischen unit¨ aren und bin¨ aren Operatoren unterschieden. Der Unterschied ist, ob ein Operator sich nur auf eine Variable bezieht oder zwei Variablen miteinander mathematisch verbindet. So ist die Transposition eines Vektors oder einer Matrix eine unit¨ are Operation und die Addition zweier Matrizen eine bin¨ are Operation.
2.4.1
Unit¨ are Operatoren
Betrachten wir zun¨ achst die drei unit¨ aren Operatoren. - Negation: B=−A“ negiert den Wert in A und weist ihn B zu. ” 0 . Transposition: B = A.0“ weist B den Wert der transponierten Matrix von A zu. ” 0 Transposition und komplexe Konjugation: B=A0“ weist B den Wert der transponierten komplex ” konjugierten Matrix von A zu. Betrachten wir unsere Beispiel-Matrix nochmal! >> A = [1, 2, 3; 4, 5, 6; 7, 8, 9; 10, 11, 12] >> B = A0 >> C = A.0 >> A(1, 1) = 1 + 2i >> D = A0 >> E = A.0 >> F=−A >>
W¨ ahrend B und C identisch sind, unterscheiden sich die Matrizen D und E im (1, 1) Element. (Die Verwendung von 0 hilft h¨ aufig, numerische Verfahren sowohl auf reelle Matrizen, wie auch auf komplexe Matrizen anwenden zu k¨ onnen.)
2.4.2
Bin¨ are Operatoren
Bei den bin¨ aren Operatoren gibt es die Operationen aus der linearen Algebra, wie auch einige zus¨ atzliche, die elementweise agieren bzw. lineare Gleichungssysteme l¨ osen. >> B = A + A; >> C = A0 ∗ A; >> D = B − A; >> a = [1 : 4]; >> E = a0 ∗ a; >> f = a ∗ a0 ; >> G = C b2 >> Zus¨ atzlich ist auch >> b = 2; >> d = A/b; >>
erlaubt, wobei darauf zu achten ist, dass b eine Zahl ungleich Null (also eine 1 × 1 Matrix) oder eine passende nichtsingul¨ are Matrix ist. Wie bereits erw¨ ahnt, kennt Matlab weitere Operatoren, die elementweise angewandt werden.
15
KAPITEL 2. ZAHLEN, VEKTOREN UND MATRIZEN >> B = A. b2; >> B = A./A; >> C = A. ∗ A; >>
Eine weitere Besonderheit von Matlab sind die L¨ osungsoperatoren \“ und /“ f¨ ur lineare Glei” ” chungssysteme der Formen Ax = b bzw. xA = b. Gegeben sei das lineare Gleichungssystem Ax = b, wobei A und b bekannt sind, dann errechnet man die L¨ osung x mit x = A\b. >> b = [1 : 4]0 ; >> c = [1 : 4]; >> A = [1, 2, 3, 4; ... 4, 5, 6, 7; ... 7, 7, 9, 9; ... 10, 10, 10, 11]; >> x = A\b; >> y = c/A; >> % Mit einem %-Zeichen werden Kommentare begonnen. >> % Kommentarende ist grunds¨atzlich das Zeilenende. >> >> % Probe >> A ∗ x − b >> y ∗ A − c >> Dabei ist darauf zu achten, dass die Matrix invertierbar ist. Andernfalls erh¨ alt man statt einer L¨ osung eine Fehlermeldung. (Die Ausf¨ uhrung der Befehle A/b“ und b\A“ geschieht durch Erzeugen einer LR-Zerlegung von A, ” ” die anschließend auf alle Spalten von b angewandt wird, somit darf b auch eine Matrix sein!)
2.5
Matrizen, Funktionen und Konstanten
Viele Funktionen und Operationen in Matlab k¨ onnen sowohl mit Zahlen als auch mit Vektoren und Matrizen ausgef¨ uhrt werden. N¨ aheres wird in der Regel in den Hilfsinformationen zu den jeweiligen Funktionen bzw. Operationen erkl¨ art. Nachfolgend beschreiben wir eine Auswahl von Konstanten und eine Auswahl von Funktionen, die mit Matrizen (Zahlen, Vektoren oder Matrizen) arbeiten.
2.5.1
Konstanten
Einige wichtige Konstanten sind bereits definiert: Gr¨ oße π e Maschinengenauigkeit
Befehl pi exp(1) eps
Wert 3.1415. . . 2.7182. . . 2.22 . . . · 10−16
(Der Computer hat nur endlich viel Speicher, daher kann er nur endlich viele Zahlen darstellen, somit muss der Computer nach jeder Rechnung auf eine Zahl runden, die er darstellen kann → Rundungsfehler, siehe Vorlesung Einf¨ uhrung in die numerische Mathematik“ .) ”
16
KAPITEL 2. ZAHLEN, VEKTOREN UND MATRIZEN
2.5.2
Trigonometrische Funktionen
Matlab hat trigonometrische Funktionen, die bzgl. des Bogenmaßes rechnen: sin asin sinh asinh
cos acos cosh acosh
tan atan tanh atanh
cot acot coth acoth
und trigonometrische Funktionen, die bzgl. 360 Grad rechnen: sind asind
cosd acosd
tand atand
cotd acotd
F¨ ur große Argumente sind die Funktionen bzgl. des Winkels in Grad genauer, da sie den Einfluss von Rundungsfehlern reduzieren. >> sin(pi) >> 3e12 - 3*10 b12 >> sin(3e12*pi) >> sind(3e12*180) >>
2.5.3
Einige Standard-Funktionen
Hier stellen wir nur einige Verfahren vor. In Kapiteln 8 und 9 werden weitere Verfahren besprochen. exp(a)
Exponentialfunktion
log(a)
nat¨ urlicher Logarithmus
log2(a)
Logarithmus zur Basis 2
log10(a)
dekadischer Logarithmus
real(a)
Realteil
imag(a)
Imagin¨ arteil
abs(a)
Absolutwert, Betrag
sign(a)
Vorzeichen, Richtung
norm(a)
2-(Matrix-/Vektor-)Norm
norm(a, p)
p-(Matrix-/Vektor-)Norm
Bei norm(a,p)“ sind nur die Werte 1, 2, inf und 0 f ro0 f¨ ur p erlaubt. ”
2.5.4
Weitere Matrixoperationen
Nachfolgende Befehle ¨ andern die Anordnung der Matrix f liplr rot90 ipermute
Spaltenpermutation Drehung der Matrix Umkehrung von permute“ ”
f lipud permute reshape
Zeilenpermutation Permutation der Dimensionen ¨ Andern des Matrixformats
(Die Befehle permute“ und ipermute“ sind keine gew¨ ohnlichen Permutationen sondern sie ” ” vertauschen die Koordinatenachsen.)
2.6
Aufgaben
Aufgabe 2.1 Arbeiten Sie die Eingaben der Abschnitte 2.1 bis 2.4 durch und betrachten Sie die Resultate sorgf¨altig! Aufgabe 2.2 Berechnen Sie den Quotienten von 1 + 3i und 1 − 2i. Aufgabe 2.3 Berechnen Sie den Wert
√ 17−5 e3 −5 .
KAPITEL 2. ZAHLEN, VEKTOREN UND MATRIZEN Aufgabe 2.4 Berechnen Sie die L¨osung 1 2 2 3 1 2 0 1
17
des lineaen Gleichungssystems 1 0 1 1 2 1 x = 1 4 2 2 3 1
Aufgabe 2.5 Zeichnen Sie die Sinus-Funktion f¨ ur Werte x zwischen 0 und 2π. (Verwenden Sie zum Zeichnen den Befehl plot(x,sin(x))“, dabei darf x auch ein Vektor oder eine Matrix sein.) ” Aufgabe 2.6 Legen Sie 3 × 4 Matrizen mit den Eintr¨agen 0 und 1 an, indem Sie die Funktionen zeros“ und ones“ verwenden. Kontrollieren Sie die Gr¨oße ihrer Matrizen mit dem Befehl size. ” ” Aufgabe 2.7 Erzeugen Sie A als eine 10 × 5 und B als eine 12 × 6 Matrix mit zuf¨alligen Elementen. Die Matrix C sei eine 10 × 9 Matrix, bei der die ersten drei Spalten mit denen von A ubereinstimmen. Alle anderen Spalten stammen von B, wobei die Elemente der letzten beiden Zei¨ len von B ignoriert werden. Schließlich konstruieren Sie die Matrix D, eine 10 × 6 Matrix, bei der alle geraden Spalten von C stammen, die ungeraden von A. Aufgabe 2.8 Sei A = [1, 2, 3; 4, . . . , 12]; wie so oft in diesem Kapitel. Benutzen Sie nun den Befehl b=diag(A)“ und betrachten Sie B=diag(b)“. ” ”
Kapitel 3
Skripte, Funktionen und Debugging 3.1
Allgemeines
Skripte und Funktionen werden dazu verwendet, gr¨ oßere Anweisungsabschnitte wiederverwendbar zu machen. Sie erlauben auch eine bessere Behandlung von Programmierfehlern. Der wesentliche Unterschied zwischen Skripten und Funktionen liegt in der Verwendung von Variablen. Eine Funktion arbeitet mit lokalen Variablen, die mit Ausnahme der zur¨ uckgelieferten Variablen bei Beendigung der Funktion gel¨ oscht werden. Ferner kennt die Funktion nur solche Variablen, die innerhalb der Funktion definiert wurden. Im Gegensatz dazu arbeitet ein Skript mit globalen Variablen; also alle Variablen, die vor dem Aufruf des Skripts definiert waren, k¨ onnen im Skript benutzt und ver¨ andert werden und alle Variablen, die w¨ ahrend des Skripts bekannt sind, stehen ¨ auch nach Beendigung des Skripts noch zur Verf¨ ugung. Dies beinhaltet auch das Uberschreiben von Variablen, die vielleicht nochmals verwendet werden sollten. Daher ist das Programmieren von Funktionen sehr zu empfehlen.
3.2
Editor
Falls der Editor nicht ge¨ offnet ist, kann man den Editor u offnen ( File→New→ ¨ber das File-Menu ¨ ” M-file“ oder File→open“) oder durch den Befehl ” >> edit >> bzw. durch >> edit Name >>
aufrufen. Letzteres bewirkt, dass der Editor mit dem File Name“ geladen wird. Hierbei ist darauf ” zu achten, dass der Name mit .m“ endet. Diese Endung zeigt Matlab an, dass es sich um ein in ” Matlab ausf¨ uhrbares Programm (= Skript oder Funktion) handelt. Alternativ kann auch ein externer Editor verwendet werden, z.B. vi, pico und emacs unter Unix und Linux oder notepad unter Windows.
3.3
Ein erstes Skript
Wir geben nun Folgendes im Editor ein
18
KAPITEL 3. SKRIPTE, FUNKTIONEN UND DEBUGGING 1 2 3 4 5 6
19
display(0 Ein erstes Skript0 ); clear who A = [1, 2, 3; 4, 5, 6] who
und speichern dieses Skript als Skript1.m ab, indem wir im Editor den Men¨ upunkt File→Save as“ ” verwenden. Anschließend geben wir im Command-Fenster >> A = [7] >> B = 1 >> Skript1 >> A >> B >>
ein. W¨ ahrend das Skript als Skript1.m gespeichert wurde, erfolgt der Aufruf nur als Skript1“ ” urde der Aufruf als Hans Wurst“ erfolgen). (h¨ atten wir das Skript als Hans Wurst.m gespeichert, w¨ ” Dies gilt ebenso f¨ ur Funktionen die in M-Files gespeichert werden (auch ein Skript ist ein M-File). Es ist eine gute Sitte, in der ersten Zeile eines Skriptes bzw. einer Funktion mittels pr¨ aziser Schlagw¨ orter anzugeben, was die Funktion bzw. das Skript bewirkt. Die erste Zeile wird deshalb auch als H1-Zeile bezeichnet und dient als Suchindex f¨ ur die Funktion lookfor“. Des Weiteren ” ist es Brauch, in den darauffolgenden Zeilen die Funktionsweise bzw. Verwendung und Syntax der Funktion bzw. des Skripts zu erl¨ autern. Diese Art von Kommentaren kann man sich sp¨ ater mit dem help“-Befehl anschauen. ¨” Andern wir unser bisheriges Skript zu 1 % Skript-file: Definition einer Matrix 2 % Dieses File dient zur Illustration des Aufbaus eines Skripts 3 % und definiert eine kleine Beispielmatrix mit dem Namen A 4 A=[1,2,3;4,5,6]; 5 Wir speichern den Inhalt des Editors als Skript2.m und geben anschließend im Command-Fenster folgende Anweisungen ein >> clear >> A >> Skript2 >> A >> lookfor Matrix >> help Skript2 >> type Skript2 >>
3.4
Skript fu ¨ r Einsendeaufgaben
¨ F¨ ur Ihre Einsendeaufgaben, computerbasierte Ubungsaufgaben, benutzen Sie bitte ein Skriptfile folgenden Formats 1 % Skript-file: Einsendeaufgaben
KAPITEL 3. SKRIPTE, FUNKTIONEN UND DEBUGGING 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
20
% weitere Kommentare nach Belieben clear Nachname = 0 M¨ uller0 ; 0 Vorname = Liesel0 ; Veranstaltung = 0 Vorsemesterkurs Matlab0 ; Blatt=1; %%%%%%%%%%%% % Nachfolgende Zeilen bitte nicht ver¨andern file=sprintf(0 %s %s %d0 ,Nachname,Vorname,Blatt); delete(file); diary(file); fprintf(0 Name: %s, %s\n0 ,Nachname,Vorname); fprintf(0 %s %d\n0 ,Veranstaltung,Blatt); echo on; %%%%%%%%%%%% % Aufgabe 1 % Ersetzen Sie diesen Kommentar durch Ihre Anweisungen %%%%%%%%%%%% % Aufgabe 2 % Ersetzen Sie diesen Kommentar durch Ihre Anweisungen % ... %%%%%%%%%%%% % Nachfolgende Zeilen bitte nicht ver¨andern echo off diary off
Dabei ersetzen Sie Nachname und Vorname sowie die Nummer des Aufgabenblatts entsprechend. Ferner geben Sie Ihre Anweisungen an den entsprechenden Stellen ein. Wenn Sie das Programuhren dann im mieren beenden wollen, speichern Sie das File zum Beispiel als tutorial 1.m und f¨ Command-Fenster >> tutorial 1 >> aus. Falls Sie nicht zufrieden sind mit Ihren L¨ osungen, so k¨ onnen Sie im Editor am Skript tutori¨ vornehmen und anschließend das Skript nochmals ausf¨ uhren. al 1.m entsprechende Anderungen Das Skript erzeugt eine Datei N achnameV orname BlattN r welche dann einzusenden ist.
3.5
Eine erste Funktion
Als eine erste Funktion werden wir eine Sinusschwingung zeichnen und die zugeh¨ origen Funktionswerte zur¨ uckgeben. 1 % Function-file: plotsin: plot sin function 2 % 3 % plotsin(N) berechnet die Funktionswerte einer Sinusschwingung und 4 % gibt den zugeh¨origen Graphen aus. Dabei ist N+1 die Anzahl
KAPITEL 3. SKRIPTE, FUNKTIONEN UND DEBUGGING 5 6 7 8 9 10 11 12
21
% der ¨aquidistanten St¨ utzstellen, die verwendet werden sollen. % Y=plotsin(N) gibt die Funktionswerte zur¨ uck. % [Y,X]=plotsin(N) gibt die St¨ utzstellen X und die Funktionswerte Y zur¨ uck. function [y,x]=plotsin(n); x = [0 : 2 ∗ pi/n : 2 ∗ pi]; y=sin(x); plot(x,y);
Speichern wir den Inhalt des Editors als plotsin.m, so k¨ onnen wir uns wieder die gesamte Funktion oder den Kommentar zur Syntax anschauen. Nachfolgend einige Erl¨ auterungen zu obiger Funktion Notation Großschreibung von Variablen- und Funktionennamen: Zur besseren Unterscheidung von gew¨ ohnlichem Text und Bezeichnern schreibt man oft in diesen Kommentaren alle Variablen und Funktionennamen groß. Bei den Variablen ist diese Konvention unproblematisch, aber bei Funktionennamen ist dies ung¨ unstig. function Funktionsdeklaration: Der Begriff function“ in Zeile 8 definiert das File plotsin.m als ” Funktionfile in Unterscheidung zu einem Skriptfile. Die Syntax einer Funktionserkl¨ arung besteht aus dem Wort function gefolgt von den R¨ uckgabewerten“, die mittels des Gleichheits” zeichen, =, vom Funktionsnamen und der Liste der Eingangswerte“ getrennt ist. Wird mehr ” als ein R¨ uckgabewert“ definiert, so m¨ ussen diese von eckigen Klammern, [ ] , eingeschlossen ” werden. Die Wahl des Funktionsnamens kann nahezu willk¨ urlich sein, es empfiehlt sich aber, ihn mit dem Namen des Files u bereinstimmen zu lassen. F¨ u r Matlab ist der Name des Files ¨ entscheidend! Die Liste der Eingangswerte“ besteht aus Variablennamen, die durch Kom” mata getrennt werden. Diese Auflistung wird von einem Paar runder Klammern umgeben. function R¨ uckgabewerte = Funktionsname (Eingangswerte) Parameter Eingabe- und R¨ uckgabewerte: Die Namen der Eingabewerte k¨ onnen beliebig gew¨ ahlt werden, wobei eine geschickte Verwendung von kurzen aber bezeichnenden Namen empfohlen wird. F¨ ur den Benutzer der Funktion sind nicht die Namen der Variablen wichtig, sondern nur ihre Reihenfolge, ihre Anzahl sowie die Bedeutung der Variablen. ¨ variable Parameter Matlab erlaubt eine Ubergabe von verschieden vielen Eingabe- bzw. R¨ uckgabewerten. Dazu muss das letzte Element in der Eingabeliste varargin bzw. das letzte Element in der R¨ uckgabe varargout heißen. Falls dem so ist, existieren die zus¨ atzlichen Variablen nargin und nargout, die die Anzahl der vom Benutzer tats¨ achlich u ¨bergebenen bzw. u ¨bernommenen Variablen als Wert haben. Viele der Matlab eigenen Routinen benutzen diese Form, um f¨ ur verschiedene Situationen nur eine Schnittstelle definieren zu m¨ ussen. plot Zeichnen: plot ist der einfachste und vielleicht auch am h¨ aufigsten benutzte Befehl, um Daten zu illustrieren. Sp¨ ater in Kapitel 7 werden wir mehr zu dieser und anderen graphischen Matlab-Routinen lernen.
3.6
Einzeilige-Funktionen
Um einfache arithmetische Funktionen mittels Matlab-Notation zu definieren, kann man entweder diese Funktion als ein M-File definieren oder mit dem @“-Befehl deklarieren. ” >> q=@(x)x. b2-3 >> q(3) >> x=[-3:0.1:3];
KAPITEL 3. SKRIPTE, FUNKTIONEN UND DEBUGGING >> >> >> >> >> >> >> >>
22
y=q(x); fzero(q,3) q(fzero(q,3)) plot(x,y); hold on plot(a,0,’r*’); hold off
@ Funktionsdeklaration: Der Befehl @(Parameterliste)Formel“ erlaubt eine einfache Deklaration ” von einfachen Funktionen. Dies ist speziell interessant, wenn f¨ ur einmalige Anwendungen eine Funktion definiert werden muss, die durch einen einfachen Matlab-Ausdruck darstellbar ist. inline Funktionsdeklaration: Die Idee ist ¨ ahnlich dem @“-Befehl, hier wird die Funktion als Zei” chenkette (siehe Kaptiel 5) u ¨bergeben. fzero Nullstellensuche: fzero(Funktion,Startwert)“ findet, sofern vorhanden, eine Nullstelle der ” Funktion in der N¨ ahe des Startwertes. hold Einfrieren der Graphik: Mit hold on“ friert man die Graphik ein und mit hold off“ wird ” ” das Einfrieren aufgehoben. Das Einfrieren dient dazu mehrere Funktionen in ein Koordinatensystem zu zeichnen. Beachte: Die @“-Anweisung und der inline“-Befehl werden in ¨ alteren Matlab-Versionen nur ” ” teilweise unterst¨ utzt. Speziell ¨ altere Matlab-Versionen kombiniert mit ¨ alteren Windows-Varianten haben diese Funktionen gar nicht. In diesem Falle muß man sich eine Datei q.m anlegen mit 1 function y=q(x) 2 y = x. b2 − 3; 3
3.7
Unterfunktionen und Funktionen als Parameter
In einem M-File, das als Funktion definiert ist, k¨ onnen weitere Funktionen erkl¨ art werden, aber diese sind nur lokal verf¨ ugbar, außerhalb dieses M-Files sind sie nicht definiert. Man betrachte nachfolgendes Beispiel. In Matlab k¨ onnen wir auch Funktionen als Eingangswerte verwenden. Dies ist besonders n¨ utzlich um z.B. mathematische Routinen f¨ ur beliebige Funktionen zu definieren. 1 % [X,Y] = approx min(F,A,B) 2 % zeichnet die Funktion F im Intervall [A,B] und 3 % approximiert die Minimalstelle von F in diesem Intervall. 4 % 5 function [x,y] = approx min(fkt,a,b) 6 X = [a:(b-a)/100:b]; 7 Y = feval(fkt,X); 8 [y,ind] = min(Y); 9 x = X(ind); 10 present result(X,Y,x,y); 11 return 12 13 %%%
KAPITEL 3. SKRIPTE, FUNKTIONEN UND DEBUGGING 14 15 16 17 18
23
function []=present result(X,Y,x,z); plot(X,Y,0 −0 ); hold on; plot(x,z,0 ∗g 0 );
(Das letzte Argument in plot 0 ∗ g 0 zwingt Matlab zur Verwendung von gr¨ unen Sternen, um die Datenpunkte zu makieren.) Wir speichern beide Funktionen im M-File Amin.m und geben im Kommandofenster z.B. >> Amin(q,-2,pi) >>
ein, wobei q“ die in Abschnitt 3.6 definierte Funktion q(x) = x2 − 3 ist. Achtung: x2 sollte als ” x. b2 eingegeben werden!
3.8
Fehlersuche
H¨ aufig verursachen kleine Tippfehler bereits sehr ¨ argerliche Resultate und erheblichen Suchaufwand, um den Fehler zu beheben. W¨ ahrend bei syntaktischen Fehlern Matlab schnell reklamiert, dass etwas nicht so funktioniert wie man es eingetippt hat, sieht es bei logischen Fehlern leider h¨ aufig anders aus. Um die Fehlersuche zu vereinfachen, gibt es den Matlab-Debugger, der vom Editor und dem Kommandofenster aus gesteuert werden kann. Der Debugger ist ein Tool, das eine schrittweise Ausf¨ uhrung von Befehlen erlaubt, um so die Ver¨ anderung von einzelnen Variablen verfolgen zu k¨ onnen. H¨ alt der Debugger inne, so ist die Ausf¨ uhrung eines Skriptes oder eines Programmes unterbrochen, und dem Benutzer steht das Command-Fenster zur Verf¨ ugung, um die aktuellen Werte der Variablen analysieren zu k¨ onnen. H¨ aufig m¨ ochte man nicht alle Schritte einzeln ausf¨ uhren, aber alle bis zu einem gewissen Punkt. Dies wird in Matlab durch das Setzen von Stopppunkten erm¨ oglicht. Die Funktionen des Debuggers sind im Editor-Fenster im Men¨ u unter Debug zu finden. Das Setzen eines Stopppunktes erfolgt im Editor durch das Klicken auf die Zeilennummer am linken Rand. Ein Stopppunkt, symbolisiert durch einen roten Punkt am Anfang einer Zeile, bedeutet, dass Matlab alle Aufgaben bis zu diesem Stopppunkt bearbeitet und vor der Ausf¨ uhrung der markierten Zeile inneh¨ alt. Von nun an kann man jede Zeile f¨ ur sich oder alle bis zum n¨ achsten Stopppunkt ausf¨ uhren. Dazu benutzt man wiederum das Men¨ u Debug bzw. die entsprechenden Funktionstasten. Verwenden wir obiges Beispiel und schauen uns die Werte von X und Y n¨ aher an. Dazu setzen wir einen Stopppunkt in Zeile 8 und rufen nun im Kommandofenster Amin(q,-2,pi)“ auf. ”
3.9
Aufgaben
Aufgabe 3.1 Schreiben Sie ein Skript, das den hyperbolischen Cosinus und den gew¨ohnlichen Tangens im Intervall [−π/4, 0.1π] graphisch darstellt. (Der Befehl hold on“ ist hier hilfreich.) ”
Aufgabe 3.2 Setzen Sie einen Stopppunkt in Ihrem Skript und kontrollieren Sie die Werte nach jedem Rechenschritt. Aufgabe 3.3 L¨oschen Sie alle vom Benutzer definierten Variablen mittels clear“. Wozu dient ” der cd-Befehl? Schreiben sie ein kleines Skript zum Beispiel fprintf(’Hello world’)“ und speichern ” Sie dieses als cd.m. Was passiert nun wenn sie cd“ aufrufen? Nun definieren Sie die Variable ” cd = 1, was erhalten Sie jetzt beim Aufruf von cd“? Geben Sie nun clear cd“ und !rm cd.m“ ” ” ” ein. [Falls Sie Matlab unter Windows verwenden geben !del cd.m“ ein.] Was passiert jetzt beim ” Aufruf von cd“? ”
Kapitel 4
Schleifen und Verzweigungen 4.1
Verzweigungen
Matlab kennt zwei Arten von Verzweigungen, die if“-Verzweigung und die switch“-Verzweigung. ” ”
4.1.1
if-Verzweigung 1 2 3 4 5 6 7 8
if (a > 1) fprintf(0 a ist gr¨oßer als 10 ); elseif (a > −3 & a < −1) fprintf(0 a ist zwischen -3 und -10 ); else fprintf(0 a liegt irgendwo0 ); end
Der if“ Befehl wird gefolgt von einer Bedingung und, falls diese noch ausgewertet werden ” muss, sollte die Bedingung in einer runden Klammer stehen. Zwischen dem if“-Befehl und dem ” abschließenden end“-Befehl k¨ onnen beliebig viele Anweisungen und beliebig viele elseif“-Befehle ” ” stehen. Alle Verzweigungen sind auch wieder eine Anweisung, man kann also Verzweigungen auch verschachteln. 1 if (a > 1) fprintf(’a ist gr¨oßer als 1’); 2 3 else if (a > −3 & a < −1) fprintf(’a ist zwischen -3 und 1); 4 else 5 fprintf(’a liegt irgendwo’); 6 end 7 8 end 9
Wir haben in den letzten beiden Beispielen mit Bedacht Einr¨ uckungen vorgenommen, um die Programm-Struktur deutlich zu machen. W¨ ahrend die beiden Beispiele logisch identisch sind, so ist der Code jedoch unterschiedlich! Eine Kondition ist ein boolscher Ausdruck, entweder ist er wahr oder falsch. Dabei werden Zahlwerte ungleich 0 als wahr und der Wert 0 als falsch interpretiert. Folgende boolsche Funktionen/Operationen stehen zur Verf¨ ugung. 24
25
KAPITEL 4. SCHLEIFEN UND VERZWEIGUNGEN ∼a a&b a|b and(a, b) xor(a, b)
nicht a a und b a oder b a und b a und nicht b oder b und nicht a
Zus¨ atzlich gibt es die Operatoren a&&b“ und a||b“. Von der logischen Bedeutung sind a&b“ und ” ” ” a&&b“ sowie a|b“ und a||b“ identisch. W¨ ahrend bei a&b“ und a|b“ die Ausdr¨ ucke a und b in jedem ” ” ” ” ” Fall ausgewertet werden, so geschieht dies bei a&&b“ und a||b“ nur dann, falls durch a das Ergebnis ” ” nicht bereits feststeht.
Zum besseren Verst¨ andnis betrachte man nachfolgende Wahrheitstafeln >> A=[0;0;1;1]; >> B=[0;1;0;1]; >> [A,B,A&B] >> [A,B,A|B] >> [A,B,A| ∼B] >> [A,B,xor(A,B)] >> Als Vergleichsoperationen stehen > >= ==
gr¨ oßer gr¨ oßer gleich gleich
< > >> >> >> >> >> >>
26
A=[1:2:10,1:3:10,1:4:10] find(A < 6) B=[1:10] 0 *[1:5] k=find(B < 6) [i,j] = find(B < 6) ind2sub(size(B),k)
Schleifen
Auch hier gibt es zwei Varianten, die for“- und die while“-Schleife. ” ”
4.2.1
Die f or-Schleife
Dieser Schleifentyp eignet sich, wenn eine bestimmte Anzahl an Schleifen-Durchl¨ aufen ben¨ otigt wird. 1 for i=2:10 b(i) = i; 2 3 end; 4 c=[1:10] 0 ; 5
Die Vektoren b und c haben in den Komponenten 2 bis 10 die gleichen Eintr¨ age. Nachfolgend noch eine allgemeinere Verwendung der f or-Schleife. 1 start = -3; 2 inkrement = 1.5; 3 stop=2*pi; 4 for i = start : inkrement : stop fprintf(0 i hat jetzt den Wert i = %f \n0 ,i); 5 6 end; 7
4.2.2
Die while-Schleife
Hier benutzen wir wieder eine boolsche Bedingung und f¨ uhren die Schleife solange aus, bis diese Bedingung nicht mehr erf¨ ullt ist. 1 i = 1; 2 while (i20*pi) break; end; end;
break sofortiger Abbruch einer Schleife: Dieser Schleife, d.h. der Rest des Schleifenrumpfes noch einmal ausgef¨ uhrt. Sind zwei Schleifen bricht der Befehl nur die innere Schleife ab, zur Ausf¨ uhrung kommt.
Befehl f¨ uhrt zur sofortigen Beendigung einer wie auch die Abbruchbedingung werden nicht verschachtelt (eine ¨ außere und eine innere), so sofern der break-Befehl in der inneren Schleife
continue Sprung zum Schleifenbeginn: Der verbleibende Schleifenrumpf wird f¨ ur diesen Durchgang durch die Schleife ignoriert und die Schleife f¨ ahrt mit dem Inkrementieren der Laufvariablen bzw. mit dem Testen der Abbruchbedingung bei einer while Schleife fort. Zuweilen bemerkt man etwaige Eingabefehler oder Programmierfehler zu sp¨ at oder hat versehentlich eine Endlosschleife gestartet. Dann ist die Tastenkombination [Control] + [C] und etwas Geduld hilfreich.
Noch ein weiteres Beispiel (hier wird eine obere Dreiecksmatrix definiert): 1 j=1; 2 while (j > A=[3,4] >> A = 0 hello world 0 >> B = [ 0 hello 0 ,0 world 0 ] >> B(1) >> B(2) >> B(1:5) >>
Durch die Zuweisung A= 0 hello world 0“ wird die vorhergehende Belegung der Variablen A ” gel¨ oscht. Der fr¨ uhere Datentyp matrix geht dabei ebenso verloren wie der Inhalt von A. Matlab erlaubt ein einfaches Zusammensetzen von Werten des Typs string, dabei wird kein weiteres Zeichen eingef¨ ugt. Man kann also sp¨ ater weder auf 0 hello 0“ noch auf 0 world 0“ getrennt zugreifen, ” ” es sei denn, man kennt die Position in der zusammengesetzten Zeichenkette. >> C = 0 345 0 >> C(1) >> C(2) >> C(1)*C(3) >> Man erkennt an der Ausgabe der Daten nicht zweifelsfrei, ob C eine Zeichenkette oder eine Zahl ist. Das Einr¨ ucken am Anfang der Zeile ist nicht wirklich signifikant. Mit dem Befehl ischar(C)“ ” k¨ onnen wir uns aber Sicherheit verschaffen. Falls ischar(C)“ den Wert 1 zur¨ uckliefert, ist C ” eine Zeichenkette, andernfalls nicht. W¨ ahrend die Aufrufe C(1) und C(3) die einzelnen Zeichen ausgeben, wird durch die Verwendung eines Rechenzeichens eine Typkonvertierung erzwungen, denn 28
KAPITEL 5. WEITERE DATENTYPEN
29
mit Zeichenketten kann man nicht rechnen! Also werden die Zeichen in den Datentyp Zahl/Matrix umgewandelt. Bei der Typkonvertierung wird der ASCII-Wert des Zeichens genommen und als Zahl interpretiert. Bei der Zuweisung >> D = [ 0 hello 0 ,59,45,41] >>
wird aus der Zahl 41 ein Zeichen gemacht, die Konvertierung erfolgt erneut mittels der ASCIIWerte. Mit den Befehlen char“ und double“ k¨ onnen die Typkonvertierungen zwischen Zeichen” ” ketten und Zahlen explizit vorgenommen werden. Eine explizite Konvertierung ist einer impliziten Konvertierung vorzuziehen.
5.2
Struktur (struct)
Variablen des Datentyps struct werden bei einigen Matlab-Routinen als Eingabewerte zur Spezifikation von Optionen verwendet. Der Datentyp erlaubt einer Variablen beliebig viele Komponenten zu haben, die jeweils u ugen. Dabei ist der Datentyp des ¨ber einen Namen und einen Wert verf¨ Wertes beliebig und die Komponenten k¨ onnen beliebige Namen haben. >> A.typ = 0 matrix 0 ; >> A.size=[3,2]; >> A.content=[1,2;3,4;5,6]; >> A >> A.typ >> A.content >> B=struct( 0 typ 0 ,0 matrix 0 ,0 size 0 , [3, 2],0 content 0 ,[1,2;3,4;5,6]); >> C=[struct( 0 typ 0 ,0 matrix 0 ,0 size 0 , [3, 2],0 content 0 ,[1,2;3,4;5,6]);... struct( 0 typ 0 ,0 matrix 0 ,0 size 0 ,[1,1],0 content 0 ,0)]; >> C(2).content >> C(1).typ >> C >> Zum Arbeiten mit Strukturen stehen die folgenden Routinen zur Verf¨ ugung:
struct(. . . ) Anlegen einer Struktur: Am besten schaut man sich obiges Beispiel und die Erkl¨ arung unter help struct“ an. ” 0 isfield(S, name 0 ) Existenztest f¨ ur Strukturkomponente: Testet ob name der Name einer Komponente der Struktur S ist. S=getfield(S,0 name0 ) Wertabruf: ist eine ¨ aquivalente Form zu S.name“. ” 0 0 S=setfield(S, name ,wert) Wertzuweisung: ist eine ¨ aquivalente Form zu S.name=wert“. ” 0 0 0 S=rmfield(S, name ) Komponenten l¨oschen: L¨ oscht die Komponente name0 aus der Struktur S, sofern diese dort vorhanden ist. fieldnames(S) Auflistung aller Komponentennamen: Gibt die Namen aller Komponenten von S aus. Das Ergebnis ist vom Typ Block, siehe Abschnitt 5.3, mit Inhalten vom Typ Zeichenkette.
KAPITEL 5. WEITERE DATENTYPEN
5.3
30
Der Datentyp Block (cell)
Bl¨ ocke sind beliebig-dimensionale Gebilde, die Variablen beliebigen Datentyps als Elemente besitzen. Im Nachfolgenden beschr¨ anken wir uns auf ein- und zwei-dimensionale Bl¨ ocke. Dieser Datentyp erlaubt auch Mengenoperationen. Starten wir zuerst mit einigen Beispielen f¨ ur den Datentyp Block. >> A = {1, [2, 3], 4, [5, 6; 7, 8],0 hello0 } >> A{2} >> A{5} >> A(5) >> A{4}(2, 1) >> B = {1, [2, 3]; 4,0 hello0 } >>
{. . .} Bl¨ocke, cells: Die geschweiften Klammern definieren einen Block. Das Format von Bl¨ ocken wird wie bei Matrizen automatisch von Matlab festgestellt, dabei werden zwei Eintr¨ age innerhalb einer Zeile durch Kommata bzw. Leerzeichen getrennt und zwei Zeilen durch ein Semikolon. Wiederum ist bei der Eingabe darauf zu achten, dass alle Zeilen die gleiche Anzahl an Spalten (Komponenten) haben.
Allerdings k¨ onnen mittels der geschweiften Klammern maximal zweidimensionale Bl¨ ocke definiert werden. Um h¨ oher-dimensionale Bl¨ ocke zu definieren, muss man den Befehl cell“ verwenden. ” cell(. . . ) Anlegen eines Blocks: cell([3,4,2])“ definiert einen dreidimensionalen Block. ” A{. . .} Inhalt eines Blocks: Matlab unterscheidet zwischen dem Inhalt eines Blocks und dem Block selbst. Der Aufruf A{. . .}“ gibt den Inhalt der Zelle aus. Ist der Inhalt eine Ma” trix, Struktur oder Zeichenkette, so kann mit A{. . .}(. . .)“ bzw. mit A{. . .}.name“ auf die ” ” einzelnen Elemente zugegriffen werden. A(. . .) Einzelne Bl¨ocke: Der Zugriff auf einen einzelnen Block oder mehrere Bl¨ ocke erfolgt wie beim Zugriff auf ein einzelnes Element bzw. mehrere Elemente einer Matrix, allerdings liefert dies nicht den Inhalt des Blocks, sondern den Block als solchen. Einige weitere Beispiele f¨ ur den Umgang mit dem Datentyp Block: >> A = [1, 2; 3, 4]; >> B = {A, A b2, A b3, A b4} >> C = {0 hello0 ,0 world0 ,0 was sollen wir da noch sagen 0 } >> D = {A, B; {}, C} >> D(3) >> D{3} >> D(2) >> D{2} >> D{2}{2} >>
5.4
Mengen
Der Datentyp Block kann auch zur Darstellung von Mengen benutzt werden. Dazu m¨ ussen alle Blockeintr¨ age vom Typ Zeichenkette (string) sein. So kann mit unique aus einem Block eine Menge erzeugt werden (Mehrfachnennungen werden gestrichen und die Eintr¨ age sortiert). Seien A und B zwei Mengen, so ist
31
KAPITEL 5. WEITERE DATENTYPEN Mathematischer Ausdruck A∪B A∩B A\B (A ∪ B)\(A ∩ B)
Matlab Befehl union(A, B) intersect(A, B) setdif f (A, B) setxor(A, B)
Zus¨ atzlich gibt es den Befehl ismember(a,A), der den Wert 1, falls a ∈ A ist, und sonst den Wert 0 zur¨ uckgibt. >> A = {0 10 ,0 20 ,0 30 ,0 40 ,0 50 ,0 a0 ,0 b0 ,0 c0 ,0 d0 } >> B = {0 10 ,0 A0 ,0 20 ,0 40 ,0 40 ,0 40 ,0 50 } >> B = unique(B) >> B = union(B,0 70 ) >> D = union(intersect(A, B), {0 90 ,0 70 ,0 A0 ,0 B 0 }) 0 0 >> if ismember( 3 ,D) 0 fprintf( We have lost\n0 ); end >>
(F¨ur kompliziertere algebraische Rechnungen kann teilweise noch Maple verwendet werden. F¨ur streng symbolisches Rechnen ist die Verwendung von Gap oder Axiom sinnvoller.)
5.5
Arbeiten mit Zeichenketten
Es gibt eine Reihe von Funktionen, die zum Arbeiten mit Zeichenketten in Matlab zur Verf¨ ugung ¨ stehen. Mittels help strfun“ kann man einen guten Uberblick u ¨ber diese Funktionen erhalten. Im ” Nachfolgenden werden einige vorgestellt. Um interaktive Matlab-Routinen zu schreiben, sind die Funktionen input“ und fprintf“ n¨ utzlich. ” ” 1 Wert = input(0 Geben Sie eine Zahl ein \n0 ); 2 fprintf(0 Sie haben den Wert %d eingegeben. \n\t Danke \n0 ,Wert); 3 input Eingabeaufforderung: Die Funktion gibt den u ¨bergebenen Text aus und wartet auf die Eingabe einer Variablen beliebigen Typs. Das Bet¨ atigen der [Return]-Taste entspricht wiederum dem Eingabeende. Eine leere Eingabe wird als 0 × 0 Matrix interpretiert. fprintf formatierte Ausgabe: Im Wesentlichen identisch zu der gleichnamigen C-Funktion. Die Syntax lautet entweder fprintf(Formatstring,Parameter) oder fprintf(File,Formatstring,Parameter). Im ersten Fall wird die Ausgabe auf dem Bildschirm (stdout) erfolgen, im zweiten Fall wird der Text in eine Datei geschrieben, die zuvor mit fopen“ zum Schreiben ge¨ offnet wurde. Der ” Formatstring besteht aus beliebigem Text, gespickt mit Formatanweisungen \t \n
Tabulator Zeilenumbruch
und Platzhaltern f¨ ur Variablen:
KAPITEL 5. WEITERE DATENTYPEN %d %f %e %s
32
ganze Zahl Gleitpunktzahl Gleitpunktzahl in exponentieller Schreibweise Zeichenkette
F¨ ur jeden Platzhalter sollte ein entsprechender Parameter angegeben werden, dabei muss die Reihenfolge der Parameter der Reihenfolge der Platzhalter entsprechen. Ferner kann die Darstellung einer Zahl noch detaillierter vorgegeben werden. >> fprintf(0 %f %e\n0 ,-pi,-pi); >> fprintf(0 %8.4f %8.4e\n0 ,-pi,-pi); >> fprintf(0 %2.1f %2.1e\n0 ,-pi,-pi); >> fprintf(0 %+2.1f %2.1E\n0 ,-pi,-pi); >>
sprintf Formatierte Zeichenkette: Der Befehl funktioniert wie fprintf“ nur mit dem Unterschied, ” dass keine Ausgabe der Zeichenkette erfolgt, sondern die Zeichenkette als R¨ uckgabewert zur Verf¨ ugung steht. Siehe Skript f¨ ur Einsendeaufgaben, Abschnitt 3.4. Weitere hilfreiche Funktionen zum Arbeiten mit Zeichenketten sind strcat strcmp strfind
verbinden von Zeichenketten vergleichen von Zeichenketten suchen von Zeichenketten
¨ Den vollst¨ andigen Uberblick gibts es mit help strfun“. ” 0 0 >> A = hello ; >> B = 0 world 0 ; 0 0 >> C = How ; 0 0 >> D = is ; >> E = 0 life 0 ; >> F = 0 fine 0 ; 0 0 >> greeting = strcat(A, ,B) >> question = strcat(C, 0 0 ,D, 0 0 ,E) >> u = strfind(question,0 0 ) >> if strcmp(D,question(u(1)+1,u(2)-1)) fprintf(0 %s %s %s\n0 ,E,D,F) end >>
5.6
Arbeiten mit Bl¨ ocken
Wir haben bereits gezeigt, wie man Bl¨ ocke anlegt und wie man auf einzelne Elemente und ihre Inhalte zugreift. Im Nachfolgenden einige weitere Befehle zum Arbeiten mit Bl¨ ocken. cell(. . .) erzeugt einen oder mehrere Bl¨ ocke. Formal gibt es keinen Grund weswegen die Befehle struct“ und cell“ nicht geschachtelt werden sollten, aber es k¨ onnen ungewollte Effekte ” ” auftreten. ¨ cellplot(B) erzeugt eine graphische Ubersicht u ¨ber das Format und die Inhalte einer Variablen B vom Typ Block.
33
KAPITEL 5. WEITERE DATENTYPEN
celldisplay(B) gibt den Inhalt aller Komponenten einer Variablen B vom Typ Block im CommandFenster aus. (Steht nicht in ¨ alteren Versionen zur Verf¨ ugung.) iscell(B) testet, ob B vom Typ Block ist; falls ja, wird der Wert 1, sonst der Wert 0 zur¨ uckgeliefert. iscellstr(B) testet, ob alle Inhalte der Elemente der Variablen B vom Typ Block den Typ Zeichenkette haben (dies muss der Fall sein, um die Mengenoperationen zu nutzen).
5.7
Aufgaben
Aufgabe 5.1 Geben Sie die Mengen A = {a, b, c}, B = {b, c, d} und C = {c, d} ein und erzeugen Sie die Mengen {a}, {} und {b, d} durch Mengenoperationen auf A, B und C. Aufgabe 5.2 Schreiben Sie eine Funktion Wetteransage(Wetter)“, welche die Wetterdaten be” arbeitet. Wetter sei dabei ein Block mit Eintr¨agen vom Typ Struktur. Jede Struktur hat die Komponenten Ort (Zeichenkette), Temperatur (Zahl) und Niederschlag (Zahl). Die Funktion soll f¨ ur jeden Ort die Temperatur und den Niederschlag ausgeben. Definieren Sie die Variable W etter mit den Daten Ort Koeln Duesseldorf Frankfurt Offenbach Mainz Hanau
Temperatur 20 19 25 17 21 21
und f¨ uhren Sie W etteransage(W etter) aus.
Niederschlag in ml 0 3 0 10 1 0
Kapitel 6
Speichern und Lesen von Datens¨ atzen Vorsicht: Es lassen sich sehr leicht riesige Datens¨ atze mit Matlab erzeugen. Diese Datens¨ atze unbedacht zu speichern, wird den Ihnen zur Verf¨ ugung stehenden Speicherplatz sehr schnell f¨ ullen!!
6.1
Speichern und Lesen von Matlab Daten
Zum Speichern aller Daten nutzt man den Befehl save“, dabei speichert ” >> save name >> alle Daten in der Datei name.mat“. Dagegen speichert ” >> save name a b C >>
nur die Variablen a“, b“ und C“. Man kann save“ auch in der Syntax ” ” ” ” 0 0 0 0 0 0 >> save(name, a , b , C ) >>
verwenden. Letzteres mag beim automatischen Bearbeiten von Datens¨ atzen mittels Skripten und Funktionen von Interesse sein, um mit variablen Filenamen zu operieren. Die Umkehrung von save“ ist load“. Mittels ” ” >> load name >>
wird der Datensatz der mit save name“ gespeichert wurde wieder geladen. Ein kleines Beispiel: ” > > A = zeros(3,4); >> A(:) = [1:12]; >> B= struct(0 was 0 ,0 unsortierte Daten 0 ,0 Inhalt 0 ,zeros(2,4)); 34
¨ KAPITEL 6. SPEICHERN UND LESEN VON DATENSATZEN >> >> >> >> >> >> >> >> >> >> >> >> >> >> >>
35
B(1).Inhalt = 0 hallo world 0 ; B(2,1).Inhalt = 0 was nun 0 ; B(1,3).Inhalt = A; B(6).Inhalt = 0 niemals nie 0 ; C.was = 0 unsortierte Daten 0 ; C.Inhalt = {0 hallo world 0 ,[ ],A,[ ]; 0 was nun 0 ,[ ], 0 niemals nie 0 ,[ ] }; save Datensatz1 save Datensatz2 B clear who load Datensat2 who load Datensatz1 who
(Obiges Beispiel verdeutlicht wieso die Befehle struct“ und cell“ nicht geschachtelt werden soll” ” ten.)
6.2 6.2.1
Exportieren und Importieren von ASCII Daten Schreiben von ASCII Daten
Mittels des Befehls save“ werden die Daten komprimiert gespeichert und sind somit fast nur von ” Matlab zu lesen. Falls man die Daten anschließend noch mit anderen Programmen weiterverarbeiten m¨ ochte, empfiehlt sich eine formatierte Ausgabe. Dazu ben¨ otigt man die folgenden Befehle ¨ fopen Offnen und Anlegen von Dateien: Der Befehl fopen(0 name0 ,0 action0 )“ ¨ offnet eine Datei mit ” dem Namen name zum Lesen, falls action = r oder zum Schreiben falls action = w+. F¨ ur weitergehende Informationen siehe wie immer unter help fopen“. ” fprintf Formatiertes Schreiben: Dieser Befehl wurde bereits in Abschnitt 5.5 besprochen. fclose Schließen und Speichern: Erst wenn die Datei geschlossen wurde, werden die Daten wirklich gespeichert! Bis zu diesem Zeitpunkt hat man nur in eine Tempor¨ ardatei geschrieben, erst der Befehl fclose“ speichert die Daten! ” Zum Beispiel kann die Matrix A wie folgt gespeichert werden >> fid=fopen(0 Datensatz3 0 ,0 w+0 ) >> fprintf(fid,0 %% Diese Datei enth¨alt homogene Daten,0 ); >> fprintf(fid,0 die auch mittels load gelsen werden k¨onnen\n0 ); >> for i = 1:3 for j = 1:4 fprintf(fid,0 %e 0 ,A(i,j)); end fprintf(fid,0 \n0 ); end >> fclose(fid); >>
¨ KAPITEL 6. SPEICHERN UND LESEN VON DATENSATZEN
6.2.2
36
Einlesen von der Tastatur
Hierzu existiert der input“-Befehl. Allerdings ist diese Variante unpraktisch bei gr¨ oßeren Daten” mengen und l¨ asst keine Automatisierung des Verfahrens zu. Wir speichern folgendes Beispiel in der Datei Bsp input.m 1 a = input(0 Geben Sie eine Zahl ein 0 ); 2 w = input(0 Geben Sie ein Wort ein 0 ); 3 for i = 1 : a fprintf(0 %s \n0 ,w); 4 5 end; 6
und f¨ uhren anschließend das Programm Bsp input aus. >> Bsp input Geben Sie eine Zahl ein 4 0 hallo0 Geben Sie ein Wort ein hallo hallo hallo hallo >>
6.2.3
Einlesen aus einer Datei
Wie bereits gesehen kann man mittels load“ die Daten, die man mit save“ gespeichert hat, wieder ” ” einlesen. Dar¨ uber hinuas kann man mit load“ auch Zahlenreihen, die in Matrixform gespeichert ” sind, einlesen. >> clear >> load Datensatz3 >> who 0 0 >> load( pores 1.mtx ) >> C=spconvert(pores 1) >> size(C) 30 30 >> full(C) >>
ugung und Die Datei pores 1.mtx steht auf der Homepage des Kurses unter Material zur Verf¨ stammt aus der Sammlung Matrix market1 . Prinzipiell muss man beim Einlesen von Daten wissen in welcher Form und welcher Struktur sie gespeichert sind. Mittels fopen“ und fscanf“ k¨ onnen beliebige Daten geladen werden, doch um ” ” diese entsprechend interpretieren zu k¨ onnen ben¨ otigt man weitere Kentnisse. Falls, wie im Falle von Datensatz3, die Daten im ASCII Format und wohl sortiert sind, ist das Einlesen unproblematisch. Zum formatierten Einlesen steht der Befehl fscanf“ zur Verf¨ ugung. Die Syntax ist ¨ ahnlich der ” des Befehls fprintf“, siehe Abschnitt 5.5. Zu beachten ist, dass fscanf“ die gesamte Datei einliest, ” ” falls nicht eine maximal einzulesende Anzahl an Zeichen spezifiziert ist. >> fid=fopen(0 Datensatz30 ,0 r0 ); >> A = str2num(scanf(fid,0 %c0 )); 1 http://math.nist.gov/MatrixMarket
¨ KAPITEL 6. SPEICHERN UND LESEN VON DATENSATZEN
6.3
37
>> fclose(fid); >> who >> A >> clear 0 0 0 0 >> fid=fopen( pores 1.mtx , r ); 0 0 >> text = fscanf(fid, %c ); >> fclose(fid); >> R = text; >> while (length(R)) [T,R] = strtok(R,0 %0 ); end >> t = str2num(T); >> A = spconvert(t(2:end,:)); >> full(A) >>
Importieren und Exportieren von Datenbanken
Dies ist ein h¨ aufig auftretendes Problem. Leider gibt es nur f¨ ur wenige Datenbanken eine gute Unterst¨ utzung und diese auch nur mittels diverser Zusatzpakete. Als Alternative kann man entsprechende Daten aus der Datenbank als ASCII-Werte exportieren, um diese anschließend mit Matlab einzulesen.
6.4
Ein ausfu ¨ hrliches Beispiel
Zur Dokumentation von Ergebnissen werden h¨ aufig Testdaten tabelliert in ein Textdokument eingef¨ ugt. Falls nun der Text in LATEX erstellt wird, ist das Einf¨ ugen von Tabellen etwas m¨ uhsam. Nachfolgend betrachten wir eine Funktion die automatisch eine einfache LATEX-Tabelle erzeugt. Gegeben sei der Datensatz
a b c
A 3 17 3
Titel B 4 -1 -4
C 7 5 2
Die dazugeh¨ orige LATEX-Tabelle hat die folgende Gestalt 1 \begin{tabular}{|l| ∗ {3}{c|}} \\ \hline 2 & \multicolumn{3}{c|}{Titel} \\ \hline 3 & A & B & C \\ \hline 4 a & 3 & 4 & 7 \\ 5 b & 17 & -1 & 5 \\ 6 c & 3 & -4 & 2 \\ \hline 7 \end{tabular} 8
Dabei stellt die Zahl 3 in den Zeilen 1 und 2 f¨ ur die Zahl der Datenspalten und muß f¨ ur Tabellen mit anderer Spaltenzahl dementsprechend angepasst werden. 1 function [ ] = latextab(fn,Daten)
¨ KAPITEL 6. SPEICHERN UND LESEN VON DATENSATZEN 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
6.5
38
fid = fopen(fn,0 w+0 ); if (fid> woerter.I = ich ; >> woerter.have = 0 habe0 ; >> woerter.finished = 0 fertig0 ; >>
Speichern Sie die Struktur woerter“ in einer Datei namens woerterbuch.mat. Nun schreiben Sie ” eine Funktion uebersetze(wort)“, die folgedes leistet: Als erstes soll die Funktion das Woerter” buch laden. Ist wort der Name eines Feldes der Struktur woerter, so wird der Inhalt des Feldes ausgegeben, sonst eine Fehlermeldung. Aufgabe 6.4 Schreiben Sie eine Funktion split“, die den in einer Datei enthaltenen Text einliest, ” in einzelne W¨orter zerlegt und diese in einer anderen Datei speichert, dh. pro Zeile ein Wort. Der Aufruf soll die Form >> split(Eingang,Trennzeichen,Ausgang) >>
haben. Dabei sind Eingang und Ausgang die Namen der jeweiligen Dateien, und T rennzeichen (Typ Block) enth¨alt die Zeichen und Zeichenketten, die als Trennzeichen zweier Teilst¨ ucke gelten. Die einzelnen Teilst¨ ucke werden als jeweils eine Zeile in die Datei Ausgang geschrieben. 2 Diese
Aufgabe stammt von Soeren Herbert.
¨ KAPITEL 6. SPEICHERN UND LESEN VON DATENSATZEN
39
Als Beispiel kann die Datei Teiltexte“ und die Trennzeichen {0 hallo0 ,0 wir0 ,0 f reuen0 , 10}“ ” ” genutzt werden. Aufgabe 6.5 Schreiben Sie eine Funktion namens ignore. A=ignore(Name)“ soll eine Datei ” Name ¨offnen und die Variable A vom Typ Struktur belegen. Die Datei darf Kommentarzeilen enthalten, dabei ist eine Kommentarzeile eine Zeile deren erstes Zeichen das Prozentzeichen ist, ”%”. Alle anderen Zeilen haben das Format Feldname Feldinhalt wobei der Feldinhalt immer aus einer Folge von Zahlen besteht. Wenden Sie die Funktion ignore auf die Datei ignorant an. (Hinweis: strcmp, str2num und strtok sind hier sehr hilfreich. Welchem Zahlwert entspricht der Zeilenumbruch auf Ihrem Rechner?)
Kapitel 7
Graphik 7.1
¨ Ubersicht
Die graphische Darstellung von Daten ist ein Grundpfeiler von Matlab. Da es sehr viele Graphikbefehle gibt, werden wir hier nur einige Befehle behandeln. Matlab kennt verschiedene Typen von Graphen, die mit einem entsprechenden Befehl erzeugt werden k¨ onnen. Viele dieser Befehle haben eine ¨ ahnliche Arbeitsweise, die wir nachfolgend am ¨ plot“-Befehl vorstellen werden. Zuerst ein (nicht vollst¨ andiger) Uberblick u ugung ¨ber die zur Verf¨ ” stehenden grundlegenden Graphikbefehle. Graph logarithmisch skalierter Graph Stabdiagramm Diagramm H¨ ohenlinien Oberfl¨ ache Sonstige
plot semilogy stem bar contour surf waterfall line scatter
plot3 semilogx stem3 stairs contourf surface fill scatter3
loglog pie contour3 surfc
pcolor mesh
fill3 plotmatrix
image spy
Ferner gibt es weitere Befehle zur Handhabung der Graphikfenster ¨ figure Offnen und Aktivieren eines Graphikfensters: Graphikfenster erhalten in Matlab eine Zahl statt einem Namen. Ferner gibt es keine Beschr¨ ankung der Anzahl der Graphikfenster, die ge¨ offnet werden k¨ onnen. Etwaige Beschr¨ ankungen kommen vom Betriebssystem. Falls das Fenster ’Figure No 3’ noch nicht existiert, wird es durch den Aufruf figure(3)“ als leeres ” Fenster erzeugt. Unabh¨ angig davon, ob das Fenster ’Figure No 3’ bereits existiert, wird es aktiviert, das heißt, alle nachfolgenden Graphikbefehle arbeiten in diesem Fenster. Je nach Betriebssystem kann man ein graphisches Fenster auch durch Anklicken mit der Maus aktivieren. print Druckersteuerung und Bildspeicherung: Dieser Befehl ist zum Speichern wie auch Ausdrucken von matlab-Graphiken gedacht. Je nach Betriebssystem und installiertem Drucker ¨ sind andere flags sinnvoll. Einen Uberblick gibt es in der Hilfe zum print-Befehl, also help ” print“. Auf UNIX und LINUX Computern sind die Formate eps und ps interessant, da Dateien vom Typ eps und ps via Postscriptdrucker ausgegeben und in LATEX Dokumente eingebunden werden k¨ onnen. Ferner ist das Datenformat jpeg interessant, um Bilder auf die eigene Homepage zu setzen. hold Einfrieren: Normalerweise wird mit jedem Zeichenaufruf, z.B. plot und stem, die alte Graphik gel¨ oscht und anschließend die neue gezeichnet. Mittels hold on“ kann das L¨ oschen bis zum ” n¨ achsten hold off“ oder bis zum n¨ achsten clf“-Befehl unterbunden werden. Somit friert der ” ” 40
KAPITEL 7. GRAPHIK
41
Befehl hold on“ alle Zeichnungen im aktiven Bild ein, das heißt, der neue Graph wird dem ” alten hinzugef¨ ugt. clf L¨oschen: L¨ oscht die ganze Graphik wie auch Parameter, z.B: Achsen und hold on-Status, aber nicht von Hand eingetragene Elemente, z.B: Linien oder Texte, die von Hand mittels der Men¨ usteuerung im Graphik Fenster eingetragen wurden. axis Bildausschnitt: Erm¨ oglicht einen Teilausschnitt der gesamten Graphik zu spezifizieren. Dabei wird die Achsen-Skalierung automatisch angepasst, aber nicht von normal auf logarithmisch umgestellt. legend Beschriftung: Falls mehrere Kurven in einer Zeichnung dargestellt werden, so ist es vorteilhaft, den sp¨ ateren Betrachter wissen zu lassen, was die Bedeutung der einzelnen Kurven ist. legend(string1,string2,. . . ,stringk,zahl)“ erzeugt eine Zeichenerkl¨ arung f¨ ur die ersten k ” Graphen, die im Fenster stehen. Der Aufruf von legend erfolgt normalerweise, nachdem alle Zeichnungen, die in das Bild sollen, bereits erzeugt wurden. Standardm¨ aßig wird diese Legende in der oberen rechten Ecke angebracht. Mit dem optionalen Parameter zahl kann die Legende auch in einer anderen Ecke angebracht werden. ¨ title Titel: Erzeugt eine Uberschrift. xlabel Achsenbeschriftung: Erzeugt eine Beschriftung der x-Achse und kann f¨ ur zwei- und dreidimensionale Darstellungen verwendet werden. ylabel Achsenbeschriftung: Erzeugt eine Beschriftung der y-Achse und kann f¨ ur zwei- und dreidimensionale Darstellungen verwendet werden. zlabel Achsenbeschriftung: Erzeugt eine Beschriftung der z-Achse in drei-dimensionalen Darstellungen. text Beschriftung: Erlaubt zus¨ atzliche Beschriftungen in der Zeichnung wie auch außerhalb. Vielleicht etwas unbequemer als das Zeichnen von Hand, aber daf¨ ur konsistent mit der internen Datenverarbeitung (siehe clf). colorbar Farbtafel: Stellt neben der Zeichnung eine Farbtafel mit Skalierung auf. Dies ist besonders von Interesse wenn, wie beim Zeichnen von H¨ ohenlinien, Zahlwerte durch Farbwerte identifiziert werden. ¨ colormap Farbskalierung: Erlaubt die Anderung der automatischen Farbeinteilung. colormenu Farbsteuerung: Stellt im Graphik-Fenster ein weiteres Men¨ u zur Einstellung von Farben zur Verf¨ ugung. ¨ shading Schattierung: Erm¨ oglicht eine Anderung der Darstellung von farbigen Graphiken. close Schließen des Graphikfensters: Der Aufruf close(figure(1));“ schließt das Graphikfenster ” Nr. 1, sofern dieses offen war.
42
KAPITEL 7. GRAPHIK
7.2
Der plot-Befehl
Wie bei den meisten Graphikbefehlen h¨ angt der Effekt des plot“-Befehls von der Anzahl der ” u ¨bergebenen Parameter und deren Format ab.
7.2.1
plot mit einem Argument
Der Aufruf von plot“ ¨ offnet ein eigenes Graphikfenster, sofern keines vorhanden ist. Existieren ein ” oder mehrere Graphikfenster, so verwendet plot“ das derzeit aktive Graphikfenster. Der Inhalt ” dieses Graphikfensters geht dabei verloren. Ein Beispiel: >> x = [1, 2, 3, 4; 5, 6, 7, 8; 9, 10, 11, 12] >> plot(x) >> plot(sin(x)) >>
Allgemein kann man plot(X)“ verwenden, wobei X eine Zahl, ein Vektor oder eine Matrix ist. Ist ” X eine n × k Matrix, so werden k Linien der Form i = 1, 2, . . . , n → Xi,j (j = 1, . . . , k) in einer Graphik dargestellt. Jeder dieser Graphen besteht aus geraden Verbindungsst¨ ucken zwischen zwei Werten. Falls X ein Vektor ist, so wird dieser immer wie eine n × 1 Matrix behandelt. Falls X eine Zahl ist, so ist der Ausdruck nur ein Punkt, den man nur schwer erkennen kann.
7.2.2
plot mit mehreren Argumenten
Hier gibt es gleich zwei Aufrufvarianten. >> x = [1, 2, 3, 4; 5, 6, 7, 8; 9, 10, 11, 12] >> plot(x, sin(x)) >> plot(x0 , sin(x0 )) >> plot(sin(x),0 r+0 ) >>
Die beiden ersten Aufrufe von plot“ haben das Format plot(X,Y)“, dabei sind X die x-Werte und ” ” Y die y-Werte des Graphen. Hierbei muss X die gleiche Anzahl an Zeilen und Spalten wie Y haben. Die einzelnen Linien sind wiederum durch die Spalten definiert und werden mit verschiedenen Farben dargestellt. Beim dritten Aufruf enth¨ alt die zweite Komponente die Anweisung, mit welcher Farbe und mit welchem Symbol bzw. mit welchem Linientyp der Graph kenntlich gemacht werden soll. Man kann plot“ auch mit mehr als 2 Argumenten aufrufen, siehe das Beispiel in Abschnitt 7.2.3. ” Es stehen die Farben blau gelb magenta
b y m
rot gr¨ un schwarz
r g k
zur Verf¨ ugung. Bei den Linientypen gibt es außer durchgezogene Linie gestrichelte Linie Sternchen an Datenpunkten Kreise an Datenpunkten
-* o
noch weitere M¨ oglichkeiten, siehe help plot“. ”
gepunktete Linie strichpunktierte Linie Punkte an Datenpunkten
: -. .
KAPITEL 7. GRAPHIK
7.2.3
43
Ein ausfu ¨hrliches Beispiel
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
% Skript: trigi.m : trigonometrische Funktionen clear; figure(1); clf x=[0:0.2:10]; plot(x,sin(x),0 r-0 ) hold on plot(x,cos(x),0 b-.0 ) plot(x,tan(x),0 k:0 ) y=[0.1:0.2:pi] 0 ; plot([y,y+pi,y+2*pi],cot(y)*[1,1,1],0 g-0 ) z=[3*pi+0.1:0.2:10] 0 ; plot(z,cot(z),0 g-0 ) axis([3,6,-20,20]); legend( 0 sin 0 ,0 cos 0 ,0 tan 0 ,0 cot 0 ) xlabel( 0 Dies ist die X-Achse 0 ) ylabel( 0 Dies ist die Werte-Achse 0 ) title( 0 Ein Beispiel 0 )
Die Funktionen tan und cot haben in obigen Intervall diverse Polstellen, die bei der oben gew¨ ahlten Skalierung noch zu erkennen sind. Gibt man nun den Befehl axis([0,10,-200,200])“ ein, so ver” schwinden die Polstellen in der graphischen Darstellung. Dies liegt daran, dass Matlab jeweils eine Folge von Punkten mit geraden Strichen verbindet. Falls nicht einer der Punkte die Polstelle trift, so sind alle Punkte von endlicher Gr¨ oße und die Punkte werden geradlining verbunden.
7.3
Fu ¨ r Fortgeschrittene
Falls mehrere Graphiken hintereinander gezeigt werden sollen, ist es sinnvoll, dem Betrachter ein wenig Zeit daf¨ ur zu geben. Dies kann mit dem Befehl pause“ bzw. pause(Sekunden)“ erreicht ” ” werden. Um eine Diashow, Slideshow oder einen Film zu erstellen, sind die nachfolgenden Befehle hilfreich. movie von Diashow bis Film: movie(Slides,Repeat,speed)“ zeigt eine Sequenz von Bildern, die mit ” getframe“ aufbereitet wurden. Dabei ist Slides ein Vektor mit Frames als Inhalt und speed die ” Anzahl der Frames pro Sekunde. Repeat ist normalerweise nur die Zahl der Wiederholungen, darf aber auch die Form [W dh, index1, . . . , indexK] haben, wobei index1,. . . ,indexK die Reihenfolge der in Slides gespeicherten Frames bestimmt. getframe Erzeugung eines Bildes: Die mittels getframe“ gespeicherten Bilder sind nicht nachtr¨ aglich ” manipulierbar und sind ausschließlich zum Gebrauch mit movie“ gedacht. ” view Setzen des Betrachtungswinkels: >> >> >> >>
x = [-10:0.1:10]; y = [-10:0.1:10]; z = sin(y 0 -1). b2*x. b2+y 0 . b2*cos(x-3). b2-sin(y 0 *x); surf(x,y,z);
44
KAPITEL 7. GRAPHIK
7.4
>> for i=0:50 view([cos(i/25),sin(i/20),0.3]); pause(0.3) end 0 0 >> fprintf( Konnten Sie die Minimalstelle erkennen? \n ); >>
Images
Ein weiteres Beispiel f¨ ur die M¨ oglichkeiten mit Matlab: >> load gatlin; image(X); colormap(map); axis off; >>
image Pixelgraphik: Nimmt eine Matrix und interpretiert den Zahlenwert als einen Farbwert und plaziert ihn an die entsprechende Koordinate. Die Zahlenwerte d¨ urfen reell sein. colormap Farbtafel: Mit colormap werden Farben definiert. Auch Graustufen sind Farben!
7.5
>> >> >> >> >> >> >>
clear; clf; X = rand(20); image(X*60); figure(2) image(floor(X*3)*20);
Aufgaben
Aufgabe 7.1 Gegeben sei der Datensatz A = [1, 4, 7, 1, 12];. Verwenden Sie diesen Datensatz, um mittels der Befehle stem“, bar“, stairs“ und pie“ Graphiken zu erzeugen. ” ” ” ” Aufgabe 7.2 Betrachten Sie die Oberfl¨ache von exp(cos(x))∗sin(y) mit x, y ∈ [0, 10]. Beschriften Sie die Graphik. Aufgabe 7.3 Betrachten Sie das Beispiel aus Abschnitt 7.3 und finden Sie alle Datenpunkte, an denen der Funktionswert kleiner als -0.5 ist und an denen der Funktionswert kleiner als -0.9 ist. Markieren Sie all diese Punkte in einem 2D-plot mit gr¨ un und rot. (Tipp: Man benutze die Funktion find, siehe Abschnitt 4.1.3.) Aufgabe 7.4 Bei einer Gremienwahl kam es zu folgenden Ergebnissen first try the winner is best result ever always second no chance one vote
244 2074 488 1586 110 1
F¨ ur diese Gremienwahl gilt eine 5% H¨ urde. Wieviel Prozent haben die einzelnen Parteien errungen? Stellen Sie das Ergebnis in dem daf¨ ur typischen S¨aulendiagramm dar. Wie sieht die Sitzverteilung des 72 Mitglieder umfassenden Gremiums aus? Stellen Sie das Ergebnis in den daf¨ ur typischen Kuchendiagramm dar. Beschriften Sie ihre Graphiken unter Verwendung des text“-Befehls. ”
Kapitel 8
Verfahren der numerischen linearen Algebra Die Verfahren der numerischen linearen Algebra und die Tools zur Erzeugung von Graphiken sind die beiden Eckpfeiler von Matlab. Da es so zahlreiche Verfahren der numerischen linearen Algebra gibt, werden hier nur einige exemplarisch aufgef¨ uhrt.
8.1 8.1.1
Gew¨ ohnliche Matrizen Erzeugen von Matrizen und Vektoren
In den bisherigen Kapiteln haben wir bereits einige Varianten zur Erzeugung von Matrizen kennengelernt. Hier sind einige spezielle Matrizen aufgef¨ uhrt. zeros
Nullmatrix
ones
Einsmatrix
eye
Einheitsmatrix
rand
gleichverteilte Zufallsmatrix
randn
normalverteilte Zufallsmatrix
diag
Diagonalmatrix
gallery
Sammlung von Matrizen
kron
Kronecker Produkt
compan
Companion Matrix
gallery“ bietet u ¨ber 40 verschiedene Sondermatrizen, wie z.B: Toeplitz- und Ris-Matrizen. Die ” zugeh¨ orige Hilfe kann mit dem Befehl private“ aktiviert werden. ”
8.1.2
Rechnen mit Matrizen
Zur Wiederholung nochmals die Rechenoperationen, die f¨ ur Matrizen zur Verf¨ ugung stehen, sowie einige weitere spezielle Funktionen, die nur f¨ ur Matrizen definiert sind. A+B
Addition
A-B
Subtraktion Transposition
A b2
Transposition und komplex konjungiert Potenz
0
A*B
Multiplikation
A.*B
elementweise Multiplikation
A/B
L¨ osen von XA = B
A\B
L¨ osen von AX = B
A./B
elementweise Division
expm(A)
Matrixexponentialfunktion
logm(A)
Matrixlogarithmus
A
0
A.
45
KAPITEL 8. VERFAHREN DER NUMERISCHEN LINEAREN ALGEBRA sqrtm(A)
inv(A)
Inverse zu A
norm
Quadratwurzel einer positiv definiten Matrix Matrixnorm
cond
Konditionszahl
max
Zeilen-/Spaltenmaxima
min
Zeilen-/Spaltenminima
sort
Sortieren
sum
Zeilen-/Spaltensummen
trace
Spur einer Matrix
det
Determinante
null
Nullraum einer Matrix
orth
Orthonormale Basis
46
Falls A eine quadratische Matrix ist, so ist expm(A)“ definiert als ” ∞ X 1 k A . expm(A) = k! k=1
Nur falls A ein Skalar oder eine Diagonal-Matrix ist, gilt expm(A) = exp(A). F¨ ur weitere elementare Funktionen siehe help elfun“, help elmat“ bzw. help matfun“. ” ” ”
8.1.3
Zerlegen von Matrizen
Die nachfolgenden Zerlegungen sind wichtiger Grundbestandteil der numerischen linearen Algebra. Diese Verfahren werden z.B. in Demmel Applied numerical linear Algebra“, Golub und van Loan ” Matrix Computations“ und Watkins Fundamentals of Matrix Computations“ ausf¨ uhrlich bespro” ” chen. Nicht ganz so ausf¨ uhrlich aber daf¨ ur in deutsch ist Robert Plato’s Numerische Mathematik ” kompakt“. lu LR-Zerlegung: Mittels der Gauß-Elimination mit Zeilenpivotierung werden Matrizen L, U und P erzeugt mit LU = P A. Um alle drei Matrizen zu erhalten, ist der Befehl [L,U,P]=lu(A);“ zu ” benutzen. Bei nur zwei R¨ uckgabewerten, also [Z,U]=lu(A);“, ist das erste Element Z = P T L. ” qr QR-Zerlegung: Die QR-Zerlegung liefert eine Zerlegung beliebiger Matrizen in eine orthogonale Matrix Q und eine obere Dreiecksmatrix R. Diese Operation ist zum Beispiel hilfreich beim L¨ osen von kleinst-Quadrat-Aufgaben. Zum Updaten von QR-Zerlegungen sind die Befehle qrinsert“, qrdelete“ und qrupdate“ n¨ utzlich. ” ” ” chol Cholesky-Zerlegung: Die Cholesky-Zerlegung ist ein Spezialfall der LR-Zerlegung f¨ ur symmetrische positiv definite Matrizen. Dies spart viel Rechenaufwand und ist numerisch besser. eig Eigenwert-Zerlegung: Berechnet die Jordan-Zerlegung einer Matrix. Es gibt viele weitere Verfahren in Matlab zum Berechnen von Eigenwert-Zerlegungen, z.B: schur“ und qz“. ” ” svd Singularwert-Zerlegung: Die Singularwerte einer Matrix A sind die Quadratwurzeln der Eigenwerte von AT A. Allerdings wird die Berechnung anders durchgef¨ uhrt. diag Diagonale: Liefert die Werte entlang der Diagonalen der Matrix bzw. nimmt einen Vektor und erzeugt die zugeh¨ orige Diagonalmatrix. tril untere Dreiecksmatrix: Liefert die Werte unterhalb der Diagonalen der Matrix. triu obere Dreiecksmatrix: Liefert die Werte oberhalb der Diagonalen der Matrix. >> >> >> >> >> >>
A=rand(5)+10*eye(5) eig(A) B = A+A0 eig(B) C = sqrtm(B); [V,D] = eig(B);
KAPITEL 8. VERFAHREN DER NUMERISCHEN LINEAREN ALGEBRA
47
>> E = diag(sqrt(diag(D))); >> F= C-V*E*V 0 >>
Mit Hilfe der Befehle diag“, tril“ und triu“ k¨ onnen iterative Verfahren zum L¨ osen von linea” ” ” ren Gleichungssystemen, wie das Jacobi-Verfahren, bequem definiert werden. >> b = rand(5,1); >> D = diag(diag(A)); >> L = tril(A); >> U = triu(A); >> x = b; >> y = A\b; >> for i = 1:10 x = D\((D-A)*x+b); fprintf(0 Fehler ||x − y||=%f \n0 ,norm(x-y)); end; >>
8.2
Du ¨ nnbesetzte Matrizen
In vielen Anwendungen kommen sehr große und d¨ unnbesetzte Matrizen vor. Das sind n × m Matrizen mit n, m 1000, wobei pro Zeile nur wenige Werte belegt sind, z.B. weniger als 1%. F¨ ur solche Matrizen ist es sinnvoll speichereffiziente Darstellungen und Verfahren zu entwickeln. Speichereffiziente Darstellungen solcher Matrizen sind fester Bestandteil von Matlab. Die standard Rechenoperationen sind auf d¨ unnbesetzte Matrizen problemlos u ¨bertragbar, allerdings sind die L¨ osungsoperatoren f¨ ur Gleichungen \ und / meistens nicht effizient. Zum L¨ osen von solchen Gleichungssystemen verwendet man statttdessen iterative Methoden.
8.2.1
Erzeugen du ¨nnbesetzter Matrizen
sparse Konvertierung von voller zu d¨ unner Matrix: sparse(A)“ liefert die Matrix A, allerdings ” werden alle Werte als Tripel (Zeile,Spalte,Wert) gespeichert, es sei denn, der Wert ist gleich Null. Der Aufruf sparse(n,m)“ erzeugt eine n × m Matrix mit den Eintr¨ agen Null. Da die ” Nullen nicht gespeichert werden brauchen, wird nur das Format der Matrix gespeichert, sehr effizient. speye d¨ unne Einheitsmatrix: Der Unterschied zwischen eye(n,m)“ und speye(n,m)“ ist nur das ” ” Speicherformat. spdiags Besetzen von Haupt- und Nebendiagonalen: Viele d¨ unnbesetzte Matrizen haben eine Diagonalstruktur, das heißt die Zahlenwerte ungleich Null liegen auf der Haupt- und wenigen Nebendiagonalen. Zum Erzeugen solcher Matrizen ist spdiags“ eine effiziente Routine. ” Der Befehl full“ ist das Gegenst¨ uck zum Befehl sparse“. ” ” >> A = spdiags(ones(100,1)*[-1,-1,5,-1,-1],[-20,-1,0,1,20],100,100); >> B = full(A); >> C = sparse(B); >> D = A-C; >> whos >> spy(C); >>
KAPITEL 8. VERFAHREN DER NUMERISCHEN LINEAREN ALGEBRA
8.2.2
48
Iterative Verfahren zum L¨ osen von linearen Gleichungssystemen
pcg Preconditioned Conjungate Gradient: Eines der besten iterativen Verfahren zum L¨ osen d¨ unnbesetzer linearer Gleichungssysteme, wenn die Matrix symmetrisch positiv definit ist. cgs Conjungate Gradient Squared: Zum L¨ osen indefiniter nicht singul¨ arer symmetrischer Gleichungssyteme. minres Minimum Residual: Ebenso zum L¨ osen indefiniter, nicht singul¨ arer, symmetrischer Gleichungssyteme. gmres Generalized Minimum Residual: Zum L¨ osen beliebiger nicht singul¨ arer Gleichungssyteme. >> A = spdiags(ones(100,1)*[-1,-1,5,-1,-1],[-20,-1,0,1,20],100,100); >> b = rand(100,1); >> y = A \ b; >> D = diag(diag(A)); >> x = b; >> for i = 1:20 x = D\((D-A)*x+b); end >> tol = norm(y-x) >> z = pcg(A,b,tol); >> tol = norm(y-z) >>
Die obige Liste ist sehr unvollst¨ andig! Am besten schaut man sich hier die Hilfe-Seiten an und besucht entsprechende Vorlesungen. Des weiteren ist hier das Buch von Youcef Saad, Iterative ” Methods for Sparse Linear Systems“ hilfreich. In vielen F¨ allen ben¨ otigt man Vorkonditionierer, damit die iterativen Verfahren konvergieren. Solche Vorkonditionierer kann man mittels der Befehle luinc“ und cholinc“ erzeugen, auch hierzu ” ” siehe das Buch von Youcef Saad.
8.3
Aufgaben
Aufgabe 8.1 Geben Sie die 200 × 200 Matrix A ein, die auf der Diagonalen den Wert 2 und die erste obere und die erste untere Nebendiagonale den Wert −1 haben. Wie viel Speicherplatz verbraucht diese Matrix im d¨ unnbesetzten und wie viel im vollbesetzten Format? (Verwenden sie den Befehl whos“.) ” Aufgabe 8.2 Gegeben sei die Matrix aus Aufgabe 8.1. Berechnen Sie die zugeh¨orige Cholesky Zerlegung. Wie kann dies auch mittels cholinc“ berechnet werden und warum? Ist es sinnvoll, die ” Cholesky Zerlegung dieser Matrix mit cholinc“ zu berechnen? Was passiert, wenn die Matrix das ” Format 2000 × 2000 hat? Aufgabe 8.3 Gegeben sei das Ausgleichsproblem min kAx − bk2 . x
(8.1)
Die L¨osung des Ausgleichsproblem kann ¨ uber die Normalengleichung AT Ax = AT b
(8.2)
berechnet werden. Eine numerisch bessere Berechnung ist durch Rx = QT b
(8.3)
KAPITEL 8. VERFAHREN DER NUMERISCHEN LINEAREN ALGEBRA
49
gegeben, wobei Q und R die Faktoren der QR-Zerlegung von A sind. Berechnen Sie die L¨osung von (8.1) mittels der Normalengleichung, (8.2), und der QR-Zerlegung, (8.3), f¨ ur die Matrix A und den Vektor b, die beide durch die Ausf¨ uhrung des Skripts kleinstquad.m erzeugt werden.
Kapitel 9
Numerische Verfahren Zum numerischen L¨ osen von mathematischen Problemen gibt es zus¨ atzlich zu den Standardver¨ fahren sogenannte Toolboxen. Einen Uberblick u alt man bei Mathworks. ¨ber alle Toolboxen erh¨ Die meisten B¨ ucher zu Matlab oder unter Verwendung von Matlab betrachten spezielle Anwendungsgebiete und damit spezielle Toolboxen. In diesem Kapitel beschr¨ anken wir uns auf eine Auswahl von Standardfunktionen.
9.1
Polynome
Die einfachste Klasse von Funktionen sind Polynome, f¨ ur die es in Matlab ein paar spezielle Hilfsmittel gibt. poly Konvertiert Nullstellen zu Koeffizienten: F¨ ur einen Vektor von (komplexwertigen) Nullstellen wird ein Vektor mit den Koeffizienten desselben Polynoms berechnet. Der letzte Eintrag des resultierenden Vektors entspricht dem konstanten Anteil des Polynoms. polyval Evaluierung eines Polynoms: polyval(p,x)“ berechnet den Wert des Polynoms p(y) an ” den Stellen y, die in x enthalten sind. Dabei muss p die Form p = [pn , . . . , p0 ] haben, wobei pi der Koeffizient von y i ist. x ist vom Typ Matrix. Hier wird jede Komponente von x als eine separate Auswertungsstelle betrachtet. Durch den Aufruf z=polyval(p,x)“ haben die ” Eintr¨ age von z die Form zij
=
n X
pk (xij )k .
k=0
roots Nullstellen eines Polynoms: F¨ ur ein durch einen Koeffizienten-Vektor definiertes Polynom werden alle Nullstellen berechnet. polyvalm Evaluierung eines Matrix-Polynoms: Im Gegensatz zu polyval“ wird hier x als eine ” Matrix interpretiert und p als ein Matrizenpolynom. polyfit Polynom-Approximation: F¨ ur vorgegebene Datenpunkte wird ein Polynom mit spezifiziertem maximalen Rang gesucht, das den Fehler in den Datenpunkten minimiert. spline Spline-Approximation: St¨ uckweise Approximation mit Polynomen niedrigeren Ranges. ppval Auswertung einer Spline-Approximation. conv Multiplikation von Polynomen: conv(a,b)“ interpretiert a und b als Koeffizienten-Vektoren ” zweier Polynome und liefert den Koeffizienten-Vektor des Polynoms zur¨ uck, das aus der Multiplikation der beiden Eingangspolynome entsteht.
50
KAPITEL 9. NUMERISCHE VERFAHREN >> >> >> >> >> >> >> >>
51
% Das Beispiel p(x)= (x-1). b4 a = [1,-4,6,-4,1]; z = [-1:0.1:2]; plot(z,polyval(a,z)); b = roots(a) c = poly(b) Fehler = c - a
Wie das obige Beispiel zeigt, kann das Berechnen von Nullstellen schlecht konditioniert sein, siehe Vorlesungen zu Numerik und entsprechende Literatur. >> % Approximation von sqrt(x)+sin(x) im Intervall (1,20) >> x = [1:20]; >> y = sqrt(x) + sin(x); >> z = [0:0.1:21]; >> figure(1); clf; >> plot(z,sqrt(z)+sin(z)); hold on >> plot(x,y,0 ∗0 ); >> p1 = polyfit(x,y,2); >> p2 = polyfit(x,y,4); >> p3 = polyfit(x,y,6); >> [p4,S,m] = polyfit(x,y,10); >> plot(z,polyval(p1,z),0 y 0 ); 0 0 >> plot(z,polyval(p2,z), m ); >> plot(z,polyval(p3,z),0 r0 ); >> plot(z,polyval(p4,(z-m(1))/m(2)),0 k 0 ); >>
Nur in wenigen F¨ allen ist poly(roots(a)) ≈ a, da poly nur n Parameter hat, um n+1 Koeffizienten zu bestimmen. Es wird also ein normiertes Polynom zur¨ uckgegeben. Damit ist das resultierende Polynom korrekt bis auf einen skalaren Multiplikator. Obiges Problem ist schlecht konditioniert und f¨ uhrt bei einer Approximation h¨ oheren Grades zum Abbruch des Verfahrens. Um eine bessere Konditionierung zu erhalten, benutzt man, wie oben f¨ ur die 4. Approximation geschehen, 3 R¨ uckgabewerte, siehe help polyfit“. ”
9.2
Quadratur
Die numerische Berechnung eines bestimmten Integrals wird als Quadratur bezeichnet. Rb quad adaptives Simpson-Verfahren: quad(f,a,b)“ berechnet das Integral f (x)dx mittels des ad” a aptiven Simpson-Verfahrens. Der Fehler des Integrals ist f¨ ur glatte Funktionen kleiner als 10−6 . quadl Adaptives Gauß-Lobatto-Verfahren: Wie quad“, nur dass hier das Gauß-Lobato-Verfahren ” benutzt wird, welches auf orthogonalen Polynomen beruht. dblquad zweidimensionale Integration triplequad dreidimensionale Integration
KAPITEL 9. NUMERISCHE VERFAHREN
52
>> f = @(x) exp(-sqrt(x)).*sin(x); >> quad(f,0,10) >>
Sehr wichtig ist hier, dass x ein Vektor von St¨ utzstellen sein darf; also es ist auf elementweise Multiplikation, Division etc. zu achten.
9.3
Stochastik
rand Gleichverteilte Zufallsvariablen: rand(n)“ liefert eine n × n Matrix und rand(n,m)“ eine ” ” n × m Matrix mit gleichverteilten Eintr¨ agen. randn Normalverteilte Zufallsvariablen: Wie rand“, aber jetzt standard-normalverteilte Eintr¨ age. ” mean Erwartungswert: Berechnet zu einem Vektor den Erwartungswert. Falls die Eingabe eine Matrix ist, wird je Spalte ein Erwartungswert berechnet. std Standardabweichung: Arbeitet wie mean“ und liefert die Standardabweichung. ” var Varianz: Arbeitet wie mean“ und liefert die Varianz. ” cov Kovarianz: Als Eingabe wird eine Matrix erwartet. Dabei repr¨ asentiert jede Zeile ein Zufallsexperiment und jede Spalte die Realisierungen einer Zufallsgr¨ osse. median Median: Arbeitet wie mean“ und liefert den Median. ” Ein ausf¨ uhrlicheres Beispiel wird in Kapitel 10 besprochen.
9.4
Andere Funktionen
fzero Nullstellensuche: fzero(Funktion,Startwert)“ findet, sofern vorhanden, eine Nullstelle der ” gegebenen Funktion in der N¨ ahe des Startwertes. Die Funktion fzero“ ist ein hervorragendes ” Beispiel guter numerischer Programmierung. fminsearch mehrdimensionale Minimierung ohne Nebenbedingungen: fminsearch(Fun,Startwert)“ ” sucht ein lokales reelles Minimum der Funktion F un : Rn → R. fminbnd Minimierung auf einem Intervall: Da die Minimierung auf einem Intervall eine h¨ aufig auftretende Aufgabe ist, gibt es dieses spezielle Werkzeug, fminbnd(Funktion,links,rechts)“. ” Fouriertransformationen sind in der Numerik und vor allem in den Ingenieurwissenschaften Standardwerkzeuge. Es stehen hier wiederum diverse Varianten zur Verf¨ ugung. Als Beispiel seien die beiden klassischen Varianten erw¨ ahnt. fft Fast Fourier Transformation: fft(a)“ liefert die Fouriertransformierte von a. Dagegen liefert ” fft(a,n)“ die Fouriertransformierte von b, wobei, falls n kleiner als die L¨ ange von a ist, ” b = a(1 : n) und andernfalls b = [a; zeros(n − length(a), 1)] ist. ifft Inverse Fast Fourier Transformation Umkehrung zu fft“. ” Mittels der Fast Fourier Transformation l¨ asst sich die Polynommultiplikation schneller als auf dem direkten Weg l¨ osen. >> a = [2,3,1,6]; >> b = [7,1,3]; >> c = conv(a,b) >> af = fft(a,8)
53
KAPITEL 9. NUMERISCHE VERFAHREN
9.5
>> >> >> >> >>
bf = fft(b,8) df = af.*bf d = ifft(df ) d = d(find(d))
Gew¨ ohnliche Differentialgleichungen
Zum L¨ osen von Anfangswertaufgaben du dt
= f (t, u)
u(0) = u0
stehen eine Reihe von Verfahren zur Verf¨ ugung. ode113 ode23s
ode15i ode23t
ode15s ode45
ode23
Obige Verfahren kombinieren eine Vielzahl von numerischen Ideen, um diverse Schwierigkeiten, die beim L¨ osen von gew¨ ohnlichen Differentialgleichungen auftreten k¨ onnen, zu meistern. Ferner lassen sich diese Verfahren durch zahlreiche optionale Parameter tunen. Die Verfahren ode23s“ und ode15s“ sind zum Beispiel besonders geeignet steife Differential” ” gleichungen zu l¨ osen. Ein Beispiel 1 −0.1 1 (9.1) u u(0) = u˙ = 0 −1 −0.1 hat die L¨ osung u(t) = e >> >> >> >> >> >> >> >> >>
−t/10
cos(t) −sin(t)
.
(9.2)
f = @(t,x) [-0.1,1;-1,-0.1]*x; Zeit = [0,10]; Start = [1;0]; tic,[T,X] = ode45(f,Zeit,Start);toc plot(T,X); % Zum Vergleich hold on; plot(T,exp(-T/10).*cos(T),0 r0 );
Eine deutlich ausf¨ uhrlichere Beschreibung der ode-L¨ oser kann in Higham & Higham Matlab ” guide“ gefunden werden. Zuweilen sind auch sogenannte Randwertaufgaben zu l¨ osen, z.B. uxx + (1 − u)(1 + u2x )3/2
= 0
u(−1) = u(1) = 0.
Dieses Randwertproblem beschreibt einen Wassertropfen. Man kann diese Art von Aufgaben mittels Schießmethoden“ auf eine Sequenz von Anfangswertaufgaben zur¨ uckf¨ uhren. Doch h¨ aufig empfiehlt ” sich ein Ansatz mittels Kollokation, siehe Quateroni/Sacco/Saleri Numerische Mathematik II“ ” bzw. Numerical Mathematics“. ” bvp4c Randwertl¨oser: bvp4c“ ist ein effizienter, leistungsf¨ ahiger Randwertl¨ oser, der auf Kolloka” tion beruht.
54
KAPITEL 9. NUMERISCHE VERFAHREN
9.6
Partielle Differentialgleichungen
Partielle Differentialgleichungen kommen in praktischen Problemen (Anwendungen) h¨ aufig vor, wie z.B die W¨ armegleichung ∂u ∂t
=
∂2u ∂x2
∀t ∈ [t0 , T ], ∀x ∈ Ω.
Je nach Form der partiellen Differentialgleichung werden noch diverse Rand- und Anfangsbedingungen ben¨ otigt. Zum L¨ osen von einigen eindimensionalen, parabolischen und ellliptischen Differentialgleichungen der Form c(x, t, u, ux )
∂u ∂t
= x−m
∂ (xm f (x, t, u, ux)) + d(x, t, u, ux ) ∂x
gibt es den Befehl pdepe“, der die folgende Syntax hat: ” L¨osung = pdepe(m,F,Start,Rand,Gitter,Zeit,Optionen) Dabei ist m = 0, 1, 2 der Parameter aus der allg. Form der Differentialgleichung. Die Funktion F ist eine dreidimensionale Abbildung der Koeffizientenfunktionen und hat die Form c(x, t, u, ux ) F (x, t, u, ux ) −→ f (x, t, u, ux ) . d(x, t, u, ux ) F muss in einem M-File definiert werden! Erlaubt ist, dass F.m ein Funktion-File ist, das F spezifiziert, oder, dass F innerhalb eines M-Files, in dem diese Differentialgleichung gel¨ ost werden soll, als Unterfunktion definiert ist. Start beinhaltet den Startwert u(0, x) = u0 (x) an den Gitterpunkten Gitter. Die Funktion Rand erlaubt die Spezifizierung von allgemeinen Randbedingungen in a und b. Sollen die R¨ ander der Differentialgleichung f¨ ur geeignete Funktionen pa , qa , pb und qb den Bedingungen pb (x, t, u) + qa (x, t)f (x, t, u, ux ) = 0 pb (x, t, u) + qb (x, t)f (x, t, u, ux ) = 0 gen¨ ugen, so hat Rand die Form
Rand(xa, ua, xb, ub, t) −→
pa qa pb , qb
wobei pa, qa, pb und qb Skalare sind. F¨ ur Rand gilt die gleiche Einschr¨ ankung wie f¨ ur die Funktion F : Sie muss in einem M-File definiert werden.
9.7
Aufgaben
Aufgabe 9.1 Die L¨osung der Differentialgleichung (9.1) kann auf verschiedene Weise berechnet werden. Sei A=[-0.1,1;-1,-0.1]“ die Koeffizientenmatrix der Differentialgleichung, dann gilt u(t) = ” exp(A ∗ t) ∗ u(0). Mit der Eigenwertzerlegung A = V ∗ D ∗ V −1 , siehe eig“, gilt u(t) = V ∗ exp(D ∗ ” −1 t) ∗ V ∗ u(0). Ferner kann man die L¨osungsformel (9.2) und den numerischen L¨oser ode45“ ” verwenden. Berechnen Sie die L¨osung von (9.1) mittels der vier Methoden und vergleichen Sie die Genauigkeit und den Zeitaufwand, der bei der Berechnung entsteht. (F¨ ur die Bestimmung des Zeitaufwands sind die Befehle tic“ und toc“ hilfreich.) ” ”
KAPITEL 9. NUMERISCHE VERFAHREN
55
Aufgabe 9.2 F¨ uhren Sie die angegebenen Beispiele aus. Aufgabe 9.3 Gegeben seien die Polynome p(x) = (x − 3)(x − 2)(2x2 + 2x + 1) und q(x) = (x + 1)(x3 + x). Berechnen Sie die Koeffizienten von p und q, sowie vom Produkt p · q. Wie lauten die Nullstellten von p, q und p · q? Aufgabe 9.4 Berechnen Sie die L¨osung der W¨armegleichung auf Ω = [0, 1] mit u0 (x) = 1/(0.1 + (x − 0.5)2 ) und den Randbedingungen ux (t, 0) = 0 und u(t, 1) − 10ux(t, 1) = 0. Versuchen Sie die L¨osung graphisch darzustellen.
Kapitel 10
Beispiele 10.1
Zufallszahlengeneratoren
In vielen praktischen Problemen sollen zuf¨ allige Ereignisse modelliert werden. Um dieses Problem am Computer zu realisieren, ben¨ otigt man Zufallszahlen. Da ein Computer streng deterministisch arbeitet, kann er maximal Pseudo-Zufallszahlen erzeugen. Pseudo-Zufallszahlen sind Zahlen, die streng deterministisch erzeugt sind, aber die Eigenschaften von Zufallszahlen haben. Dies hat den Vorteil, dass Ergebnisse reproduzierbar sind. Um Zufallszahlen zu erzeugen, gibt es eine Reihe von Ideen, einige werden im Anschluss vorgestellt. Das Hauptaugenmerk aber wird sein, wie man diese Zufallszahlengeneratoren“ auf ihre ” Qualit¨ at pr¨ uft und nat¨ urlich wie man all dieses in Matlab implementiert. Eine beliebte Klasse von Zufallszahlengeneratoren sind lineare Kongruenz Methoden“, dabei ” benutzt man die Vorschrift Xi = (a ∗ Xi−1 + b)modM. Der folgende Code realisiert dieses Verfahren 1 % lineare Kongruenz Methode 2 % 3 % Y = Kongruenz (N,A,B,M,S) 4 % liefert N in (0,1) gleichverteilte Werte. Dabei sind A, B und M 5 % die Parameter des Zufallserzeugers und S der Startwert. 6 % Falls kein Startwert spezifiziert ist, wird beim ersten 7 % Aufruf von Kongruenz der Wert S=round(M/3+1) gew¨ahlt, bei 8 % nachfolgenden Aufrufen von Kongruenz wird der aktuelle Wert 9 % verwendet. 10 % 11 function Y = Kongruenz (n,a,b,M,S,varargin) 12 global KongruenzX 13 if (nargin < 4) fprintf(0 Nicht genuegend Eingangsvariablen\n0); 14 Y = -1; 15 return 16 17 end 18 if (nargin < 5) if isempty(KongruenzX) 19 X = round(M/3+1); 20 56
KAPITEL 10. BEISPIELE 21 22 23 24 25 26 27 28 29 30 31 32 33
57
else X = KongruenzX; end else X = S; end Y = zeros(n,1); for i = 1:n X = mod(a*X+b,M); Y(i) = X/M; end KongruenzX = X;
Der Befehl global“ stellt sicher, dass die Variable KongruenzX auch nach dem Beenden des ” Programms und somit beim n¨ achsten Aufruf noch existiert. Ferner definiert global KongruenzX“ ” die Variable, wir erhalten also keine Fehlermeldung, wenn wir KongruenzX verwenden. Allerdings ist KongruenzX beim ersten Mal noch mit keinem Wert belegt, somit ist KongruenzX leer und isempty(KongruenzX)“ liefert den Wert 1. ” Eine weitere Klasse von Verfahren sind Fibonacci-Generatoren“. Diese benutzen die Vorschrift ” a = U i − Uj falls a < 0, setze a = a + 1 Ui = X = a Verringere i und j um 1 falls i = 0 oder j = 0, setze i = k bzw. j = k Der folgende Code realisiert dieses Verfahren: 1 % Fibonacci Zufallszahlen-Generator 2 % 3 % Y = Fibonacci (N,U) 4 % liefert N in (0,1) gleichverteilte Pseudo-Zufallsszahlen 5 % Falls U nicht spezifiziert ist, wird beim ersten Aufruf 6 % U = [7,18,21,4,9,29,sqrt(2),sqrt(5),3,2,17]/31 7 % gew¨ahlt, ansonsten wird der derzeitige interne Wert von U benutzt. 8 % 9 function Y = Fibonacci (n,U,varargin) 10 global FibonacciX FibonacciI FibonacciJ FibonacciK 11 if (nargin < 1) fprintf(0 Nicht genuegend Eingangsvariablen\n0); 12 Y = -1; 13 return 14 15 end 16 if (nargin < 2) if isempty(FibonacciX) 17 X = [7,18,21,4,9.29,sqrt(2),sqrt(5),3,2,17]/31; 18 I = 3; 19 J = 8; 20 K = 11; 21 else 22
58
KAPITEL 10. BEISPIELE 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
X = FibonacciX; I = FibonacciI; J = FibonacciJ; K = FibonacciK; end else X = U; K = length(U); I = round(K/3); J = round(4/5*K); end Y = zeros(n,1); for i = 1:n y = X(I)-X(J); if (y < 0) y = y+1; end Y(i) = y; X(I) = y; I = I-1; J = J-1; if (I==0) I = K; end if (J==0) J = K; end end FibonacciX = X; FibonacciI = I; FibonacciJ = J; FibonacciK = K;
Um nun die einzelnen Zufallszahlengeneratoren auszutesten und in ihrer Qualit¨ at zu beurteilen, noch ein paar n¨ utzliche Werte zur Gleichverteilung: Erwartungswert
1 2
Varianz
1 12
Schiefe
0
W¨ olbung
1.8
Median
1 2
Die folgende Funktion berechnet die stochastischen Werte zu den obigen Kennzahlen und erzeugt eine kleine Graphik, die die Streuung zweier aufeinander folgender Zufallszahlen demonstriert. ur Zufallszahlengeneratoren 1 % Tester f¨ % 2 3 % Kennzahlen = GeneratorTest(Generator,N,K); 4 % nimmt den Generator (Funktion) und berechnet N Zufallszahlen, 5 % um mittels dieser einige Kennzahlen zu berechnen. uhrt. 6 % Es wird auch eine Korrelationsanalyse durchgef¨ % Dabei ist von Interesse, ob K aufeinanderfolgende Zufallszahlen 7 8 % korreliert sind.
KAPITEL 10. BEISPIELE 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
function Kennzahlen = GeneratorTest(Gen,n,k) X = Gen(n); MX = mean(X); Z = X-MX; Kennzahlen.Erwartungswert = MX; Kennzahlen.Varianz = var(X); Kennzahlen.Schiefe = mean( Z. b3 ); M2 = mean( Z. b2); M4 = mean( Z. b4); Kennzahlen.Woelbung = M4/M2 b2; Kennzahlen.Median = median(X); %%%% % Nun bereiten wir die Korrelationsanalyse vor %%%% d = [1:n-k]’; ind = d ∗ ones(1, k) + ones(n − k, 1) ∗ d(1 : k)0 − ones(n − k, k); Y = X(ind); C = cov(Y); Kennzahlen.Unabhaengigkeit = norm(C – eye(k)); fiugre(1); clf; if (n < 101) plot(Y(:,1),Y(:,2),0 .0 ); else scatter(Y(:,1),Y(:,2),1); end
Nun werten wir drei Beispiele aus und vergleichen Sie mit den zugeh¨ origen Sollwerten. >> Soll=struct(0 Erwartungswert0 ,1/2,0 Varianz0 ,1/12,... 0 Schiefe0 ,0,0 Woelbung0 ,1.8,... 0 Median0 ,1/2,0Unabhaengigkeit0 ,0); >> f = @(n) Kongruenz(n,2,0,11); >> GeneratorTest(f,100,2) >> f = @(n) Kongruenz(n,1229,1,2048); >> GeneratorTest(f,100,2) >> f = @(n) Fibonacci(n); >> GeneratorTest(f,100,2) >> GeneratorTest(f,1e4,17) >> f = @(n) rand(n,1); >> GeneratorTest(f,1e4,2) >>
59