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

Documents pareils