Programmieren mit Matlab — Eine Einführung —
Transcription
Programmieren mit Matlab — Eine Einführung —
Programmieren mit Matlab — Eine Einführung — J. Berns-Müller 2. Oktober 2006 Inhaltsverzeichnis 1 Einführung 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äre Operatoren . . . . . . 2.4.2 Binäre 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ür 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öcken . . . . 5.7 Aufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 28 29 30 30 31 32 33 6 Speichern und Lesen von Datensätzen 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ührliches Beispiel . . . . . . . . . . . . 6.5 Aufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 34 35 35 36 36 37 37 38 7 Graphik 7.1 Übersicht . . . . . . . . . . . . . . . . 7.2 Der plot-Befehl . . . . . . . . . . . . . 7.2.1 plot mit einem Argument . . . 7.2.2 plot mit mehreren Argumenten 7.2.3 Ein ausführliches Beispiel . . . 7.3 Für 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öhnliche Matrizen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.1.1 Erzeugen von Matrizen und Vektoren . . . . . . . . . . . . . . . 8.1.2 Rechnen mit Matrizen . . . . . . . . . . . . . . . . . . . . . . . . 8.1.3 Zerlegen von Matrizen . . . . . . . . . . . . . . . . . . . . . . . . 8.2 Dünnbesetzte Matrizen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.2.1 Erzeugen dünnbesetzter Matrizen . . . . . . . . . . . . . . . . . . 8.2.2 Iterative Verfahren zum Lösen 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öhnliche 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 Einfü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ösen. • 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ür Matlab, um komplexe Aufgaben einfach zu lösen. 1.1.4 Vorteile von Matlab • Einfaches Programmieren • Automatische Speicherverwaltung 4 KAPITEL 1. EINFÜHRUNG 5 • Automatische Typkonvertierung • Detaillierte Fehlermeldungen • Hohe Qualität der implementierten Routinen • Open Source vieler Routinen • Vielfältige Möglichkeiten der Visualisierung von Daten • Einfaches Einlesen von Daten • Routinen für dünnbesetzte Matrizen 1.1.5 Andere mathematische Softwarepakete Es gibt zahlreiche weitere mathematische Softwarepakete und Bibliotheken, nachfolgend eine kleine Auswahl: maple Computeralgebra-System, speziell für Funktional-Analysis gap Computeralgebra-System für Experten, speziell für Algebra femlab Finite Elemente Software Paket zum numerischen Lösen von partiellen Differentialgleichungen LAPACK numerische Verfahren der linearen Algebra (direkte Methoden) SCALAPACK numerische Verfahren der linearen Algebra für größ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ötigt eine Java-Umgebung und liefert dafür die ” volle Matlab-Entwicklungsumgebung. Für 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ückt die [Return]” Taste. 6 KAPITEL 1. EINFÜHRUNG 1.2.2 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 öffnet dann ein kleines Fenster mit einem Logo, bevor es das eigentliche Hauptfenster mit einigen Unterfenstern öffnet. Viele der standardmäßig geöffneten Unterfenster sind eher störend. Um eine bessere Übersicht 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üßung enthält 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ätigen der Returntaste wird Matlab aufgefordert, diese Zeile zu bearbeiten). Mit dem Einrücken 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ührten Stichwörtern gibt es weitere Informationen. Geben Sie zum Beispiel >> help general >> ein. Matlab verfügt über viele Hilfestellungen. Zum einen eine ausführliche online-Dokumentation, viele Informationen in den Hilfstexten ( help“), zahlreiche Beispiele ( demos“) und häufig ist der ” ” Programmcode frei zugänglich ( type“). Ferner gibt es viele Hilfefunktionen, die in Matlab im” plementiert sind. KAPITEL 1. EINFÜHRUNG 1.3 7 Literatur Da die in Matlab integrierten Hilfefunktionen sehr ausführlich sind, sollte dieses Tutorial als Einstieg genügen. Dennoch geben wir hier eine kurze Auswahl an Hilfen zum Arbeiten mit Matlab. Für Anfänger sind die Bücher Rudra Pratap Getting Started with Matlab (Oxford) Duane Hanselman & Bruce Littlefield Mastering Matlab (Prentice Hall) geeignet. Für 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ört, empfohlen. Allgemeine Lernhilfen zum Programmieren für Einsteiger Klaus Menzel Algorithmen. Vom Problem zum Programm. (Teubner) 1.4 Aufgaben Nachfolgende Aufgaben sollen Ihnen die Arbeitsweise von Matlab etwas näherbringen, 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ühren 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ühren.) 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örige 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 Übersichten anschauen, eine Alternative ist das demo-Paket.) 8 KAPITEL 1. EINFÜHRUNG Aufgabe 1.5 Selbst schwierigere Aufgaben sind leicht zu lösen, z.B. das Lösen eines Anfangswertproblems. Gegeben sei das Anfangswertproblem d dt 2 x(t) = −x(t) x(0) = 1, welches die Cosinusfunktion als Lösung hat. Mit dem nachfolgenden Code wird eine numerische Lösung berechnet und graphisch dargestellt. Der letzte Befehl bewirkt die graphische Darstellung der Abweichung der numerischen von der exakten Lösung. >> 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ürze selber können.) Kapitel 2 Zahlen, Vektoren und Matrizen 2.1 Grundlegendes Da Matlab automatisch Datentypen anpasst, benötigt man gewöhnlich 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änge n als eine 1 × n Matrix und jeder Spaltenvektor der Länge 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änkt rechnen kann. Da Matrizen so wichtig sind im Umgang mit Matlab, werden wir uns im Folgenden sehr intensiv mit Matrizen beschäftigen. Zuerst betrachten wir zahlreiche Möglichkeiten, eine Matrix zu definieren und anschließend mit ihr zu arbeiten. Eine umfassende Übersicht aller Datentypen erhält 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ücken 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änderten 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äter noch einige Beispiele kennenlernen. 9 KAPITEL 2. ZAHLEN, VEKTOREN UND MATRIZEN 10 Namen von Variablen müssen 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änkung für WindowsSysteme 2000 und abwärts: 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äre Operator, der zur Überprüfung 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ärteil zwei dargestellt werden. Matlab erkennt automatisch, dass die Einträge komplexwertig sind und passt die interne Zahlendarstellung an. Simultan ändert 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äufig als Laufvariablen benutzt werden, empfiehlt sich die zweite Notation nicht! (Man kann Matlab-Befehle und Variablen überschreiben, indem man einer Variablen etc. diesen Namen gibt und der Variablen einen Wert zuweist. Um die ursprüngliche Bedeutung des Matlab-Befehls wiederherzustellen, muss die eigene Variable gelöscht 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öße der Matrix wird automatisch anhand der Einträge 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äter eine Verwendung für eine leere Matrix sehen. Kommas, ,“, trennen zwei Einträge, die in der gleichen Zeile stehen, und Semikolons, ;“, ” ” trennen zwei Zeilen voneinander. Es ist darauf zu achten, dass die Anzahl der Elemente für 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ägen 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ückt es die Ausgabe. Die Ausführung erfolgt nach Beendigung der Zeile durch die [Return]-Taste. Alternativ kann das Semikolon weggelassen werden, dann entspricht das Betätigen der [Return]-Taste dem Befehlsende, aber die Ausgabe wird nicht unterdrückt. 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ücken [Return]. >> A ans = 1 2 3 4 5 6 7 8 9 10 11 12 >> Das Ausgabeformat hängt im Wesentlichen von vier Faktoren ab: vom Format der Zahlendarstellung, vom Format der Matrix, von dem zur Verfügung stehenden Platz und, ob die Zahlen reell oder komplex sind. Das Zahlenformat kann durch die format-Anweisung geändert werden, näheres siehe help format“. ” Die Änderung des Formats hat keinen Einfluss auf die Rechengenauigkeit. (Mehr zu diesem Thema in der Vorlesung Einführung in die numerische Mathematik“.) ” Es gibt viele weitere Möglichkeiten, eine Matrix zu definieren. Zuerst löschen wir die Matrix A >> clear A >> nun können wir andere Varianten testen >> A=[1,2,3;... 4,5,6;... 7,8,9;... 10,11,12]; >> Diese Definition der Matrix ist äquivalent zur ursprünglichen Definition, aber viel übersichtlicher. ... Befehlsfortsetzung: Der dreifache Punkt erlaubt eine saubere Notation, die dem späteren 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öglichkeiten. 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ührte Variante nutzt aus, dass Matlab die Größenanpassung automatisch vornimmt, nicht definierte Einträge werden auf 0 gesetzt. Matrixeinträge müssen 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ägen a, a + 1, a + 2, . . . , a + k, wobei k die größ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ür eine Matrix benutzt werden kann. ” Die Anweisung a:b:c“ erzeugt einen Vektor mit den Einträgen 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ür Matrizen und die Kleinschreibung von Namen für Zahlen und Vektoren ist in der numerischen Algebra üblich. Sie dient vor allem dem schnelleren Verständnis der einzelnen Operationen.) 2.3.1 Matrix versus Vektor Intern werden Matrizen linear gespeichert, d.h. für eine n×k Matrix werden alle Einträge 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ür die Umrechnung von den Indices i, j auf den Gesamtindex gibt es die Funktion sub2ind“ ” und für 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önnen, benötigen wir entweder eine k × 1 Liste, die den Gesamtindex der jeweiligen Elemente beinhaltet, oder wir benötigen den Befehl sub2ind“ und eine k × 2 Matrix, die je Zeile den Zeilen- und Spaltenindex des jeweiligen ” Matrixelements enthält. (In einigen früheren Varianten von Matlab funktionierten auch einige weitere Blockabfragen“ .) ” Ähnlich wie beim Zugriff auf Elemente einer Matrix, kann man einzelne Elemente einer Matrix ändern. >> A(4,1)=0; >> A(3,2)=-1; >> Man kann auch mehrere Einträge einer Matrix simultan ändern. >> A(1,:)=2+A(1,:); >> A(2:3,1:2)=[15,16;-1,-2]; >> Diese simultanen Änderungen sind sehr effektiv, sie werden schneller ausgeführt, als wenn die Änderungen durch einzelne Ausführungen 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öße betrachtet mit allen Einträgen gleich der Zahl, die Anweisung 2+A(1,:)“ kann also durch 2*[1,1,1]+A(1,:)“ ersetzt werden. Allerdings benötigt ” ” man im ersten Fall keine Informationen über die Größe von A. Zudem ist die erste Variante schöner und schneller. KAPITEL 2. ZAHLEN, VEKTOREN UND MATRIZEN 2.4 14 Matrix Operationen Häufig wird zwischen unitären und binären 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äre Operation und die Addition zweier Matrizen eine binäre Operation. 2.4.1 Unitäre Operatoren Betrachten wir zunächst die drei unitären 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ährend B und C identisch sind, unterscheiden sich die Matrizen D und E im (1, 1) Element. (Die Verwendung von 0 hilft häufig, numerische Verfahren sowohl auf reelle Matrizen, wie auch auf komplexe Matrizen anwenden zu können.) 2.4.2 Binäre Operatoren Bei den binären Operatoren gibt es die Operationen aus der linearen Algebra, wie auch einige zusätzliche, die elementweise agieren bzw. lineare Gleichungssysteme lösen. >> B = A + A; >> C = A0 ∗ A; >> D = B − A; >> a = [1 : 4]; >> E = a0 ∗ a; >> f = a ∗ a0 ; >> G = C b2 >> Zusätzlich 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äre Matrix ist. Wie bereits erwähnt, 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ösungsoperatoren \“ und /“ für 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ösung 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ätzlich das Zeilenende. >> >> % Probe >> A ∗ x − b >> y ∗ A − c >> Dabei ist darauf zu achten, dass die Matrix invertierbar ist. Andernfalls erhält man statt einer Lösung eine Fehlermeldung. (Die Ausführung 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önnen sowohl mit Zahlen als auch mit Vektoren und Matrizen ausgeführt werden. Näheres wird in der Regel in den Hilfsinformationen zu den jeweiligen Funktionen bzw. Operationen erklärt. 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öß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ührung 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ür 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ürlicher Logarithmus log2(a) Logarithmus zur Basis 2 log10(a) dekadischer Logarithmus real(a) Realteil imag(a) Imaginärteil 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ür p erlaubt. ” 2.5.4 Weitere Matrixoperationen Nachfolgende Befehle ändern die Anordnung der Matrix f liplr rot90 ipermute Spaltenpermutation Drehung der Matrix Umkehrung von permute“ ” f lipud permute reshape Zeilenpermutation Permutation der Dimensionen Ändern des Matrixformats (Die Befehle permute“ und ipermute“ sind keine gewöhnlichen 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ältig! 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ösung 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ür 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ägen 0 und 1 an, indem Sie die Funktionen zeros“ und ones“ verwenden. Kontrollieren Sie die Größ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älligen Elementen. Die Matrix C sei eine 10 × 9 Matrix, bei der die ersten drei Spalten mit denen von A übereinstimmen. Alle anderen Spalten stammen von B, wobei die Elemente der letzten beiden Zeilen 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öß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ückgelieferten Variablen bei Beendigung der Funktion gelöscht 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önnen im Skript benutzt und verändert werden und alle Variablen, die während des Skripts bekannt sind, stehen auch nach Beendigung des Skripts noch zur Verfügung. Dies beinhaltet auch das Überschreiben 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öffnet ist, kann man den Editor über das File-Menu öffnen ( File→New→ ” 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ührbares 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üpunkt File→Save as“ ” verwenden. Anschließend geben wir im Command-Fenster >> A = [7] >> B = 1 >> Skript1 >> A >> B >> ein. Während das Skript als Skript1.m gespeichert wurde, erfolgt der Aufruf nur als Skript1“ ” (hätten wir das Skript als Hans Wurst.m gespeichert, würde der Aufruf als Hans Wurst“ erfolgen). ” Dies gilt ebenso für 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äziser Schlagwörter anzugeben, was die Funktion bzw. das Skript bewirkt. Die erste Zeile wird deshalb auch als H1-Zeile bezeichnet und dient als Suchindex für 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äutern. Diese Art von Kommentaren kann man sich später mit dem help“-Befehl anschauen. ” Ändern 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 für Einsendeaufgaben Für Ihre Einsendeaufgaben, computerbasierte Übungsaufgaben, 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üller0 ; Vorname = 0 Liesel0 ; Veranstaltung = 0 Vorsemesterkurs Matlab0 ; Blatt=1; %%%%%%%%%%%% % Nachfolgende Zeilen bitte nicht verändern 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ändern 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 Programmieren beenden wollen, speichern Sie das File zum Beispiel als tutorial 1.m und führen dann im Command-Fenster >> tutorial 1 >> aus. Falls Sie nicht zufrieden sind mit Ihren Lösungen, so können Sie im Editor am Skript tutorial 1.m entsprechende Änderungen vornehmen und anschließend das Skript nochmals ausführen. 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örigen Funktionswerte zurückgeben. 1 % Function-file: plotsin: plot sin function 2% 3 % plotsin(N) berechnet die Funktionswerte einer Sinusschwingung und 4 % gibt den zugehörigen Graphen aus. Dabei ist N+1 die Anzahl KAPITEL 3. SKRIPTE, FUNKTIONEN UND DEBUGGING 5 6 7 8 9 10 11 12 21 % der äquidistanten Stützstellen, die verwendet werden sollen. % Y=plotsin(N) gibt die Funktionswerte zurück. % [Y,X]=plotsin(N) gibt die Stützstellen X und die Funktionswerte Y zurück. 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önnen wir uns wieder die gesamte Funktion oder den Kommentar zur Syntax anschauen. Nachfolgend einige Erläuterungen zu obiger Funktion Notation Großschreibung von Variablen- und Funktionennamen: Zur besseren Unterscheidung von gewöhnlichem 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ünstig. function Funktionsdeklaration: Der Begriff function“ in Zeile 8 definiert das File plotsin.m als ” Funktionfile in Unterscheidung zu einem Skriptfile. Die Syntax einer Funktionserklärung besteht aus dem Wort function gefolgt von den Rückgabewerten“, die mittels des Gleichheits” zeichen, =, vom Funktionsnamen und der Liste der Eingangswerte“ getrennt ist. Wird mehr ” als ein Rückgabewert“ definiert, so müssen diese von eckigen Klammern, [ ] , eingeschlossen ” werden. Die Wahl des Funktionsnamens kann nahezu willkürlich sein, es empfiehlt sich aber, ihn mit dem Namen des Files übereinstimmen zu lassen. Fü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ückgabewerte = Funktionsname (Eingangswerte) Parameter Eingabe- und Rückgabewerte: Die Namen der Eingabewerte können beliebig gewählt werden, wobei eine geschickte Verwendung von kurzen aber bezeichnenden Namen empfohlen wird. Für 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 Übergabe von verschieden vielen Eingabe- bzw. Rückgabewerten. Dazu muss das letzte Element in der Eingabeliste varargin bzw. das letzte Element in der Rückgabe varargout heißen. Falls dem so ist, existieren die zusätzlichen Variablen nargin und nargout, die die Anzahl der vom Benutzer tatsächlich übergebenen bzw. übernommenen Variablen als Wert haben. Viele der Matlab eigenen Routinen benutzen diese Form, um für verschiedene Situationen nur eine Schnittstelle definieren zu müssen. plot Zeichnen: plot ist der einfachste und vielleicht auch am häufigsten benutzte Befehl, um Daten zu illustrieren. Später 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ür einmalige Anwendungen eine Funktion definiert werden muss, die durch einen einfachen Matlab-Ausdruck darstellbar ist. inline Funktionsdeklaration: Die Idee ist ähnlich dem @“-Befehl, hier wird die Funktion als Zei” chenkette (siehe Kaptiel 5) übergeben. fzero Nullstellensuche: fzero(Funktion,Startwert)“ findet, sofern vorhanden, eine Nullstelle der ” Funktion in der Nähe 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 älteren Matlab-Versionen nur ” ” teilweise unterstützt. Speziell ältere Matlab-Versionen kombiniert mit älteren 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önnen weitere Funktionen erklärt werden, aber diese sind nur lokal verfügbar, außerhalb dieses M-Files sind sie nicht definiert. Man betrachte nachfolgendes Beispiel. In Matlab können wir auch Funktionen als Eingangswerte verwenden. Dies ist besonders nützlich um z.B. mathematische Routinen für 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ünen 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äufig verursachen kleine Tippfehler bereits sehr ärgerliche Resultate und erheblichen Suchaufwand, um den Fehler zu beheben. Während bei syntaktischen Fehlern Matlab schnell reklamiert, dass etwas nicht so funktioniert wie man es eingetippt hat, sieht es bei logischen Fehlern leider häufig 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ührung von Befehlen erlaubt, um so die Veränderung von einzelnen Variablen verfolgen zu können. Hält der Debugger inne, so ist die Ausführung eines Skriptes oder eines Programmes unterbrochen, und dem Benutzer steht das Command-Fenster zur Verfügung, um die aktuellen Werte der Variablen analysieren zu können. Häufig möchte man nicht alle Schritte einzeln ausführen, aber alle bis zu einem gewissen Punkt. Dies wird in Matlab durch das Setzen von Stopppunkten ermöglicht. Die Funktionen des Debuggers sind im Editor-Fenster im Menü 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ührung der markierten Zeile innehält. Von nun an kann man jede Zeile für sich oder alle bis zum nächsten Stopppunkt ausführen. Dazu benutzt man wiederum das Menü Debug bzw. die entsprechenden Funktionstasten. Verwenden wir obiges Beispiel und schauen uns die Werte von X und Y näher 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öhnlichen 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öschen 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öß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önnen 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öß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ückungen vorgenommen, um die Programm-Struktur deutlich zu machen. Während 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ügung. 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ätzlich 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ährend bei a&b“ und a|b“ die Ausdrücke 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ändnis 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ößer größer gleich gleich < <= ∼= kleiner kleiner gleich ungleich zur Verfügung. 4.1.2 switch-Verzweigung Die Switch-Verzweigung erlaubt einfache Mehrfachverzweigungen. Es können wie im nachfolgenden Beispiel verschiedene Werte zusammengefasst werden, indem man sie in einen Block setzt, d.h. in geschweifte Klammern schreibt. 1 switch(B) case ’a’, 2 fprintf(’Die Variable B ist vom Typ string und enthält den Wert %c’,B); 3 case 1, 4 fprintf(’Die Variable B ist vom Typ matrix und enthält den Wert 1’); 5 case {2,3}, 6 fprintf(’Die Variable B ist vom Typ matrix und enthält den Wert %d’,B); 7 otherwise 8 fprintf(’Die Variable B ist wohldefiniert, aber ich weiß sonst nichts’); 9 10 end 11 4.1.3 Die Suchabfrage find Häufig möchte man nur mit einer Auswahl von Komponenten eines Vektors oder einer Matrix arbeiten. Um dies einfach zu realisieren, gibt es die vektorisierte Abfrage find“. ” find Vektorisierte Abfrage: find(Abfrage)“ liefert jene Indizes zurück, für die die vektorisierte ” Abfrage erfüllt ist. KAPITEL 4. SCHLEIFEN UND VERZWEIGUNGEN 4.2 >> >> >> >> >> >> >> 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äufen benötigt 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äge. 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ühren die Schleife solange aus, bis diese Bedingung nicht mehr erfüllt ist. 1 i = 1; 2 while (i<9.5) i = i+pi; 3 fprintf(0 i hat jetzt den Wert i = %f \n0 ,i); 4 5 end; 6 Wie bereits erwähnt, wird jede von 0 verschiedene Zahl als wahr interpretiert. Somit repräsentiert die nachfolgende Schleife eine Endlosschleife mit einer inneren Abbruchbedingung. 1 i = 0; 2 while 1 i = i+pi; 3 27 KAPITEL 4. SCHLEIFEN UND VERZWEIGUNGEN 4 5 6 7 8 9 10 11 12 13 if and( i<10*pi, i>pi ) fprintf( 0 Wir machen nix\n0 ); continue end; fprintf( 0 i hat jetzt den Wert i = %f \n0 ,i); if (i>20*pi) break; end; end; break sofortiger Abbruch einer Schleife: Dieser Schleife, d.h. der Rest des Schleifenrumpfes noch einmal ausgeführt. Sind zwei Schleifen bricht der Befehl nur die innere Schleife ab, zur Ausführung kommt. Befehl führt zur sofortigen Beendigung einer wie auch die Abbruchbedingung werden nicht verschachtelt (eine äußere und eine innere), so sofern der break-Befehl in der inneren Schleife continue Sprung zum Schleifenbeginn: Der verbleibende Schleifenrumpf wird für diesen Durchgang durch die Schleife ignoriert und die Schleife fährt 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ät 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 <= 20) for i=1:j 3 A(i,j) = i b2+j b2-(i*j); 4 end 5 j = j+1; 6 7 end 8 4.3 Aufgaben Aufgabe 4.1 Bearbeiten Sie nochmals diesen Abschnitt und führen Sie obige Skripte aus. Aufgabe 4.2 Schreiben Sie eine Funktion fibonacci“. Diese Funktion soll eine Eingangsvariable ” haben und alle Fibonacci Zahlen bis zu dieser Zahl ausgeben. Geben Sie nun folgende Befehle im Command-Fenster ein: fibonacci(3)“ und fibonacci(41.2)“. ” ” Aufgabe 4.3 Schreiben Sie eine eigene Funktion fakultaet“. Diese soll für ” Wert n! liefern. Geben Sie nun folgende Befehle im Command-Fenster ein: fakultaet(9.1)“. ” fakultaet(n)“ den ” fakultaet(7)“ und ” Aufgabe 4.4 Schreiben Sie eine Funktion euklid“, die den größten gemeinsamen Teiler zweier ” Zahlen findet. Geben Sie nun folgende Befehle im Kommando-Fenster ein: euklid(12,8)“ und ” euklid(27,34)“. ” Kapitel 5 Weitere Datentypen Aufgrund der automatischen Typkonvertierung sind Unterschiede zwischen den meisten Datentypen von geringer Bedeutung. Genauere Informationen zu den verschiedenen Datentypen sind mit help datatypes“ erhältlich. ” Von den vier wesentlichen Datentypen haben wir bisher nur den Datentyp Matrix besprochen. Hier wenden wir uns nun den Datentypen Zeichenkette, Struktur und Block zu. 5.1 Zeichenkette (string) Eine Zeichenkette ist eine beliebige Folge von Buchstaben, Zahlen und anderen Zeichen, allgemein als char bezeichnet, eingeschlossen von einem Paar einfacher Anführungszeichen (Hochkomma), 0 “, z.B. 0 hello 0“. Einer Deklaration einer Variablen als string bedarf es nicht, da Matlab die ” ” Typkonvertierung automatisch vornimmt. Zunächst einige Beispiele. >> 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öscht. Der frühere 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ügt. Man kann also später 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ücken am Anfang der Zeile ist nicht wirklich signifikant. Mit dem Befehl ischar(C)“ ” können wir uns aber Sicherheit verschaffen. Falls ischar(C)“ den Wert 1 zurückliefert, ist C ” eine Zeichenkette, andernfalls nicht. Während 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önnen 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 über einen Namen und einen Wert verfügen. Dabei ist der Datentyp des Wertes beliebig und die Komponenten können 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ügung: struct(. . . ) Anlegen einer Struktur: Am besten schaut man sich obiges Beispiel und die Erklärung unter help struct“ an. ” 0 isfield(S, name 0 ) Existenztest für Strukturkomponente: Testet ob name der Name einer Komponente der Struktur S ist. S=getfield(S,0 name0 ) Wertabruf: ist eine äquivalente Form zu S.name“. ” 0 0 S=setfield(S, name ,wert) Wertzuweisung: ist eine äquivalente Form zu S.name=wert“. ” 0 0 0 S=rmfield(S, name ) Komponenten löschen: Löscht 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öcke sind beliebig-dimensionale Gebilde, die Variablen beliebigen Datentyps als Elemente besitzen. Im Nachfolgenden beschränken wir uns auf ein- und zwei-dimensionale Blöcke. Dieser Datentyp erlaubt auch Mengenoperationen. Starten wir zuerst mit einigen Beispielen für 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öcke, cells: Die geschweiften Klammern definieren einen Block. Das Format von Blöcken wird wie bei Matrizen automatisch von Matlab festgestellt, dabei werden zwei Einträge 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önnen mittels der geschweiften Klammern maximal zweidimensionale Blöcke definiert werden. Um höher-dimensionale Blöcke 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öcke: Der Zugriff auf einen einzelnen Block oder mehrere Blöcke 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ür 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üssen alle Blockeinträge vom Typ Zeichenkette (string) sein. So kann mit unique aus einem Block eine Menge erzeugt werden (Mehrfachnennungen werden gestrichen und die Einträge 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ätzlich gibt es den Befehl ismember(a,A), der den Wert 1, falls a ∈ A ist, und sonst den Wert 0 zurückgibt. >> 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ür kompliziertere algebraische Rechnungen kann teilweise noch Maple verwendet werden. Für 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ügung stehen. Mittels help strfun“ kann man einen guten Überblick über diese Funktionen erhalten. Im ” Nachfolgenden werden einige vorgestellt. Um interaktive Matlab-Routinen zu schreiben, sind die Funktionen input“ und fprintf“ nützlich. ” ” 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 übergebenen Text aus und wartet auf die Eingabe einer Variablen beliebigen Typs. Das Betätigen 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öffnet wurde. Der ” Formatstring besteht aus beliebigem Text, gespickt mit Formatanweisungen \t \n Tabulator Zeilenumbruch und Platzhaltern für Variablen: KAPITEL 5. WEITERE DATENTYPEN %d %f %e %s 32 ganze Zahl Gleitpunktzahl Gleitpunktzahl in exponentieller Schreibweise Zeichenkette Für 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ückgabewert zur Verfügung steht. Siehe Skript für 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ändigen Überblick 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öcken Wir haben bereits gezeigt, wie man Blöcke anlegt und wie man auf einzelne Elemente und ihre Inhalte zugreift. Im Nachfolgenden einige weitere Befehle zum Arbeiten mit Blöcken. cell(. . .) erzeugt einen oder mehrere Blöcke. Formal gibt es keinen Grund weswegen die Befehle struct“ und cell“ nicht geschachtelt werden sollten, aber es können ungewollte Effekte ” ” auftreten. cellplot(B) erzeugt eine graphische Übersicht ü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 älteren Versionen zur Verfügung.) iscell(B) testet, ob B vom Typ Block ist; falls ja, wird der Wert 1, sonst der Wert 0 zurückgeliefert. 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ägen vom Typ Struktur. Jede Struktur hat die Komponenten Ort (Zeichenkette), Temperatur (Zahl) und Niederschlag (Zahl). Die Funktion soll für 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ühren Sie W etteransage(W etter) aus. Niederschlag in ml 0 3 0 10 1 0 Kapitel 6 Speichern und Lesen von Datensätzen Vorsicht: Es lassen sich sehr leicht riesige Datensätze mit Matlab erzeugen. Diese Datensätze unbedacht zu speichern, wird den Ihnen zur Verfügung stehenden Speicherplatz sehr schnell füllen!! 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ätzen 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 DATENSÄTZEN >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> 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öchte, empfiehlt sich eine formatierte Ausgabe. Dazu benötigt man die folgenden Befehle fopen Öffnen und Anlegen von Dateien: Der Befehl fopen(0 name0 ,0 action0 )“ öffnet eine Datei mit ” dem Namen name zum Lesen, falls action = r oder zum Schreiben falls action = w+. Für 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ärdatei 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ält homogene Daten,0 ); >> fprintf(fid,0 die auch mittels load gelsen werden können\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 DATENSÄTZEN 6.2.2 36 Einlesen von der Tastatur Hierzu existiert der input“-Befehl. Allerdings ist diese Variante unpraktisch bei größeren Daten” mengen und lässt 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ühren 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über 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) >> Die Datei pores 1.mtx steht auf der Homepage des Kurses unter Material zur Verfügung und 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önnen beliebige Daten geladen werden, doch um ” ” diese entsprechend interpretieren zu können benötigt 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ügung. Die Syntax ist ähnlich 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 DATENSÄTZEN 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äufig auftretendes Problem. Leider gibt es nur für wenige Datenbanken eine gute Unterstützung 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 ausführliches Beispiel Zur Dokumentation von Ergebnissen werden häufig Testdaten tabelliert in ein Textdokument eingefügt. Falls nun der Text in LATEX erstellt wird, ist das Einfügen von Tabellen etwas mühsam. 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örige 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ür die Zahl der Datenspalten und muß für Tabellen mit anderer Spaltenzahl dementsprechend angepasst werden. 1 function [ ] = latextab(fn,Daten) KAPITEL 6. SPEICHERN UND LESEN VON DATENSÄTZEN 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<3) fprintf(0 Fehler beim Oeffnen der Datei\n0 ); return; end; [zeilen,spalten] = size(Daten.tab); fprintf(fid,0 \\begin {tabular}{|l| ∗ {%d}{c|}\\\\ \\hline \n0 ,spalten); for i=1:spalten fprintf(fid,0 & %s\n0 ,Daten.SpTitel(i)); end; fprintf(fid,0 \n0 ); for i=1:zeilen for j=1:spalten fprintf(fid,0 & %d 0 ,Daten.Inhalt(i,j)); end; fprintf(fid,0 \\\\ \\hline \n0 ); end; fclose(fid); Aufgaben Aufgabe 6.1 Arbeiten Sie dieses Kapitel nochmals sorgfältig durch und führen Sie die Kommandos aus. Aufgabe 6.2 Laden Sie das File pores 1.mtx mit dem Befehl load“ und einmal mit fid=fopen ” ” ...“ wie in obigem Skript. Wie unterscheiden sich text und pores 1? (Verwenden sie den Befehl size“ und schauen Sie sich speziell die ersten Zeilen an.) ” Aufgabe 6.3 2 Legen Sie mit den folgenden Befehlen die Struktur woerter“ an: ” 0 0 >> 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örter 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ält die Zeichen und Zeichenketten, die als Trennzeichen zweier Teilstücke gelten. Die einzelnen Teilstücke werden als jeweils eine Zeile in die Datei Ausgang geschrieben. 2 Diese Aufgabe stammt von Soeren Herbert. KAPITEL 6. SPEICHERN UND LESEN VON DATENSÄTZEN 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 öffnen 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 Übersicht 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önnen. Viele dieser Befehle haben eine ähnliche Arbeitsweise, die wir nachfolgend am plot“-Befehl vorstellen werden. Zuerst ein (nicht vollständiger) Überblick über die zur Verfügung ” stehenden grundlegenden Graphikbefehle. Graph logarithmisch skalierter Graph Stabdiagramm Diagramm Höhenlinien Oberfläche 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 Öffnen und Aktivieren eines Graphikfensters: Graphikfenster erhalten in Matlab eine Zahl statt einem Namen. Ferner gibt es keine Beschränkung der Anzahl der Graphikfenster, die geöffnet werden können. Etwaige Beschränkungen kommen vom Betriebssystem. Falls das Fenster ’Figure No 3’ noch nicht existiert, wird es durch den Aufruf figure(3)“ als leeres ” Fenster erzeugt. Unabhängig 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 Überblick 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önnen. 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öscht und anschließend die neue gezeichnet. Mittels hold on“ kann das Löschen bis zum ” nächsten hold off“ oder bis zum nächsten 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ügt. clf Löschen: Löscht 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üsteuerung im Graphik Fenster eingetragen wurden. axis Bildausschnitt: Ermöglicht 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äteren Betrachter wissen zu lassen, was die Bedeutung der einzelnen Kurven ist. legend(string1,string2,. . . ,stringk,zahl)“ erzeugt eine Zeichenerklärung für 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äß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 Überschrift. xlabel Achsenbeschriftung: Erzeugt eine Beschriftung der x-Achse und kann für zwei- und dreidimensionale Darstellungen verwendet werden. ylabel Achsenbeschriftung: Erzeugt eine Beschriftung der y-Achse und kann für zwei- und dreidimensionale Darstellungen verwendet werden. zlabel Achsenbeschriftung: Erzeugt eine Beschriftung der z-Achse in drei-dimensionalen Darstellungen. text Beschriftung: Erlaubt zusätzliche Beschriftungen in der Zeichnung wie auch außerhalb. Vielleicht etwas unbequemer als das Zeichnen von Hand, aber dafür 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öhenlinien, Zahlwerte durch Farbwerte identifiziert werden. colormap Farbskalierung: Erlaubt die Änderung der automatischen Farbeinteilung. colormenu Farbsteuerung: Stellt im Graphik-Fenster ein weiteres Menü zur Einstellung von Farben zur Verfügung. shading Schattierung: Ermöglicht eine Änderung 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ängt der Effekt des plot“-Befehls von der Anzahl der ” übergebenen Parameter und deren Format ab. 7.2.1 plot mit einem Argument Der Aufruf von plot“ öffnet 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ücken 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ält 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ün schwarz r g k zur Verfügung. Bei den Linientypen gibt es außer durchgezogene Linie gestrichelte Linie Sternchen an Datenpunkten Kreise an Datenpunkten -* o noch weitere Möglichkeiten, siehe help plot“. ” gepunktete Linie strichpunktierte Linie Punkte an Datenpunkten : -. . KAPITEL 7. GRAPHIK 7.2.3 43 Ein ausfü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ählten 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öße und die Punkte werden geradlining verbunden. 7.3 Für Fortgeschrittene Falls mehrere Graphiken hintereinander gezeigt werden sollen, ist es sinnvoll, dem Betrachter ein wenig Zeit dafür 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äglich ” 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ür die Möglichkeiten 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ürfen 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äche 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ün 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ür diese Gremienwahl gilt eine 5% Hürde. Wieviel Prozent haben die einzelnen Parteien errungen? Stellen Sie das Ergebnis in dem dafür typischen Säulendiagramm dar. Wie sieht die Sitzverteilung des 72 Mitglieder umfassenden Gremiums aus? Stellen Sie das Ergebnis in den dafür 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ührt. 8.1 8.1.1 Gewöhnliche 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ührt. 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 über 40 verschiedene Sondermatrizen, wie z.B: Toeplitz- und Ris-Matrizen. Die ” zugehörige Hilfe kann mit dem Befehl private“ aktiviert werden. ” 8.1.2 Rechnen mit Matrizen Zur Wiederholung nochmals die Rechenoperationen, die für Matrizen zur Verfügung stehen, sowie einige weitere spezielle Funktionen, die nur für 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ösen von XA = B A\B Lösen 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ür 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ührlich bespro” ” chen. Nicht ganz so ausführlich aber dafür 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ückgabewerten, 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ösen von kleinst-Quadrat-Aufgaben. Zum Updaten von QR-Zerlegungen sind die Befehle qrinsert“, qrdelete“ und qrupdate“ nützlich. ” ” ” chol Cholesky-Zerlegung: Die Cholesky-Zerlegung ist ein Spezialfall der LR-Zerlegung für 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ührt. diag Diagonale: Liefert die Werte entlang der Diagonalen der Matrix bzw. nimmt einen Vektor und erzeugt die zugehörige 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önnen iterative Verfahren zum Lösen 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 Dünnbesetzte Matrizen In vielen Anwendungen kommen sehr große und dünnbesetzte 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ür 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ünnbesetzte Matrizen problemlos übertragbar, allerdings sind die Lösungsoperatoren für Gleichungen \ und / meistens nicht effizient. Zum Lösen von solchen Gleichungssystemen verwendet man statttdessen iterative Methoden. 8.2.1 Erzeugen dünnbesetzter Matrizen sparse Konvertierung von voller zu dünner 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ägen Null. Da die ” Nullen nicht gespeichert werden brauchen, wird nur das Format der Matrix gespeichert, sehr effizient. speye dünne Einheitsmatrix: Der Unterschied zwischen eye(n,m)“ und speye(n,m)“ ist nur das ” ” Speicherformat. spdiags Besetzen von Haupt- und Nebendiagonalen: Viele dünnbesetzte 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ück 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ösen von linearen Gleichungssystemen pcg Preconditioned Conjungate Gradient: Eines der besten iterativen Verfahren zum Lösen dünnbesetzer linearer Gleichungssysteme, wenn die Matrix symmetrisch positiv definit ist. cgs Conjungate Gradient Squared: Zum Lösen indefiniter nicht singulärer symmetrischer Gleichungssyteme. minres Minimum Residual: Ebenso zum Lösen indefiniter, nicht singulärer, symmetrischer Gleichungssyteme. gmres Generalized Minimum Residual: Zum Lösen beliebiger nicht singulärer 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ändig! 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ällen benötigt 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ünnbesetzten 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örige 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ösung des Ausgleichsproblem kann über 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ösung von (8.1) mittels der Normalengleichung, (8.2), und der QR-Zerlegung, (8.3), für die Matrix A und den Vektor b, die beide durch die Ausführung des Skripts kleinstquad.m erzeugt werden. Kapitel 9 Numerische Verfahren Zum numerischen Lösen von mathematischen Problemen gibt es zusätzlich zu den Standardverfahren sogenannte Toolboxen. Einen Überblick über alle Toolboxen erhält man bei Mathworks. Die meisten Bücher zu Matlab oder unter Verwendung von Matlab betrachten spezielle Anwendungsgebiete und damit spezielle Toolboxen. In diesem Kapitel beschränken wir uns auf eine Auswahl von Standardfunktionen. 9.1 Polynome Die einfachste Klasse von Funktionen sind Polynome, für die es in Matlab ein paar spezielle Hilfsmittel gibt. poly Konvertiert Nullstellen zu Koeffizienten: Für 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äge von z die Form zij = n X pk (xij )k . k=0 roots Nullstellen eines Polynoms: Für 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ür vorgegebene Datenpunkte wird ein Polynom mit spezifiziertem maximalen Rang gesucht, das den Fehler in den Datenpunkten minimiert. spline Spline-Approximation: Stückweise 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ück, 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ällen ist poly(roots(a)) ≈ a, da poly nur n Parameter hat, um n+1 Koeffizienten zu bestimmen. Es wird also ein normiertes Polynom zurückgegeben. Damit ist das resultierende Polynom korrekt bis auf einen skalaren Multiplikator. Obiges Problem ist schlecht konditioniert und führt bei einer Approximation höheren Grades zum Abbruch des Verfahrens. Um eine bessere Konditionierung zu erhalten, benutzt man, wie oben für die 4. Approximation geschehen, 3 Rückgabewerte, 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ür 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ützstellen 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ägen. randn Normalverteilte Zufallsvariablen: Wie rand“, aber jetzt standard-normalverteilte Einträge. ” 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äsentiert jede Zeile ein Zufallsexperiment und jede Spalte die Realisierungen einer Zufallsgrösse. median Median: Arbeitet wie mean“ und liefert den Median. ” Ein ausführlicheres 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ähe 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äufig 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ügung. Als Beispiel seien die beiden klassischen Varianten erwähnt. 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änge 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ässt sich die Polynommultiplikation schneller als auf dem direkten Weg lösen. >> 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öhnliche Differentialgleichungen Zum Lösen von Anfangswertaufgaben du dt = f (t, u) u(0) = u0 stehen eine Reihe von Verfahren zur Verfügung. ode113 ode23s ode15i ode23t ode15s ode45 ode23 Obige Verfahren kombinieren eine Vielzahl von numerischen Ideen, um diverse Schwierigkeiten, die beim Lösen von gewöhnlichen Differentialgleichungen auftreten können, 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ösen. Ein Beispiel 1 −0.1 1 (9.1) u u(0) = u̇ = 0 −1 −0.1 hat die Lösung 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ührlichere Beschreibung der ode-Löser kann in Higham & Higham Matlab ” guide“ gefunden werden. Zuweilen sind auch sogenannte Randwertaufgaben zu lösen, 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ückführen. Doch häufig empfiehlt ” sich ein Ansatz mittels Kollokation, siehe Quateroni/Sacco/Saleri Numerische Mathematik II“ ” bzw. Numerical Mathematics“. ” bvp4c Randwertlöser: bvp4c“ ist ein effizienter, leistungsfähiger Randwertlöser, der auf Kolloka” tion beruht. 54 KAPITEL 9. NUMERISCHE VERFAHREN 9.6 Partielle Differentialgleichungen Partielle Differentialgleichungen kommen in praktischen Problemen (Anwendungen) häufig vor, wie z.B die Wärmegleichung ∂u ∂t = ∂2u ∂x2 ∀t ∈ [t0 , T ], ∀x ∈ Ω. Je nach Form der partiellen Differentialgleichung werden noch diverse Rand- und Anfangsbedingungen benötigt. Zum Lösen 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ösung = 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öst 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änder der Differentialgleichung für 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ügen, so hat Rand die Form Rand(xa, ua, xb, ub, t) −→ pa qa pb , qb wobei pa, qa, pb und qb Skalare sind. Für Rand gilt die gleiche Einschränkung wie für die Funktion F : Sie muss in einem M-File definiert werden. 9.7 Aufgaben Aufgabe 9.1 Die Lösung 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ösungsformel (9.2) und den numerischen Löser ode45“ ” verwenden. Berechnen Sie die Lösung von (9.1) mittels der vier Methoden und vergleichen Sie die Genauigkeit und den Zeitaufwand, der bei der Berechnung entsteht. (Für die Bestimmung des Zeitaufwands sind die Befehle tic“ und toc“ hilfreich.) ” ” KAPITEL 9. NUMERISCHE VERFAHREN 55 Aufgabe 9.2 Führen 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ösung der Wärmegleichung 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ösung graphisch darzustellen. Kapitel 10 Beispiele 10.1 Zufallszahlengeneratoren In vielen praktischen Problemen sollen zufällige Ereignisse modelliert werden. Um dieses Problem am Computer zu realisieren, benötigt 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ät prüft und natürlich 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ählt, 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ächsten 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ählt, 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ät zu beurteilen, noch ein paar nützliche Werte zur Gleichverteilung: Erwartungswert 1 2 Varianz 1 12 Schiefe 0 Wölbung 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. 1 % Tester für Zufallszahlengeneratoren 2% 3 % Kennzahlen = GeneratorTest(Generator,N,K); 4 % nimmt den Generator (Funktion) und berechnet N Zufallszahlen, 5 % um mittels dieser einige Kennzahlen zu berechnen. 6 % Es wird auch eine Korrelationsanalyse durchgeführt. 7 % Dabei ist von Interesse, ob K aufeinanderfolgende Zufallszahlen 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örigen 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