60
Programmieren mit Matlab — Eine Einf¨ uhrung — J. Berns-M¨ uller 2. Oktober 2006

Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

  • Upload
    dodang

  • View
    219

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

Programmieren mit Matlab

— Eine Einfuhrung —

J. Berns-Muller

2. Oktober 2006

Page 2: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

Inhaltsverzeichnis

1 Einfuhrung 41.1 Allgemeines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

1.1.1 Ziel des Kurses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.1.2 Was ist Matlab . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.1.3 Wieso Sie Matlab lernen sollten . . . . . . . . . . . . . . . . . . . . . . . . 41.1.4 Vorteile von Matlab . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.1.5 Andere mathematische Softwarepakete . . . . . . . . . . . . . . . . . . . . . 5

1.2 Erste Schritte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51.2.1 Starten und Beenden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51.2.2 Demo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61.2.3 Help . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

1.3 Literatur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71.4 Aufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

2 Zahlen, Vektoren und Matrizen 92.1 Grundlegendes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92.2 Definitionen von Zahlen, Vektoren und Matrizen . . . . . . . . . . . . . . . . . . . 9

2.2.1 Zahlen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92.2.2 Matrizen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102.2.3 Definition von Vektoren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

2.3 Arbeiten mit Matrizen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122.3.1 Matrix versus Vektor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

2.4 Matrix Operationen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142.4.1 Unitare Operatoren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142.4.2 Binare Operatoren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

2.5 Matrizen, Funktionen und Konstanten . . . . . . . . . . . . . . . . . . . . . . . . . 152.5.1 Konstanten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152.5.2 Trigonometrische Funktionen . . . . . . . . . . . . . . . . . . . . . . . . . . 162.5.3 Einige Standard-Funktionen . . . . . . . . . . . . . . . . . . . . . . . . . . . 162.5.4 Weitere Matrixoperationen . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

2.6 Aufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

3 Skripte, Funktionen und Debugging 183.1 Allgemeines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183.2 Editor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183.3 Ein erstes Skript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183.4 Skript fur Einsendeaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193.5 Eine erste Funktion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203.6 Einzeilige-Funktionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213.7 Unterfunktionen und Funktionen als Parameter . . . . . . . . . . . . . . . . . . . . 223.8 Fehlersuche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233.9 Aufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

1

Page 3: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

INHALTSVERZEICHNIS 2

4 Schleifen und Verzweigungen 244.1 Verzweigungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

4.1.1 if-Verzweigung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244.1.2 switch-Verzweigung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254.1.3 Die Suchabfrage find . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

4.2 Schleifen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264.2.1 Die for-Schleife . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264.2.2 Die while-Schleife . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

4.3 Aufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

5 Weitere Datentypen 285.1 Zeichenkette (string) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285.2 Struktur (struct) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295.3 Der Datentyp Block (cell) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305.4 Mengen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305.5 Arbeiten mit Zeichenketten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315.6 Arbeiten mit Blocken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325.7 Aufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

6 Speichern und Lesen von Datensatzen 346.1 Speichern und Lesen von Matlab Daten . . . . . . . . . . . . . . . . . . . . . . . . 346.2 Exportieren und Importieren von ASCII Daten . . . . . . . . . . . . . . . . . . . . 35

6.2.1 Schreiben von ASCII Daten . . . . . . . . . . . . . . . . . . . . . . . . . . . 356.2.2 Einlesen von der Tastatur . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366.2.3 Einlesen aus einer Datei . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

6.3 Importieren und Exportieren von Datenbanken . . . . . . . . . . . . . . . . . . . . 376.4 Ein ausfuhrliches Beispiel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376.5 Aufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

7 Graphik 407.1 Ubersicht . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407.2 Der plot-Befehl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

7.2.1 plot mit einem Argument . . . . . . . . . . . . . . . . . . . . . . . . . . . . 427.2.2 plot mit mehreren Argumenten . . . . . . . . . . . . . . . . . . . . . . . . . 427.2.3 Ein ausfuhrliches Beispiel . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43

7.3 Fur Fortgeschrittene . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 437.4 Images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447.5 Aufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

8 Verfahren der numerischen linearen Algebra 458.1 Gewohnliche Matrizen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

8.1.1 Erzeugen von Matrizen und Vektoren . . . . . . . . . . . . . . . . . . . . . 458.1.2 Rechnen mit Matrizen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 458.1.3 Zerlegen von Matrizen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

8.2 Dunnbesetzte Matrizen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 478.2.1 Erzeugen dunnbesetzter Matrizen . . . . . . . . . . . . . . . . . . . . . . . . 478.2.2 Iterative Verfahren zum Losen von linearen Gleichungssystemen . . . . . . 48

8.3 Aufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

9 Numerische Verfahren 509.1 Polynome . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 509.2 Quadratur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519.3 Stochastik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 529.4 Andere Funktionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 529.5 Gewohnliche Differentialgleichungen . . . . . . . . . . . . . . . . . . . . . . . . . . 53

Page 4: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

INHALTSVERZEICHNIS 3

9.6 Partielle Differentialgleichungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 549.7 Aufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

10 Beispiele 5610.1 Zufallszahlengeneratoren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

Page 5: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

Kapitel 1

Einfuhrung

1.1 Allgemeines

1.1.1 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 ver-trieben 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 18D-52064 Aachen

Phone: 024147075-0Fax: 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 numerischzu losen.

• Im Bereich der mathematischen Software-Entwicklung (Industrie und Forschung) wird Mat-

lab als Entwicklungsumgebung verwendet, um dann numerische Codes, die z.B. in Fortranoder C geschrieben werden, zu testen und zu verbessern.

• Es gibt bereits heute sehr viele Zusatzbausteine fur Matlab, um komplexe Aufgaben einfachzu losen.

1.1.4 Vorteile von Matlab

• Einfaches Programmieren

• Automatische Speicherverwaltung

4

Page 6: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

KAPITEL 1. EINFUHRUNG 5

• Automatische Typkonvertierung

• Detaillierte Fehlermeldungen

• Hohe Qualitat der implementierten Routinen

• Open Source vieler Routinen

• Vielfaltige Moglichkeiten der Visualisierung von Daten

• Einfaches Einlesen von Daten

• Routinen fur dunnbesetzte Matrizen

1.1.5 Andere mathematische Softwarepakete

Es gibt zahlreiche weitere mathematische Softwarepakete und Bibliotheken, nachfolgend eine kleineAuswahl:

maple Computeralgebra-System, speziell fur Funktional-Analysis

gap Computeralgebra-System fur Experten, speziell fur Algebra

femlab Finite Elemente Software Paket zum numerischen Losen von partiellen Differentialglei-chungen

LAPACK numerische Verfahren der linearen Algebra (direkte Methoden)

SCALAPACK numerische Verfahren der linearen Algebra fur großere Probleme (direkte Metho-den)

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 Erste Schritte

1.2.1 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“ benotigt eine Java-Umgebung und liefert dafur die

volle Matlab-Entwicklungsumgebung. Fur Fortgeschrittene und falls die Java-Umgebung Schwie-rigkeiten 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 druckt die [Return]-

Taste.

Page 7: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

KAPITEL 1. EINFUHRUNG 6

1.2.2 Demo

Das Starten von Matlab kann je nach Betriebssystem auf verschiedene Weise erfolgen und dau-ert in der Regel einige Sekunden. Zum Beispiel ist auf Linux/Unix Systemen der Aufruf matlabausreichend. Matlab offnet dann ein kleines Fenster mit einem Logo, bevor es das eigentlicheHauptfenster mit einigen Unterfenstern offnet. Viele der standardmaßig geoffneten Unterfenstersind eher storend. Um eine bessere Ubersicht zu erlangen, schließen Sie folgende Unterfenster inbeliebiger Reihenfolge, sofern diese offen sind:

• Workspace

• Current Directory

• Command History

• Help

• Profiler

Nun sollten Sie nur noch ein Fenster offen haben, das eine Begrußung enthalt und einenMatlab-Prompt (Eingabe-Aufforderung).

>>

Geben Sie nun in diese Zeile∣∣∣ >> demo∣∣∣ >>

ein und beenden Sie die Zeile mit der [Return]-Taste (erst durch das Betatigen der Returntaste wirdMatlab aufgefordert, diese Zeile zu bearbeiten). Mit dem Einrucken und der senkrechten Liniemachen wir Matlab-Code deutlich, wie er im Command-Fenster eingegeben wird, gelegentlichauch 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 aufgefuhrten Stichwortern gibt es weitere Informationen. Geben Sie zum Beispiel∣∣∣ >> help general∣∣∣ >>

ein.Matlab verfugt uber viele Hilfestellungen. Zum einen eine ausfuhrliche online-Dokumentation,

viele Informationen in den Hilfstexten (”help“), zahlreiche Beispiele (

”demos“) und haufig ist der

Programmcode frei zuganglich (”type“). Ferner gibt es viele Hilfefunktionen, die in Matlab im-

plementiert sind.

Page 8: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

KAPITEL 1. EINFUHRUNG 7

1.3 Literatur

Da die in Matlab integrierten Hilfefunktionen sehr ausfuhrlich sind, sollte dieses Tutorial alsEinstieg genugen. Dennoch geben wir hier eine kurze Auswahl an Hilfen zum Arbeiten mit Matlab.

Fur Anfanger sind die Bucher

Rudra Pratap Getting Started with Matlab (Oxford)

Duane Hanselman & Bruce Littlefield Mastering Matlab (Prentice Hall)

geeignet.

Fur 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

gehort, empfohlen.

Allgemeine Lernhilfen zum Programmieren fur Einsteiger

Klaus Menzel Algorithmen. Vom Problem zum Programm. (Teubner)

1.4 Aufgaben

Nachfolgende Aufgaben sollen Ihnen die Arbeitsweise von Matlab etwas naherbringen, also nichtverzweifeln 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 KommandoFenster. Fuhren Sie nun den Befehl

”help help“ aus.

Aufgabe 1.2 Geben Sie im Kommando-Fenster die Befehle”clear“ und

”area = pi*r 2“ ein.

(Der zweite Befehl sollte zu einer Fehlermeldung fuhren.) Nun geben Sie die Befehle∣∣∣ >> r=2;∣∣∣ >> area = pi*r2∣∣∣ >> area∣∣∣ >> area = @(r) pi*r 2∣∣∣ >> area(2)∣∣∣ >> area(3)∣∣∣ >>

ein.

Aufgabe 1.3 Testen Sie das Demo zum”Traveling Salesman“-Problem,

”travel“ und lesen Sie

sich die zugehorige Hilfe,”help travel“, durch. Den Code kann man sich mit

”type travel“ an-

schauen.

Aufgabe 1.4 Geben Sie den Befehl”help“ und anschließend den Befehl

”help ops“ ein. (Auf

diese Weise kann man sich sehr viele Hilfen und Ubersichten anschauen, eine Alternative ist dasdemo-Paket.)

Page 9: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

KAPITEL 1. EINFUHRUNG 8

Aufgabe 1.5 Selbst schwierigere Aufgaben sind leicht zu losen, z.B. das Losen eines Anfangs-wertproblems.

Gegeben sei das Anfangswertproblem

(d

dt

)2

x(t) = −x(t) x(0) = 1,

welches die Cosinusfunktion als Losung hat.Mit dem nachfolgenden Code wird eine numerische Losung berechnet und graphisch dargestellt.

Der letzte Befehl bewirkt die graphische Darstellung der Abweichung der numerischen von derexakten Losung.

∣∣∣ >> 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 Kurze selber konnen.)

Page 10: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

Kapitel 2

Zahlen, Vektoren und Matrizen

2.1 Grundlegendes

Da Matlab automatisch Datentypen anpasst, benotigt man gewohnlich nicht mehr als die grund-legenden Datentypen:

matrix, string, cell, struct.Dabei ist der Datentyp matrix der wichtigste Datentyp.

Jede Zahl wird als eine 1 × 1 Matrix,jeder Zeilenvektor der Lange n als eine 1 × n Matrix undjeder Spaltenvektor der Lange 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 sinddie Werte Inf (infinity = unendlich) und NaN (not a number = keine Zahl) als Zahlen zugelassen.Dabei ist aber zu beachten, dass Matlab damit nur eingeschrankt rechnen kann.

Da Matrizen so wichtig sind im Umgang mit Matlab, werden wir uns im Folgenden sehrintensiv mit Matrizen beschaftigen. Zuerst betrachten wir zahlreiche Moglichkeiten, eine Matrixzu definieren und anschließend mit ihr zu arbeiten.

Eine umfassende Ubersicht aller Datentypen erhalt man mit∣∣∣ >> help datatypes∣∣∣ >>

Die weiteren wesentlichen Datentypen werden in Kapitel 5 vorgestellt.

2.2 Definitionen von Zahlen, Vektoren und Matrizen

2.2.1 Zahlen∣∣∣ >> a=1∣∣∣ >>

Mit dem Einrucken und der senkrechten Linie machen wir Matlab-Code, wie er im Command-Fenster eingegeben wird, und gelegentlich auch seine Wirkung deutlich. Dabei bezeichnen wir dasZeichen >> am Zeilenanfang als Matlab-Prompt.

a Name der neuen/veranderten Variablen: Um das Ergebnis einer Rechnung zu speichern, kanndurch name = der Variablen

”name“ ein Wert zugewiesen werden. Matlab erlaubt kompli-

ziertere Zuweisungen, wir werden spater noch einige Beispiele kennenlernen.

9

Page 11: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

KAPITEL 2. ZAHLEN, VEKTOREN UND MATRIZEN 10

Namen von Variablen mussen mit einem Buchstaben beginnen, der durch eine beliebigeFolge von Buchstaben und Zahlen sowie dem Unterstrich,

”“, gefolgt werden kann. Generell

unterscheidet Matlab zwischen Groß- und Kleinschreibung. (Einschrankung fur Windows-

Systeme 2000 und abwarts: 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 einfachesGleichheitszeichen als Zuweisungsoperator. (Der binare Operator, der zur Uberprufung der Gleich-

heit 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 expliziteKonvertierungen 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 Zahlmit Realteil eins und Imaginarteil zwei dargestellt werden. Matlab erkennt automatisch,dass die Eintrage komplexwertig sind und passt die interne Zahlendarstellung an. Simultanandert 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 haufig als Laufvariablen benutzt werden, empfiehlt sich diezweite Notation nicht!

(Man kann Matlab-Befehle und Variablen uberschreiben, indem man einer Variablen etc. diesen Na-

men gibt und der Variablen einen Wert zuweist. Um die ursprungliche Bedeutung des Matlab-Befehls

wiederherzustellen, muss die eigene Variable geloscht 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 Große derMatrix wird automatisch anhand der Eintrage 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 spater eine Verwendung fur eine leere Matrix sehen.Kommas,

”,“, trennen zwei Eintrage, die in der gleichen Zeile stehen, und Semikolons,

”;“,

trennen zwei Zeilen voneinander. Es ist darauf zu achten, dass die Anzahl der Elemente furalle Zeilen gleich ist. Sonst erscheint eine Fehlermeldung und die Zuweisung erfolgt nicht. Imobigen Beispiel haben wir also eine 4 × 3 Matrix mit den Eintragen von 1 bis 12 definiert.

Page 12: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

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 unterdruckt es die Ausgabe. DieAusfuhrung erfolgt nach Beendigung der Zeile durch die [Return]-Taste. Alternativ kanndas Semikolon weggelassen werden, dann entspricht das Betatigen der [Return]-Taste demBefehlsende, aber die Ausgabe wird nicht unterdruckt.

Wenn wir uns den Wert einer Variablen anschauen wollen, z.B. den Inhalt der Matrix A, sogeben wir einfach den Namen ein und drucken [Return].

∣∣∣ >> A∣∣∣ ans =∣∣∣ 1 2 3∣∣∣ 4 5 6∣∣∣ 7 8 9∣∣∣ 10 11 12∣∣∣ >>

Das Ausgabeformat hangt im Wesentlichen von vier Faktoren ab: vom Format der Zahlendar-stellung, vom Format der Matrix, von dem zur Verfugung stehenden Platz und, ob die Zahlen reelloder komplex sind. Das Zahlenformat kann durch die format-Anweisung geandert werden, naheressiehe

”help format“.

Die Anderung des Formats hat keinen Einfluss auf die Rechengenauigkeit. (Mehr zu diesem

Thema in der Vorlesung”Einfuhrung in die numerische Mathematik“.)

Es gibt viele weitere Moglichkeiten, eine Matrix zu definieren. Zuerst loschen wir die Matrix A∣∣∣ >> clear A∣∣∣ >>

nun konnen wir andere Varianten testen∣∣∣ >> A=[1,2,3;...∣∣∣ 4,5,6;...∣∣∣ 7,8,9;...∣∣∣ 10,11,12];∣∣∣ >>

Diese Definition der Matrix ist aquivalent zur ursprunglichen Definition, aber viel ubersichtlicher.

... Befehlsfortsetzung: Der dreifache Punkt erlaubt eine saubere Notation, die dem spateren Leserhilft. Wird der dreifache Punkt von einem Return oder einem anderen Zeichen gefolgt, sowerden 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];

Page 13: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

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 Moglichkeiten. Hier sollten nur einige Ideen vorgestellt werden. Der BefehlA = [ ] definiert die Variable A, somit kann in der nachfolgenden Zeile auf A zugegriffen werden. Diezuletzt vorgefuhrte Variante nutzt aus, dass Matlab die Großenanpassung automatisch vornimmt,nicht definierte Eintrage werden auf 0 gesetzt.

Matrixeintrage mussen 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 Eintragen a, a + 1, a +2, . . . , a+ k, wobei k die großte ganze Zahl kleiner gleich b−a ist. Falls a und b ganze Zahlensind, so ist

”a:b“ ein Vektor, der als Indexvektor fur eine Matrix benutzt werden kann.

Die Anweisung”a:b:c“ erzeugt einen Vektor mit den Eintragen 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);∣∣∣ >>

Page 14: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

KAPITEL 2. ZAHLEN, VEKTOREN UND MATRIZEN 13

oder auf eine Untermatrix∣∣∣ >> B=A(1:3,2:3);∣∣∣ >>

(Die hier verwandte Großschreibung von Namen fur Matrizen und die Kleinschreibung von Namen fur

Zahlen und Vektoren ist in der numerischen Algebra ublich. Sie dient vor allem dem schnelleren Verstandnis

der einzelnen Operationen.)

2.3.1 Matrix versus Vektor

Intern werden Matrizen linear gespeichert, d.h. fur eine n×k Matrix werden alle Eintrage von 1 bisn · k indiziert, dieser Index wird nachfolgend als Gesamtindex bezeichnet. Zur Veranschaulichungdefinieren wir eine Matrix und weisen jedem Element den entsprechenden Indexwert zu

∣∣∣ >> A = zeros(3,4);∣∣∣ >> [1:12]∣∣∣ >> A(:) = [1:12]∣∣∣ >> A(5:9)∣∣∣ >>

Fur die Umrechnung von den Indices i, j auf den Gesamtindex gibt es die Funktion”sub2ind“

und fur die Umkehrung die Funktion”ind2sub“.

Seien I und J Index-Mengen (das bedeutet, ihre Werte sind positive ganze Zahlen, hier zwischen1 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 konnen, benotigen wir entwedereine k × 1 Liste, die den Gesamtindex der jeweiligen Elemente beinhaltet, oder wir benotigen denBefehl

”sub2ind“ und eine k × 2 Matrix, die je Zeile den Zeilen- und Spaltenindex des jeweiligen

Matrixelements enthalt.(In einigen fruheren Varianten von Matlab funktionierten auch einige weitere

”Blockabfragen“.)

Ahnlich wie beim Zugriff auf Elemente einer Matrix, kann man einzelne Elemente einer Matrixandern. ∣∣∣ >> A(4,1)=0;∣∣∣ >> A(3,2)=-1;∣∣∣ >>

Man kann auch mehrere Eintrage einer Matrix simultan andern.∣∣∣ >> A(1,:)=2+A(1,:);∣∣∣ >> A(2:3,1:2)=[15,16;-1,-2];∣∣∣ >>

Diese simultanen Anderungen sind sehr effektiv, sie werden schneller ausgefuhrt, als wenn dieAnderungen durch einzelne Ausfuhrungen erfolgen.

Falls eine Zahl zu/von einem Vektor oder einer Matrix addiert/subtrahiert wird, wird die Zahlals ein Vektor bzw. eine Matrix der gleichen Große betrachtet mit allen Eintragen gleich der Zahl,die Anweisung

”2+A(1,:)“ kann also durch

”2*[1,1,1]+A(1,:)“ ersetzt werden. Allerdings benotigt

man im ersten Fall keine Informationen uber die Große von A. Zudem ist die erste Variante schonerund schneller.

Page 15: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

KAPITEL 2. ZAHLEN, VEKTOREN UND MATRIZEN 14

2.4 Matrix Operationen

Haufig wird zwischen unitaren und binaren Operatoren unterschieden. Der Unterschied ist, obein Operator sich nur auf eine Variable bezieht oder zwei Variablen miteinander mathematischverbindet. So ist die Transposition eines Vektors oder einer Matrix eine unitare Operation und dieAddition zweier Matrizen eine binare Operation.

2.4.1 Unitare Operatoren

Betrachten wir zunachst die drei unitaren Operatoren.

- Negation:”B=−A“ negiert den Wert in A und weist ihn B zu.

.′ Transposition:”B = A.′“ weist B den Wert der transponierten Matrix von A zu.

′ Transposition und komplexe Konjugation:”B=A′“ 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 = A′∣∣∣ >> C = A.′∣∣∣ >> A(1, 1) = 1 + 2i∣∣∣ >> D = A′∣∣∣ >> E = A.′∣∣∣ >> F=−A∣∣∣ >>

Wahrend B und C identisch sind, unterscheiden sich die Matrizen D und E im (1, 1) Element.(Die Verwendung von ′ hilft haufig, numerische Verfahren sowohl auf reelle Matrizen, wie auch auf

komplexe Matrizen anwenden zu konnen.)

2.4.2 Binare Operatoren

Bei den binaren Operatoren gibt es die Operationen aus der linearen Algebra, wie auch einigezusatzliche, die elementweise agieren bzw. lineare Gleichungssysteme losen.

∣∣∣ >> B = A + A;∣∣∣ >> C = A′ ∗ A;∣∣∣ >> D = B − A;∣∣∣ >> a = [1 : 4];∣∣∣ >> E = a′ ∗ a;∣∣∣ >> f = a ∗ a′;∣∣∣ >> G = C 2∣∣∣ >>

Zusatzlich ist auch∣∣∣ >> b = 2;∣∣∣ >> d = A/b;∣∣∣ >>

erlaubt, wobei darauf zu achten ist, dass b eine Zahl ungleich Null (also eine 1 × 1 Matrix) odereine passende nichtsingulare Matrix ist.

Wie bereits erwahnt, kennt Matlab weitere Operatoren, die elementweise angewandt werden.

Page 16: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

KAPITEL 2. ZAHLEN, VEKTOREN UND MATRIZEN 15

∣∣∣ >> B = A. 2;∣∣∣ >> B = A./A;∣∣∣ >> C = A. ∗ A;∣∣∣ >>

Eine weitere Besonderheit von Matlab sind die Losungsoperatoren”\“ und

”/“ fur 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 Losung x mit x = A\b.

∣∣∣ >> b = [1 : 4]′;∣∣∣ >> 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 grundsatzlich das Zeilenende.∣∣∣ >>∣∣∣ >> % Probe∣∣∣ >> A ∗ x − b∣∣∣ >> y ∗ A − c∣∣∣ >>

Dabei ist darauf zu achten, dass die Matrix invertierbar ist. Andernfalls erhalt man statt einerLosung eine Fehlermeldung.

(Die Ausfuhrung 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 konnen sowohl mit Zahlen als auch mit Vektorenund Matrizen ausgefuhrt werden. Naheres wird in der Regel in den Hilfsinformationen zu denjeweiligen Funktionen bzw. Operationen erklart.

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:

Große Befehl Wertπ pi 3.1415. . .e exp(1) 2.7182. . .

Maschinengenauigkeit eps 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”Einfuhrung in die numerische Mathematik“.)

Page 17: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

KAPITEL 2. ZAHLEN, VEKTOREN UND MATRIZEN 16

2.5.2 Trigonometrische Funktionen

Matlab hat trigonometrische Funktionen, die bzgl. des Bogenmaßes rechnen:

sin cos tan cotasin acos atan acotsinh cosh tanh cothasinh acosh atanh acoth

und trigonometrische Funktionen, die bzgl. 360 Grad rechnen:

sind cosd tand cotdasind acosd atand acotd

Fur große Argumente sind die Funktionen bzgl. des Winkels in Grad genauer, da sie den Einflussvon Rundungsfehlern reduzieren.

∣∣∣ >> sin(pi)∣∣∣ >> 3e12 - 3*10 12∣∣∣ >> 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) naturlicher Logarithmus

log2(a) Logarithmus zur Basis 2 log10(a) dekadischer Logarithmus

real(a) Realteil imag(a) Imaginarteil

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 ′fro′ fur p erlaubt.

2.5.4 Weitere Matrixoperationen

Nachfolgende Befehle andern die Anordnung der Matrix

fliplr Spaltenpermutation flipud Zeilenpermutationrot90 Drehung der Matrix permute Permutation der Dimensionenipermute Umkehrung von

”permute“ reshape Andern des Matrixformats

(Die Befehle”permute“ und

”ipermute“ sind keine gewohnlichen 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 dieResultate sorgfaltig!

Aufgabe 2.2 Berechnen Sie den Quotienten von 1 + 3i und 1 − 2i.

Aufgabe 2.3 Berechnen Sie den Wert√

17−5

e3−5.

Page 18: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

KAPITEL 2. ZAHLEN, VEKTOREN UND MATRIZEN 17

Aufgabe 2.4 Berechnen Sie die Losung des lineaen Gleichungssystems

1 2 1 02 3 2 11 2 4 20 1 2 3

x =

1111

Aufgabe 2.5 Zeichnen Sie die Sinus-Funktion fur Werte x zwischen 0 und 2π. (Verwenden Siezum 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 Eintragen 0 und 1 an, indem Sie die Funktionen

”zeros“ und

”ones“ verwenden. Kontrollieren Sie die Groß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 zufalligen Ele-menten. Die Matrix C sei eine 10 × 9 Matrix, bei der die ersten drei Spalten mit denen von Aubereinstimmen. Alle anderen Spalten stammen von B, wobei die Elemente der letzten beiden Zei-len von B ignoriert werden. Schließlich konstruieren Sie die Matrix D, eine 10× 6 Matrix, bei deralle 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)“.

Page 19: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

Kapitel 3

Skripte, Funktionen undDebugging

3.1 Allgemeines

Skripte und Funktionen werden dazu verwendet, großere Anweisungsabschnitte wiederverwendbarzu machen. Sie erlauben auch eine bessere Behandlung von Programmierfehlern. Der wesentli-che Unterschied zwischen Skripten und Funktionen liegt in der Verwendung von Variablen. EineFunktion arbeitet mit lokalen Variablen, die mit Ausnahme der zuruckgelieferten Variablen beiBeendigung der Funktion geloscht werden. Ferner kennt die Funktion nur solche Variablen, dieinnerhalb der Funktion definiert wurden. Im Gegensatz dazu arbeitet ein Skript mit globalen Va-riablen; also alle Variablen, die vor dem Aufruf des Skripts definiert waren, konnen im Skriptbenutzt und verandert werden und alle Variablen, die wahrend des Skripts bekannt sind, stehenauch nach Beendigung des Skripts noch zur Verfugung. Dies beinhaltet auch das Uberschreibenvon Variablen, die vielleicht nochmals verwendet werden sollten. Daher ist das Programmieren vonFunktionen sehr zu empfehlen.

3.2 Editor

Falls der Editor nicht geoffnet ist, kann man den Editor uber das File-Menu offnen (”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 ausfuhrbares 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

Page 20: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

KAPITEL 3. SKRIPTE, FUNKTIONEN UND DEBUGGING 19

1∣∣∣ display(′Ein erstes Skript′);

2∣∣∣ clear

3∣∣∣ who

4∣∣∣ A = [1, 2, 3; 4, 5, 6]

5∣∣∣ who

6∣∣∣

und speichern dieses Skript als Skript1.m ab, indem wir im Editor den Menupunkt”File→Save as“

verwenden. Anschließend geben wir im Command-Fenster∣∣∣ >> A = [7]∣∣∣ >> B = 1∣∣∣ >> Skript1∣∣∣ >> A∣∣∣ >> B∣∣∣ >>

ein. Wahrend das Skript als Skript1.m gespeichert wurde, erfolgt der Aufruf nur als”Skript1“

(hatten wir das Skript als Hans Wurst.m gespeichert, wurde der Aufruf als”Hans Wurst“ erfolgen).

Dies gilt ebenso fur 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 praziser

Schlagworter anzugeben, was die Funktion bzw. das Skript bewirkt. Die erste Zeile wird deshalbauch als H1-Zeile bezeichnet und dient als Suchindex fur die Funktion

”lookfor“. Des Weiteren

ist es Brauch, in den darauffolgenden Zeilen die Funktionsweise bzw. Verwendung und Syntax derFunktion bzw. des Skripts zu erlautern. Diese Art von Kommentaren kann man sich spater mitdem

”help“-Befehl anschauen.

Andern wir unser bisheriges Skript zu

1∣∣∣ % Skript-file: Definition einer Matrix

2∣∣∣ % Dieses File dient zur Illustration des Aufbaus eines Skripts

3∣∣∣ % und definiert eine kleine Beispielmatrix mit dem Namen A

4∣∣∣ A=[1,2,3;4,5,6];

5∣∣∣

Wir speichern den Inhalt des Editors als Skript2.m und geben anschließend im Command-Fensterfolgende Anweisungen ein

∣∣∣ >> clear∣∣∣ >> A∣∣∣ >> Skript2∣∣∣ >> A∣∣∣ >> lookfor Matrix∣∣∣ >> help Skript2∣∣∣ >> type Skript2∣∣∣ >>

3.4 Skript fur Einsendeaufgaben

Fur Ihre Einsendeaufgaben, computerbasierte Ubungsaufgaben, benutzen Sie bitte ein Skriptfilefolgenden Formats

1∣∣∣ % Skript-file: Einsendeaufgaben

Page 21: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

KAPITEL 3. SKRIPTE, FUNKTIONEN UND DEBUGGING 20

2∣∣∣ % weitere Kommentare nach Belieben

3∣∣∣ clear

4∣∣∣ Nachname = ′Muller′;

5∣∣∣ Vorname = ′Liesel′;

6∣∣∣ Veranstaltung = ′Vorsemesterkurs Matlab′;

7∣∣∣ Blatt=1;

8∣∣∣

9∣∣∣ %%%%%%%%%%%%

10∣∣∣ % Nachfolgende Zeilen bitte nicht verandern

11∣∣∣ file=sprintf(′%s %s %d′,Nachname,Vorname,Blatt);

12∣∣∣ delete(file);

13∣∣∣ diary(file);

14∣∣∣ fprintf(′Name: %s, %s\n′,Nachname,Vorname);

15∣∣∣ fprintf(′%s %d\n′,Veranstaltung,Blatt);

16∣∣∣ echo on;

17∣∣∣ %%%%%%%%%%%%

18∣∣∣ % Aufgabe 1

19∣∣∣ % Ersetzen Sie diesen Kommentar durch Ihre Anweisungen

20∣∣∣

21∣∣∣ %%%%%%%%%%%%

22∣∣∣ % Aufgabe 2

23∣∣∣ % Ersetzen Sie diesen Kommentar durch Ihre Anweisungen

24∣∣∣ % ...

25∣∣∣ %%%%%%%%%%%%

26∣∣∣ % Nachfolgende Zeilen bitte nicht verandern

27∣∣∣ echo off

28∣∣∣ diary off

29∣∣∣

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 Program-mieren beenden wollen, speichern Sie das File zum Beispiel als tutorial 1.m und fuhren dann imCommand-Fenster

∣∣∣ >> tutorial 1∣∣∣ >>

aus. Falls Sie nicht zufrieden sind mit Ihren Losungen, so konnen Sie im Editor am Skript tutori-al 1.m entsprechende Anderungen vornehmen und anschließend das Skript nochmals ausfuhren.

Das Skript erzeugt eine Datei NachnameV orname BlattNr welche dann einzusenden ist.

3.5 Eine erste Funktion

Als eine erste Funktion werden wir eine Sinusschwingung zeichnen und die zugehorigen Funktions-werte zuruckgeben.

1∣∣∣ % Function-file: plotsin: plot sin function

2∣∣∣ %

3∣∣∣ % plotsin(N) berechnet die Funktionswerte einer Sinusschwingung und

4∣∣∣ % gibt den zugehorigen Graphen aus. Dabei ist N+1 die Anzahl

Page 22: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

KAPITEL 3. SKRIPTE, FUNKTIONEN UND DEBUGGING 21

5∣∣∣ % der aquidistanten Stutzstellen, die verwendet werden sollen.

6∣∣∣ % Y=plotsin(N) gibt die Funktionswerte zuruck.

7∣∣∣ % [Y,X]=plotsin(N) gibt die Stutzstellen X und die Funktionswerte Y zuruck.

8∣∣∣ function [y,x]=plotsin(n);

9∣∣∣ x = [0 : 2 ∗ pi/n : 2 ∗ pi];

10∣∣∣ y=sin(x);

11∣∣∣ plot(x,y);

12∣∣∣

Speichern wir den Inhalt des Editors als plotsin.m, so konnen wir uns wieder die gesamte Funktionoder den Kommentar zur Syntax anschauen.

Nachfolgend einige Erlauterungen zu obiger Funktion

Notation Großschreibung von Variablen- und Funktionennamen: Zur besseren Unterscheidungvon gewohnlichem Text und Bezeichnern schreibt man oft in diesen Kommentaren alle Va-riablen und Funktionennamen groß. Bei den Variablen ist diese Konvention unproblematisch,aber bei Funktionennamen ist dies ungunstig.

function Funktionsdeklaration: Der Begriff”function“ in Zeile 8 definiert das File plotsin.m als

Funktionfile in Unterscheidung zu einem Skriptfile. Die Syntax einer Funktionserklarung be-steht aus dem Wort function gefolgt von den

”Ruckgabewerten“, die mittels des Gleichheits-

zeichen, =, vom Funktionsnamen und der Liste der”Eingangswerte“ getrennt ist. Wird mehr

als ein”Ruckgabewert“ definiert, so mussen diese von eckigen Klammern, [ ] , eingeschlossen

werden. Die Wahl des Funktionsnamens kann nahezu willkurlich sein, es empfiehlt sich aber,ihn mit dem Namen des Files ubereinstimmen zu lassen. Fur Matlab ist der Name des Filesentscheidend! Die Liste der

”Eingangswerte“ besteht aus Variablennamen, die durch Kom-

mata getrennt werden. Diese Auflistung wird von einem Paar runder Klammern umgeben.

function Ruckgabewerte = Funktionsname (Eingangswerte)

Parameter Eingabe- und Ruckgabewerte: Die Namen der Eingabewerte konnen beliebig gewahltwerden, wobei eine geschickte Verwendung von kurzen aber bezeichnenden Namen empfohlenwird. Fur den Benutzer der Funktion sind nicht die Namen der Variablen wichtig, sondernnur ihre Reihenfolge, ihre Anzahl sowie die Bedeutung der Variablen.

variable Parameter Matlab erlaubt eine Ubergabe von verschieden vielen Eingabe- bzw. Ruck-gabewerten. Dazu muss das letzte Element in der Eingabeliste varargin bzw. das letzte Ele-ment in der Ruckgabe varargout heißen. Falls dem so ist, existieren die zusatzlichen Varia-blen nargin und nargout, die die Anzahl der vom Benutzer tatsachlich ubergebenen bzw.ubernommenen Variablen als Wert haben. Viele der Matlab eigenen Routinen benutzendiese Form, um fur verschiedene Situationen nur eine Schnittstelle definieren zu mussen.

plot Zeichnen: plot ist der einfachste und vielleicht auch am haufigsten benutzte Befehl, um Datenzu illustrieren. Spater in Kapitel 7 werden wir mehr zu dieser und anderen graphischenMatlab-Routinen lernen.

3.6 Einzeilige-Funktionen

Um einfache arithmetische Funktionen mittels Matlab-Notation zu definieren, kann man entwederdiese Funktion als ein M-File definieren oder mit dem

”@“-Befehl deklarieren.

∣∣∣ >> q=@(x)x.2-3∣∣∣ >> q(3)∣∣∣ >> x=[-3:0.1:3];

Page 23: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

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 fur einmalige Anwendungen eineFunktion definiert werden muss, die durch einen einfachen Matlab-Ausdruck darstellbar ist.

inline Funktionsdeklaration: Die Idee ist ahnlich dem”@“-Befehl, hier wird die Funktion als Zei-

chenkette (siehe Kaptiel 5) ubergeben.

fzero Nullstellensuche:”fzero(Funktion,Startwert)“ findet, sofern vorhanden, eine Nullstelle der

Funktion in der Nahe 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 Koordina-tensystem zu zeichnen.

Beachte: Die”@“-Anweisung und der

”inline“-Befehl werden in alteren Matlab-Versionen nur

teilweise unterstutzt. Speziell altere Matlab-Versionen kombiniert mit alteren Windows-Variantenhaben diese Funktionen gar nicht. In diesem Falle muß man sich eine Datei q.m anlegen mit

1∣∣∣ function y=q(x)

2∣∣∣ y = x. 2 − 3;

3∣∣∣

3.7 Unterfunktionen und Funktionen als Parameter

In einem M-File, das als Funktion definiert ist, konnen weitere Funktionen erklart werden, aberdiese sind nur lokal verfugbar, außerhalb dieses M-Files sind sie nicht definiert. Man betrachtenachfolgendes Beispiel.

In Matlab konnen wir auch Funktionen als Eingangswerte verwenden. Dies ist besondersnutzlich um z.B. mathematische Routinen fur 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∣∣∣ %%%

Page 24: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

KAPITEL 3. SKRIPTE, FUNKTIONEN UND DEBUGGING 23

14∣∣∣ function []=present result(X,Y,x,z);

15∣∣∣ plot(X,Y,′−′);

16∣∣∣ hold on;

17∣∣∣ plot(x,z,′ ∗g′);

18∣∣∣

(Das letzte Argument in plot ′ ∗ g′ zwingt Matlab zur Verwendung von grunen Sternen, um dieDatenpunkte zu makieren.) Wir speichern beide Funktionen im M-File Amin.m und geben imKommandofenster 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. 2 eingegeben werden!

3.8 Fehlersuche

Haufig verursachen kleine Tippfehler bereits sehr argerliche Resultate und erheblichen Suchauf-wand, um den Fehler zu beheben. Wahrend bei syntaktischen Fehlern Matlab schnell reklamiert,dass etwas nicht so funktioniert wie man es eingetippt hat, sieht es bei logischen Fehlern leiderhaufig anders aus. Um die Fehlersuche zu vereinfachen, gibt es den Matlab-Debugger, der vomEditor und dem Kommandofenster aus gesteuert werden kann. Der Debugger ist ein Tool, daseine schrittweise Ausfuhrung von Befehlen erlaubt, um so die Veranderung von einzelnen Varia-blen verfolgen zu konnen. Halt der Debugger inne, so ist die Ausfuhrung eines Skriptes oder einesProgrammes unterbrochen, und dem Benutzer steht das Command-Fenster zur Verfugung, um dieaktuellen Werte der Variablen analysieren zu konnen. Haufig mochte man nicht alle Schritte ein-zeln ausfuhren, aber alle bis zu einem gewissen Punkt. Dies wird in Matlab durch das Setzen vonStopppunkten ermoglicht.

Die Funktionen des Debuggers sind im Editor-Fenster im Menu unter Debug zu finden. DasSetzen eines Stopppunktes erfolgt im Editor durch das Klicken auf die Zeilennummer am linkenRand. Ein Stopppunkt, symbolisiert durch einen roten Punkt am Anfang einer Zeile, bedeutet,dass Matlab alle Aufgaben bis zu diesem Stopppunkt bearbeitet und vor der Ausfuhrung dermarkierten Zeile innehalt. Von nun an kann man jede Zeile fur sich oder alle bis zum nachstenStopppunkt ausfuhren. Dazu benutzt man wiederum das Menu Debug bzw. die entsprechendenFunktionstasten.

Verwenden wir obiges Beispiel und schauen uns die Werte von X und Y naher an. Dazu setzenwir 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 gewohnlichenTangens 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 nachjedem Rechenschritt.

Aufgabe 3.3 Loschen 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“?

Page 25: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

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∣∣∣ if (a > 1)

2∣∣∣ fprintf(′a ist großer als 1′);

3∣∣∣ elseif(a > −3 & a < −1)

4∣∣∣ fprintf(′a ist zwischen -3 und -1′);

5∣∣∣ else

6∣∣∣ fprintf(′a liegt irgendwo′);

7∣∣∣ end

8∣∣∣

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 konnen 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)

2∣∣∣ fprintf(’a ist großer als 1’);

3∣∣∣ else if (a > −3 & a < −1)

4∣∣∣ fprintf(’a ist zwischen -3 und 1);

5∣∣∣ else

6∣∣∣ fprintf(’a liegt irgendwo’);

7∣∣∣ end

8∣∣∣ end

9∣∣∣

Wir haben in den letzten beiden Beispielen mit Bedacht Einruckungen vorgenommen, um dieProgramm-Struktur deutlich zu machen. Wahrend die beiden Beispiele logisch identisch sind, soist der Code jedoch unterschiedlich!

Eine Kondition ist ein boolscher Ausdruck, entweder ist er wahr oder falsch. Dabei werdenZahlwerte ungleich 0 als wahr und der Wert 0 als falsch interpretiert. Folgende boolsche Funktio-nen/Operationen stehen zur Verfugung.

24

Page 26: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

KAPITEL 4. SCHLEIFEN UND VERZWEIGUNGEN 25

∼ a nicht aa&b a und ba|b a oder b

and(a, b) a und bxor(a, b) a und nicht b oder b und nicht a

Zusatzlich 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. Wahrend bei

”a&b“ und

”a|b“ die Ausdrucke 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 Verstandnis 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

> großer < kleiner> = großer gleich < = kleiner gleich= = gleich ∼= ungleich

zur Verfugung.

4.1.2 switch-Verzweigung

Die Switch-Verzweigung erlaubt einfache Mehrfachverzweigungen. Es konnen wie im nachfolgendenBeispiel verschiedene Werte zusammengefasst werden, indem man sie in einen Block setzt, d.h. ingeschweifte Klammern schreibt.

1∣∣∣ switch(B)

2∣∣∣ case ’a’,

3∣∣∣ fprintf(’Die Variable B ist vom Typ string und enthalt den Wert %c’,B);

4∣∣∣ case 1,

5∣∣∣ fprintf(’Die Variable B ist vom Typ matrix und enthalt den Wert 1’);

6∣∣∣ case 2,3,

7∣∣∣ fprintf(’Die Variable B ist vom Typ matrix und enthalt den Wert %d’,B);

8∣∣∣ otherwise

9∣∣∣ fprintf(’Die Variable B ist wohldefiniert, aber ich weiß sonst nichts’);

10∣∣∣ end

11∣∣∣

4.1.3 Die Suchabfrage find

Haufig mochte man nur mit einer Auswahl von Komponenten eines Vektors oder einer Matrixarbeiten. Um dies einfach zu realisieren, gibt es die vektorisierte Abfrage

”find“.

find Vektorisierte Abfrage:”find(Abfrage)“ liefert jene Indizes zuruck, fur die die vektorisierte

Abfrage erfullt ist.

Page 27: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

KAPITEL 4. SCHLEIFEN UND VERZWEIGUNGEN 26

∣∣∣ >> A=[1:2:10,1:3:10,1:4:10]∣∣∣ >> find(A < 6)∣∣∣ >> B=[1:10] ′*[1:5]∣∣∣ >> k=find(B < 6)∣∣∣ >> [i,j] = find(B < 6)∣∣∣ >> ind2sub(size(B),k)∣∣∣ >>

4.2 Schleifen

Auch hier gibt es zwei Varianten, die”for“- und die

”while“-Schleife.

4.2.1 Die for-Schleife

Dieser Schleifentyp eignet sich, wenn eine bestimmte Anzahl an Schleifen-Durchlaufen benotigtwird.

1∣∣∣ for i=2:10

2∣∣∣ b(i) = i;

3∣∣∣ end;

4∣∣∣ c=[1:10] ′;

5∣∣∣

Die Vektoren b und c haben in den Komponenten 2 bis 10 die gleichen Eintrage. Nachfolgendnoch eine allgemeinere Verwendung der for-Schleife.

1∣∣∣ start = -3;

2∣∣∣ inkrement = 1.5;

3∣∣∣ stop=2*pi;

4∣∣∣ for i = start : inkrement : stop

5∣∣∣ fprintf(′i hat jetzt den Wert i = %f\n′,i);

6∣∣∣ end;

7∣∣∣

4.2.2 Die while-Schleife

Hier benutzen wir wieder eine boolsche Bedingung und fuhren die Schleife solange aus, bis dieseBedingung nicht mehr erfullt ist.

1∣∣∣ i = 1;

2∣∣∣ while (i<9.5)

3∣∣∣ i = i+pi;

4∣∣∣ fprintf(′i hat jetzt den Wert i = %f\n′,i);

5∣∣∣ end;

6∣∣∣

Wie bereits erwahnt, wird jede von 0 verschiedene Zahl als wahr interpretiert. Somit re-prasentiert die nachfolgende Schleife eine Endlosschleife mit einer inneren Abbruchbedingung.

1∣∣∣ i = 0;

2∣∣∣ while 1

3∣∣∣ i = i+pi;

Page 28: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

KAPITEL 4. SCHLEIFEN UND VERZWEIGUNGEN 27

4∣∣∣ if and( i<10*pi, i>pi )

5∣∣∣ fprintf( ′Wir machen nix\n′);

6∣∣∣ continue

7∣∣∣ end;

8∣∣∣ fprintf( ′i hat jetzt den Wert i = %f\n′,i);

9∣∣∣ if (i>20*pi)

10∣∣∣ break;

11∣∣∣ end;

12∣∣∣ end;

13∣∣∣

break sofortiger Abbruch einer Schleife: Dieser Befehl fuhrt zur sofortigen Beendigung einerSchleife, d.h. der Rest des Schleifenrumpfes wie auch die Abbruchbedingung werden nichtnoch einmal ausgefuhrt. Sind zwei Schleifen verschachtelt (eine außere und eine innere), sobricht der Befehl nur die innere Schleife ab, sofern der break-Befehl in der inneren Schleifezur Ausfuhrung kommt.

continue Sprung zum Schleifenbeginn: Der verbleibende Schleifenrumpf wird fur diesen Durchgangdurch die Schleife ignoriert und die Schleife fahrt mit dem Inkrementieren der Laufvariablenbzw. mit dem Testen der Abbruchbedingung bei einer while Schleife fort.

Zuweilen bemerkt man etwaige Eingabefehler oder Programmierfehler zu spat 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)

3∣∣∣ for i=1:j

4∣∣∣ A(i,j) = i 2+j 2-(i*j);

5∣∣∣ end

6∣∣∣ j = j+1;

7∣∣∣ end

8∣∣∣

4.3 Aufgaben

Aufgabe 4.1 Bearbeiten Sie nochmals diesen Abschnitt und fuhren 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 imCommand-Fenster ein:

”fibonacci(3)“ und

”fibonacci(41.2)“.

Aufgabe 4.3 Schreiben Sie eine eigene Funktion”fakultaet“. Diese soll fur

”fakultaet(n)“ den

Wert n! liefern. Geben Sie nun folgende Befehle im Command-Fenster ein:”fakultaet(7)“ und

”fakultaet(9.1)“.

Aufgabe 4.4 Schreiben Sie eine Funktion”euklid“, die den großten gemeinsamen Teiler zweier

Zahlen findet. Geben Sie nun folgende Befehle im Kommando-Fenster ein:”euklid(12,8)“ und

”euklid(27,34)“.

Page 29: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

Kapitel 5

Weitere Datentypen

Aufgrund der automatischen Typkonvertierung sind Unterschiede zwischen den meisten Datenty-pen von geringer Bedeutung. Genauere Informationen zu den verschiedenen Datentypen sind mit

”help datatypes“ erhaltlich.

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, allgemeinals char bezeichnet, eingeschlossen von einem Paar einfacher Anfuhrungszeichen (Hochkomma),

”′“, z.B.

”′hello ′“. Einer Deklaration einer Variablen als string bedarf es nicht, da Matlab die

Typkonvertierung automatisch vornimmt. Zunachst einige Beispiele.∣∣∣ >> A=[3,4]∣∣∣ >> A = ′hello world ′∣∣∣ >> B = [ ′hello ′,′world ′]∣∣∣ >> B(1)∣∣∣ >> B(2)∣∣∣ >> B(1:5)∣∣∣ >>

Durch die Zuweisung”A= ′hello world ′“ wird die vorhergehende Belegung der Variablen A

geloscht. Der fruhere Datentyp matrix geht dabei ebenso verloren wie der Inhalt von A. Mat-

lab erlaubt ein einfaches Zusammensetzen von Werten des Typs string, dabei wird kein weiteresZeichen eingefugt. Man kann also spater weder auf

”′hello ′“ noch auf

”′world ′“ getrennt zugreifen,

es sei denn, man kennt die Position in der zusammengesetzten Zeichenkette.∣∣∣ >> C = ′345 ′∣∣∣ >> C(1)∣∣∣ >> C(2)∣∣∣ >> C(1)*C(3)∣∣∣ >>

Man erkennt an der Ausgabe der Daten nicht zweifelsfrei, ob C eine Zeichenkette oder eine Zahlist. Das Einrucken am Anfang der Zeile ist nicht wirklich signifikant. Mit dem Befehl

”ischar(C)“

konnen wir uns aber Sicherheit verschaffen. Falls”ischar(C)“ den Wert 1 zuruckliefert, ist C

eine Zeichenkette, andernfalls nicht. Wahrend die Aufrufe C(1) und C(3) die einzelnen Zeichenausgeben, wird durch die Verwendung eines Rechenzeichens eine Typkonvertierung erzwungen,denn

28

Page 30: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

KAPITEL 5. WEITERE DATENTYPEN 29

mit Zeichenketten kann man nicht rechnen!

Also werden die Zeichen in den Datentyp Zahl/Matrix umgewandelt. Bei der Typkonvertierungwird der ASCII-Wert des Zeichens genommen und als Zahl interpretiert.

Bei der Zuweisung∣∣∣ >> D = [ ′hello ′,59,45,41]∣∣∣ >>

wird aus der Zahl 41 ein Zeichen gemacht, die Konvertierung erfolgt erneut mittels der ASCII-Werte. Mit den Befehlen

”char“ und

”double“ konnen die Typkonvertierungen zwischen Zeichen-

ketten und Zahlen explizit vorgenommen werden. Eine explizite Konvertierung ist einer implizitenKonvertierung vorzuziehen.

5.2 Struktur (struct)

Variablen des Datentyps struct werden bei einigen Matlab-Routinen als Eingabewerte zur Spezifi-kation von Optionen verwendet. Der Datentyp erlaubt einer Variablen beliebig viele Komponentenzu haben, die jeweils uber einen Namen und einen Wert verfugen. Dabei ist der Datentyp desWertes beliebig und die Komponenten konnen beliebige Namen haben.

∣∣∣ >> A.typ = ′matrix ′;∣∣∣ >> A.size=[3,2];∣∣∣ >> A.content=[1,2;3,4;5,6];∣∣∣ >> A∣∣∣ >> A.typ∣∣∣ >> A.content∣∣∣ >> B=struct( ′typ ′,′matrix ′,′size ′, [3, 2],′content ′,[1,2;3,4;5,6]);∣∣∣ >> C=[struct( ′typ ′,′matrix ′,′size ′, [3, 2],′content ′,[1,2;3,4;5,6]);...∣∣∣ struct( ′typ ′,′matrix ′,′size ′,[1,1],′content ′,0)];∣∣∣ >> C(2).content∣∣∣ >> C(1).typ∣∣∣ >> C∣∣∣ >>

Zum Arbeiten mit Strukturen stehen die folgenden Routinen zur Verfugung:

struct(. . . ) Anlegen einer Struktur: Am besten schaut man sich obiges Beispiel und die Erklarungunter

”help struct“ an.

isfield(S,′name ′) Existenztest fur Strukturkomponente: Testet ob name der Name einer Kompo-nente der Struktur S ist.

S=getfield(S,′name′) Wertabruf: ist eine aquivalente Form zu”S.name“.

S=setfield(S,′name′,wert) Wertzuweisung: ist eine aquivalente Form zu”S.name=wert“.

S=rmfield(S,′name′) Komponenten loschen: Loscht die Komponente ′name′ aus der StrukturS, sofern diese dort vorhanden ist.

fieldnames(S) Auflistung aller Komponentennamen: Gibt die Namen aller Komponenten von Saus. Das Ergebnis ist vom Typ Block, siehe Abschnitt 5.3, mit Inhalten vom Typ Zeichenkette.

Page 31: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

KAPITEL 5. WEITERE DATENTYPEN 30

5.3 Der Datentyp Block (cell)

Blocke sind beliebig-dimensionale Gebilde, die Variablen beliebigen Datentyps als Elemente besit-zen. Im Nachfolgenden beschranken wir uns auf ein- und zwei-dimensionale Blocke. Dieser Datentyperlaubt auch Mengenoperationen. Starten wir zuerst mit einigen Beispielen fur den Datentyp Block.

∣∣∣ >> A = 1, [2, 3], 4, [5, 6; 7, 8],′hello′∣∣∣ >> A2∣∣∣ >> A5∣∣∣ >> A(5)∣∣∣ >> A4(2, 1)∣∣∣ >> B = 1, [2, 3]; 4,′ hello′∣∣∣ >>

. . . Blocke, cells: Die geschweiften Klammern definieren einen Block. Das Format von Blockenwird wie bei Matrizen automatisch von Matlab festgestellt, dabei werden zwei Eintrageinnerhalb einer Zeile durch Kommata bzw. Leerzeichen getrennt und zwei Zeilen durch einSemikolon. Wiederum ist bei der Eingabe darauf zu achten, dass alle Zeilen die gleiche Anzahlan Spalten (Komponenten) haben.

Allerdings konnen mittels der geschweiften Klammern maximal zweidimensionale Blocke defi-niert werden. Um hoher-dimensionale Blocke 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 demBlock 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 Blocke: Der Zugriff auf einen einzelnen Block oder mehrere Blocke erfolgt wiebeim Zugriff auf ein einzelnes Element bzw. mehrere Elemente einer Matrix, allerdings liefertdies nicht den Inhalt des Blocks, sondern den Block als solchen.

Einige weitere Beispiele fur den Umgang mit dem Datentyp Block:∣∣∣ >> A = [1, 2; 3, 4];∣∣∣ >> B = A, A 2, A 3, A 4∣∣∣ >> C = ′hello′,′ world′,′was sollen wir da noch sagen ′∣∣∣ >> D = A, B; , C∣∣∣ >> D(3)∣∣∣ >> D3∣∣∣ >> D(2)∣∣∣ >> D2∣∣∣ >> D22∣∣∣ >>

5.4 Mengen

Der Datentyp Block kann auch zur Darstellung von Mengen benutzt werden. Dazu mussen alleBlockeintrage vom Typ Zeichenkette (string) sein. So kann mit unique aus einem Block eine Mengeerzeugt werden (Mehrfachnennungen werden gestrichen und die Eintrage sortiert).

Seien A und B zwei Mengen, so ist

Page 32: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

KAPITEL 5. WEITERE DATENTYPEN 31

Mathematischer Ausdruck Matlab BefehlA ∪ B union(A, B)A ∩ B intersect(A, B)A\B setdiff(A, B)

(A ∪ B)\(A ∩ B) setxor(A, B)

Zusatzlich gibt es den Befehl ismember(a,A), der den Wert 1, falls a ∈ A ist, und sonst denWert 0 zuruckgibt.

∣∣∣ >> A = ′1′,′ 2′,′ 3′,′ 4′,′ 5′,′ a′,′ b′,′ c′,′ d′∣∣∣ >> B = ′1′,′ A′,′ 2′,′ 4′,′ 4′,′ 4′,′ 5′∣∣∣ >> B = unique(B)∣∣∣ >> B = union(B,′ 7′)∣∣∣ >> D = union(intersect(A, B), ′9′,′ 7′,′ A′,′ B′)∣∣∣ >> if ismember(′3′,D)∣∣∣ fprintf(′We have lost\n′);∣∣∣ end∣∣∣ >>

(Fur kompliziertere algebraische Rechnungen kann teilweise noch Maple verwendet werden. Fur 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 Verfugungstehen. Mittels

”help strfun“ kann man einen guten Uberblick uber diese Funktionen erhalten. Im

Nachfolgenden werden einige vorgestellt. Um interaktive Matlab-Routinen zu schreiben, sind dieFunktionen

”input“ und

”fprintf“ nutzlich.

1∣∣∣ Wert = input(′Geben Sie eine Zahl ein \n′);

2∣∣∣ fprintf(′Sie haben den Wert %d eingegeben. \n\t Danke \n′,Wert);

3∣∣∣

input Eingabeaufforderung: Die Funktion gibt den ubergebenen Text aus und wartet auf die Ein-gabe einer Variablen beliebigen Typs. Das Betatigen der [Return]-Taste entspricht wiederumdem Eingabeende. Eine leere Eingabe wird als 0 × 0 Matrix interpretiert.

fprintf formatierte Ausgabe: Im Wesentlichen identisch zu der gleichnamigen C-Funktion. DieSyntax lautet entweder

fprintf(Formatstring,Parameter)

oder

fprintf(File,Formatstring,Parameter).

Im ersten Fall wird die Ausgabe auf dem Bildschirm (stdout) erfolgen, im zweiten Fall wirdder Text in eine Datei geschrieben, die zuvor mit

”fopen“ zum Schreiben geoffnet wurde. Der

Formatstring besteht aus beliebigem Text, gespickt mit Formatanweisungen

\t Tabulator\n Zeilenumbruch

und Platzhaltern fur Variablen:

Page 33: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

KAPITEL 5. WEITERE DATENTYPEN 32

%d ganze Zahl%f Gleitpunktzahl%e Gleitpunktzahl in exponentieller Schreibweise%s Zeichenkette

Fur jeden Platzhalter sollte ein entsprechender Parameter angegeben werden, dabei muss dieReihenfolge der Parameter der Reihenfolge der Platzhalter entsprechen.

Ferner kann die Darstellung einer Zahl noch detaillierter vorgegeben werden.∣∣∣ >> fprintf(′%f %e\n′,-pi,-pi);∣∣∣ >> fprintf(′%8.4f %8.4e\n′,-pi,-pi);∣∣∣ >> fprintf(′%2.1f %2.1e\n′,-pi,-pi);∣∣∣ >> fprintf(′%+2.1f %2.1E\n′,-pi,-pi);∣∣∣ >>

sprintf Formatierte Zeichenkette: Der Befehl funktioniert wie”fprintf“ nur mit dem Unterschied,

dass keine Ausgabe der Zeichenkette erfolgt, sondern die Zeichenkette als Ruckgabewert zurVerfugung steht. Siehe Skript fur Einsendeaufgaben, Abschnitt 3.4.

Weitere hilfreiche Funktionen zum Arbeiten mit Zeichenketten sind

strcat verbinden von Zeichenkettenstrcmp vergleichen von Zeichenkettenstrfind suchen von Zeichenketten

Den vollstandigen Uberblick gibts es mit”help strfun“.

∣∣∣ >> A = ′hello ′;∣∣∣ >> B = ′world ′;∣∣∣ >> C = ′How ′;∣∣∣ >> D = ′is ′;∣∣∣ >> E = ′life ′;∣∣∣ >> F = ′fine ′;∣∣∣ >> greeting = strcat(A, ′ ′,B)∣∣∣ >> question = strcat(C, ′ ′,D, ′ ′,E)∣∣∣ >> u = strfind(question,′ ′)∣∣∣ >> if strcmp(D,question(u(1)+1,u(2)-1))∣∣∣ fprintf(′%s %s %s\n′,E,D,F)∣∣∣ end∣∣∣ >>

5.6 Arbeiten mit Blocken

Wir haben bereits gezeigt, wie man Blocke anlegt und wie man auf einzelne Elemente und ihreInhalte zugreift. Im Nachfolgenden einige weitere Befehle zum Arbeiten mit Blocken.

cell(. . .) erzeugt einen oder mehrere Blocke. Formal gibt es keinen Grund weswegen die Befehle

”struct“ und

”cell“ nicht geschachtelt werden sollten, aber es konnen ungewollte Effekte

auftreten.

cellplot(B) erzeugt eine graphische Ubersicht uber das Format und die Inhalte einer VariablenB vom Typ Block.

Page 34: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

KAPITEL 5. WEITERE DATENTYPEN 33

celldisplay(B) gibt den Inhalt aller Komponenten einer Variablen B vom Typ Block im Command-Fenster aus. (Steht nicht in alteren Versionen zur Verfugung.)

iscell(B) testet, ob B vom Typ Block ist; falls ja, wird der Wert 1, sonst der Wert 0 zuruckgeliefert.

iscellstr(B) testet, ob alle Inhalte der Elemente der Variablen B vom Typ Block den Typ Zei-chenkette 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 erzeugenSie 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 Eintragen vom Typ Struktur. Jede Struktur hat die Kom-ponenten Ort (Zeichenkette), Temperatur (Zahl) und Niederschlag (Zahl). Die Funktion soll furjeden Ort die Temperatur und den Niederschlag ausgeben.

Definieren Sie die Variable Wetter mit den Daten

Ort Temperatur Niederschlag in mlKoeln 20 0Duesseldorf 19 3Frankfurt 25 0Offenbach 17 10Mainz 21 1Hanau 21 0

und fuhren Sie Wetteransage(Wetter) aus.

Page 35: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

Kapitel 6

Speichern und Lesen vonDatensatzen

Vorsicht:

Es lassen sich sehr leicht riesige Datensatze mit Matlab erzeu-gen. Diese Datensatze unbedacht zu speichern, wird den Ihnen zurVerfugung stehenden Speicherplatz sehr schnell fullen!!

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

∣∣∣ >> save(name,′a ′,′ b ′,′ C ′)∣∣∣ >>

verwenden. Letzteres mag beim automatischen Bearbeiten von Datensatzen mittels Skripten undFunktionen 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(′was ′,′unsortierte Daten ′,′Inhalt ′,zeros(2,4));

34

Page 36: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

KAPITEL 6. SPEICHERN UND LESEN VON DATENSATZEN 35

∣∣∣ >> B(1).Inhalt = ′hallo world ′;∣∣∣ >> B(2,1).Inhalt = ′was nun ′;∣∣∣ >> B(1,3).Inhalt = A;∣∣∣ >> B(6).Inhalt = ′niemals nie ′;∣∣∣ >> C.was = ′unsortierte Daten ′;∣∣∣ >> C.Inhalt = ′hallo world ′,[ ],A,[ ]; ′was nun ′,[ ], ′niemals nie ′,[ ] ;∣∣∣ >> 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 Exportieren und Importieren von ASCII Daten

6.2.1 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 weiterverar-beiten mochte, empfiehlt sich eine formatierte Ausgabe. Dazu benotigt man die folgenden Befehle

fopen Offnen und Anlegen von Dateien: Der Befehl”fopen(′name′,′action′)“ offnet eine Datei mit

dem Namen name zum Lesen, falls action = r oder zum Schreiben falls action = w+. Furweitergehende 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 wirklichgespeichert! Bis zu diesem Zeitpunkt hat man nur in eine Temporardatei geschrieben, erstder Befehl

”fclose“ speichert die Daten!

Zum Beispiel kann die Matrix A wie folgt gespeichert werden∣∣∣ >> fid=fopen(′Datensatz3 ′,′w+′)∣∣∣ >> fprintf(fid,′%% Diese Datei enthalt homogene Daten,′);∣∣∣ >> fprintf(fid,′ die auch mittels load gelsen werden konnen\n′);∣∣∣ >> for i = 1:3∣∣∣ for j = 1:4∣∣∣ fprintf(fid,′%e ′,A(i,j));∣∣∣ end∣∣∣ fprintf(fid,′\n′);∣∣∣ end∣∣∣ >> fclose(fid);∣∣∣ >>

Page 37: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

KAPITEL 6. SPEICHERN UND LESEN VON DATENSATZEN 36

6.2.2 Einlesen von der Tastatur

Hierzu existiert der”input“-Befehl. Allerdings ist diese Variante unpraktisch bei großeren Daten-

mengen und lasst keine Automatisierung des Verfahrens zu. Wir speichern folgendes Beispiel inder Datei Bsp input.m

1∣∣∣ a = input(′Geben Sie eine Zahl ein ′);

2∣∣∣ w = input(′Geben Sie ein Wort ein ′);

3∣∣∣ for i = 1 : a

4∣∣∣ fprintf(′%s \n′,w);

5∣∣∣ end;

6∣∣∣

und fuhren anschließend das Programm Bsp input aus.∣∣∣ >> Bsp input∣∣∣ Geben Sie eine Zahl ein 4∣∣∣ Geben Sie ein Wort ein ′hallo′∣∣∣ 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. Daruber hinuas kann man mit”load“ auch Zahlenreihen, die in Matrixform gespeichert

sind, einlesen.∣∣∣ >> clear∣∣∣ >> load Datensatz3∣∣∣ >> who∣∣∣ >> 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 Verfugung undstammt aus der Sammlung Matrix market1.

Prinzipiell muss man beim Einlesen von Daten wissen in welcher Form und welcher Struktur siegespeichert sind. Mittels

”fopen“ und

”fscanf“ konnen beliebige Daten geladen werden, doch um

diese entsprechend interpretieren zu konnen benotigt man weitere Kentnisse. Falls, wie im Falle vonDatensatz3, die Daten im ASCII Format und wohl sortiert sind, ist das Einlesen unproblematisch.

Zum formatierten Einlesen steht der Befehl”fscanf“ zur Verfugung. Die Syntax ist ahnlich der

des Befehls”fprintf“, siehe Abschnitt 5.5. Zu beachten ist, dass

”fscanf“ die gesamte Datei einliest,

falls nicht eine maximal einzulesende Anzahl an Zeichen spezifiziert ist.∣∣∣ >> fid=fopen(′Datensatz3′,′ r′);∣∣∣ >> A = str2num(scanf(fid,′%c′));

1http://math.nist.gov/MatrixMarket

Page 38: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

KAPITEL 6. SPEICHERN UND LESEN VON DATENSATZEN 37

∣∣∣ >> fclose(fid);∣∣∣ >> who∣∣∣ >> A∣∣∣ >> clear∣∣∣ >> fid=fopen(′pores 1.mtx′,′ r′);∣∣∣ >> text = fscanf(fid,′%c′);∣∣∣ >> fclose(fid);∣∣∣ >> R = text;∣∣∣ >> while (length(R))∣∣∣ [T,R] = strtok(R,′%′);∣∣∣ end∣∣∣ >> t = str2num(T);∣∣∣ >> A = spconvert(t(2:end,:));∣∣∣ >> full(A)∣∣∣ >>

6.3 Importieren und Exportieren von Datenbanken

Dies ist ein haufig auftretendes Problem. Leider gibt es nur fur wenige Datenbanken eine guteUnterstutzung und diese auch nur mittels diverser Zusatzpakete.

Als Alternative kann man entsprechende Daten aus der Datenbank als ASCII-Werte exportie-ren, um diese anschließend mit Matlab einzulesen.

6.4 Ein ausfuhrliches Beispiel

Zur Dokumentation von Ergebnissen werden haufig Testdaten tabelliert in ein Textdokument ein-gefugt. Falls nun der Text in LATEX erstellt wird, ist das Einfugen von Tabellen etwas muhsam.Nachfolgend betrachten wir eine Funktion die automatisch eine einfache LATEX-Tabelle erzeugt.

Gegeben sei der Datensatz

TitelA B C

a 3 4 7b 17 -1 5c 3 -4 2

Die dazugehorige LATEX-Tabelle hat die folgende Gestalt

1∣∣∣ \begintabular|l| ∗ 3c| \\ \hline

2∣∣∣ & \multicolumn3c|Titel \\ \hline

3∣∣∣ & A & B & C \\ \hline

4∣∣∣ a & 3 & 4 & 7 \\

5∣∣∣ b & 17 & -1 & 5 \\

6∣∣∣ c & 3 & -4 & 2 \\ \hline

7∣∣∣ \endtabular

8∣∣∣

Dabei stellt die Zahl 3 in den Zeilen 1 und 2 fur die Zahl der Datenspalten und muß fur Tabellenmit anderer Spaltenzahl dementsprechend angepasst werden.

1∣∣∣ function [ ] = latextab(fn,Daten)

Page 39: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

KAPITEL 6. SPEICHERN UND LESEN VON DATENSATZEN 38

2∣∣∣ fid = fopen(fn,′w+′);

3∣∣∣ if (fid<3)

4∣∣∣ fprintf(′ Fehler beim Oeffnen der Datei\n′);

5∣∣∣ return;

6∣∣∣ end;

7∣∣∣ [zeilen,spalten] = size(Daten.tab);

8∣∣∣ fprintf(fid,′\\begin tabular|l| ∗ %dc|\\\\ \\hline \n′,spalten);

9∣∣∣ for i=1:spalten

10∣∣∣ fprintf(fid,′& %s\n′,Daten.SpTitel(i));

11∣∣∣ end;

12∣∣∣ fprintf(fid,′\n′);

13∣∣∣ for i=1:zeilen

14∣∣∣ for j=1:spalten

15∣∣∣ fprintf(fid,′& %d ′,Daten.Inhalt(i,j));

16∣∣∣ end;

17∣∣∣ fprintf(fid,′\\\\ \\hline \n′);

18∣∣∣ end;

19∣∣∣ fclose(fid);

20∣∣∣

6.5 Aufgaben

Aufgabe 6.1 Arbeiten Sie dieses Kapitel nochmals sorgfaltig durch und fuhren Sie die Komman-dos 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:

∣∣∣ >> woerter.I = ′ich′;∣∣∣ >> woerter.have = ′habe′;∣∣∣ >> woerter.finished = ′fertig′;∣∣∣ >>

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 Feldesausgegeben, sonst eine Fehlermeldung.

Aufgabe 6.4 Schreiben Sie eine Funktion”split“, die den in einer Datei enthaltenen Text einliest,

in einzelne Worter zerlegt und diese in einer anderen Datei speichert, dh. pro Zeile ein Wort. DerAufruf soll die Form

∣∣∣ >> split(Eingang,Trennzeichen,Ausgang)∣∣∣ >>

haben. Dabei sind Eingang und Ausgang die Namen der jeweiligen Dateien, und Trennzeichen(Typ Block) enthalt die Zeichen und Zeichenketten, die als Trennzeichen zweier Teilstucke gelten.Die einzelnen Teilstucke werden als jeweils eine Zeile in die Datei Ausgang geschrieben.

2Diese Aufgabe stammt von Soeren Herbert.

Page 40: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

KAPITEL 6. SPEICHERN UND LESEN VON DATENSATZEN 39

Als Beispiel kann die Datei”Teiltexte“ und die Trennzeichen

”′hallo′,′ wir′,′ freuen′, 10“

genutzt werden.

Aufgabe 6.5 Schreiben Sie eine Funktion namens ignore.”A=ignore(Name)“ soll eine Datei

Name offnen und die Variable A vom Typ Struktur belegen. Die Datei darf Kommentarzeilenenthalten, dabei ist eine Kommentarzeile eine Zeile deren erstes Zeichen das Prozentzeichen ist,”%”. Alle anderen Zeilen haben das Format

Feldname Feldinhaltwobei 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 derZeilenumbruch auf Ihrem Rechner?)

Page 41: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

Kapitel 7

Graphik

7.1 Ubersicht

Die graphische Darstellung von Daten ist ein Grundpfeiler von Matlab. Da es sehr viele Graphik-befehle gibt, werden wir hier nur einige Befehle behandeln.

Matlab kennt verschiedene Typen von Graphen, die mit einem entsprechenden Befehl erzeugtwerden konnen. Viele dieser Befehle haben eine ahnliche Arbeitsweise, die wir nachfolgend am

”plot“-Befehl vorstellen werden. Zuerst ein (nicht vollstandiger) Uberblick uber die zur Verfugung

stehenden grundlegenden Graphikbefehle.

Graph plot plot3logarithmisch skalierter Graph semilogy semilogx loglogStabdiagramm stem stem3Diagramm bar stairs pieHohenlinien contour contourf contour3 pcolorOberflache surf surface surfc mesh

waterfallSonstige line fill fill3 image

scatter scatter3 plotmatrix spy

Ferner gibt es weitere Befehle zur Handhabung der Graphikfenster

figure Offnen und Aktivieren eines Graphikfensters: Graphikfenster erhalten in Matlab eine Zahlstatt einem Namen. Ferner gibt es keine Beschrankung der Anzahl der Graphikfenster, diegeoffnet werden konnen. Etwaige Beschrankungen kommen vom Betriebssystem. Falls dasFenster ’Figure No 3’ noch nicht existiert, wird es durch den Aufruf

”figure(3)“ als leeres

Fenster erzeugt. Unabhangig davon, ob das Fenster ’Figure No 3’ bereits existiert, wirdes aktiviert, das heißt, alle nachfolgenden Graphikbefehle arbeiten in diesem Fenster. Jenach Betriebssystem kann man ein graphisches Fenster auch durch Anklicken mit der Mausaktivieren.

print Druckersteuerung und Bildspeicherung: Dieser Befehl ist zum Speichern wie auch Aus-drucken von matlab-Graphiken gedacht. Je nach Betriebssystem und installiertem Druckersind andere flags sinnvoll. Einen Uberblick gibt es in der Hilfe zum print-Befehl, also

”help

print“. Auf UNIX und LINUX Computern sind die Formate eps und ps interessant, daDateien vom Typ eps und ps via Postscriptdrucker ausgegeben und in LATEX Dokumenteeingebunden werden konnen. Ferner ist das Datenformat jpeg interessant, um Bilder auf dieeigene Homepage zu setzen.

hold Einfrieren: Normalerweise wird mit jedem Zeichenaufruf, z.B. plot und stem, die alte Graphikgeloscht und anschließend die neue gezeichnet. Mittels

”hold on“ kann das Loschen bis zum

nachsten”hold off“ oder bis zum nachsten

”clf“-Befehl unterbunden werden. Somit friert der

40

Page 42: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

KAPITEL 7. GRAPHIK 41

Befehl”hold on“ alle Zeichnungen im aktiven Bild ein, das heißt, der neue Graph wird dem

alten hinzugefugt.

clf Loschen: Loscht die ganze Graphik wie auch Parameter, z.B: Achsen und hold on-Status, abernicht von Hand eingetragene Elemente, z.B: Linien oder Texte, die von Hand mittels derMenusteuerung im Graphik Fenster eingetragen wurden.

axis Bildausschnitt: Ermoglicht einen Teilausschnitt der gesamten Graphik zu spezifizieren. Dabeiwird die Achsen-Skalierung automatisch angepasst, aber nicht von normal auf logarithmischumgestellt.

legend Beschriftung: Falls mehrere Kurven in einer Zeichnung dargestellt werden, so ist es vor-teilhaft, den spateren Betrachter wissen zu lassen, was die Bedeutung der einzelnen Kurvenist.

”legend(string1,string2,. . . ,stringk,zahl)“ erzeugt eine Zeichenerklarung fur die ersten k

Graphen, die im Fenster stehen. Der Aufruf von legend erfolgt normalerweise, nachdem alleZeichnungen, die in das Bild sollen, bereits erzeugt wurden. Standardmaßig wird diese Le-gende in der oberen rechten Ecke angebracht. Mit dem optionalen Parameter zahl kann dieLegende auch in einer anderen Ecke angebracht werden.

title Titel: Erzeugt eine Uberschrift.

xlabel Achsenbeschriftung: Erzeugt eine Beschriftung der x-Achse und kann fur zwei- und drei-dimensionale Darstellungen verwendet werden.

ylabel Achsenbeschriftung: Erzeugt eine Beschriftung der y-Achse und kann fur zwei- und drei-dimensionale Darstellungen verwendet werden.

zlabel Achsenbeschriftung: Erzeugt eine Beschriftung der z-Achse in drei-dimensionalen Darstel-lungen.

text Beschriftung: Erlaubt zusatzliche Beschriftungen in der Zeichnung wie auch außerhalb. Viel-leicht etwas unbequemer als das Zeichnen von Hand, aber dafur konsistent mit der internenDatenverarbeitung (siehe clf).

colorbar Farbtafel: Stellt neben der Zeichnung eine Farbtafel mit Skalierung auf. Dies ist beson-ders von Interesse wenn, wie beim Zeichnen von Hohenlinien, Zahlwerte durch Farbwerteidentifiziert werden.

colormap Farbskalierung: Erlaubt die Anderung der automatischen Farbeinteilung.

colormenu Farbsteuerung: Stellt im Graphik-Fenster ein weiteres Menu zur Einstellung von Far-ben zur Verfugung.

shading Schattierung: Ermoglicht eine Anderung der Darstellung von farbigen Graphiken.

close Schließen des Graphikfensters: Der Aufruf”close(figure(1));“ schließt das Graphikfenster

Nr. 1, sofern dieses offen war.

Page 43: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

KAPITEL 7. GRAPHIK 42

7.2 Der plot-Befehl

Wie bei den meisten Graphikbefehlen hangt der Effekt des”plot“-Befehls von der Anzahl der

ubergebenen Parameter und deren Format ab.

7.2.1 plot mit einem Argument

Der Aufruf von”plot“ offnet ein eigenes Graphikfenster, sofern keines vorhanden ist. Existieren ein

oder mehrere Graphikfenster, so verwendet”plot“ das derzeit aktive Graphikfenster. Der Inhalt

dieses Graphikfensters geht dabei verloren. Ein Beispiel:∣∣∣ >> x = [1, 2, 3, 4; 5, 6, 7, 8; 9, 10, 11, 12]∣∣∣ >> plot(x)∣∣∣ >> plot(sin(x))∣∣∣ >>

Allgemein kann man”plot(X)“ verwenden, wobei X eine Zahl, ein Vektor oder eine Matrix ist. Ist

X eine n × k Matrix, so werden k Linien der Form i = 1, 2, . . . , n → Xi,j (j = 1, . . . , k) in einerGraphik dargestellt. Jeder dieser Graphen besteht aus geraden Verbindungsstucken zwischen zweiWerten.

Falls X ein Vektor ist, so wird dieser immer wie eine n× 1 Matrix behandelt. Falls X eine Zahlist, 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(x′, sin(x′))∣∣∣ >> plot(sin(x),′ r+′)∣∣∣ >>

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 verschiedenenFarben dargestellt.

Beim dritten Aufruf enthalt die zweite Komponente die Anweisung, mit welcher Farbe und mitwelchem 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 b rot rgelb y grun gmagenta m schwarz k

zur Verfugung. Bei den Linientypen gibt es außer

durchgezogene Linie - gepunktete Linie :gestrichelte Linie - - strichpunktierte Linie -.Sternchen an Datenpunkten * Punkte an Datenpunkten .Kreise an Datenpunkten o

noch weitere Moglichkeiten, siehe”help plot“.

Page 44: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

KAPITEL 7. GRAPHIK 43

7.2.3 Ein ausfuhrliches Beispiel

1∣∣∣ % Skript: trigi.m : trigonometrische Funktionen

2∣∣∣ clear;

3∣∣∣ figure(1);

4∣∣∣ clf

5∣∣∣ x=[0:0.2:10];

6∣∣∣ plot(x,sin(x),′r-′)

7∣∣∣ hold on

8∣∣∣ plot(x,cos(x),′b-.′)

9∣∣∣ plot(x,tan(x),′k:′)

10∣∣∣ y=[0.1:0.2:pi] ′;

11∣∣∣ plot([y,y+pi,y+2*pi],cot(y)*[1,1,1],′g-′)

12∣∣∣ z=[3*pi+0.1:0.2:10] ′;

13∣∣∣ plot(z,cot(z),′g-′)

14∣∣∣ axis([3,6,-20,20]);

15∣∣∣ legend( ′sin ′,′cos ′,′tan ′,′cot ′)

16∣∣∣ xlabel( ′Dies ist die X-Achse ′)

17∣∣∣ ylabel( ′Dies ist die Werte-Achse ′)

18∣∣∣ title( ′Ein Beispiel ′)

19∣∣∣

Die Funktionen tan und cot haben in obigen Intervall diverse Polstellen, die bei der oben gewahltenSkalierung 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 jeweilseine Folge von Punkten mit geraden Strichen verbindet. Falls nicht einer der Punkte die Polstelletrift, so sind alle Punkte von endlicher Große und die Punkte werden geradlining verbunden.

7.3 Fur Fortgeschrittene

Falls mehrere Graphiken hintereinander gezeigt werden sollen, ist es sinnvoll, dem Betrachter einwenig Zeit dafur 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 hilf-

reich.

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 [Wdh, index1, . . . , indexK] haben, wobei index1,. . . ,indexK dieReihenfolge der in Slides gespeicherten Frames bestimmt.

getframe Erzeugung eines Bildes: Die mittels”getframe“ gespeicherten Bilder sind nicht nachtraglich

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′-1). 2*x. 2+y′. 2*cos(x-3). 2-sin(y′*x);∣∣∣ >> surf(x,y,z);

Page 45: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

KAPITEL 7. GRAPHIK 44

∣∣∣ >> for i=0:50∣∣∣ view([cos(i/25),sin(i/20),0.3]);∣∣∣ pause(0.3)∣∣∣ end∣∣∣ >> fprintf(′ Konnten Sie die Minimalstelle erkennen? \n′);∣∣∣ >>

7.4 Images

Ein weiteres Beispiel fur die Moglichkeiten mit Matlab:∣∣∣ >> load gatlin; image(X); colormap(map); axis off;∣∣∣ >>

image Pixelgraphik: Nimmt eine Matrix und interpretiert den Zahlenwert als einen Farbwert undplaziert ihn an die entsprechende Koordinate. Die Zahlenwerte durfen reell sein.

colormap Farbtafel: Mit colormap werden Farben definiert. Auch Graustufen sind Farben!

∣∣∣ >> clear;∣∣∣ >> clf;∣∣∣ >> X = rand(20);∣∣∣ >> image(X*60);∣∣∣ >> figure(2)∣∣∣ >> image(floor(X*3)*20);∣∣∣ >>

7.5 Aufgaben

Aufgabe 7.1 Gegeben sei der Datensatz A = [1, 4, 7, 1, 12];. Verwenden Sie diesen Datensatz, ummittels der Befehle

”stem“,

”bar“,

”stairs“ und

”pie“ Graphiken zu erzeugen.

Aufgabe 7.2 Betrachten Sie die Oberflache von exp(cos(x))∗sin(y) mit x, y ∈ [0, 10]. BeschriftenSie die Graphik.

Aufgabe 7.3 Betrachten Sie das Beispiel aus Abschnitt 7.3 und finden Sie alle Datenpunkte, andenen 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 grun 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 244the winner is 2074best result ever 488always second 1586no chance 110one vote 1

Fur diese Gremienwahl gilt eine 5% Hurde. Wieviel Prozent haben die einzelnen Parteien errungen?Stellen Sie das Ergebnis in dem dafur typischen Saulendiagramm dar. Wie sieht die Sitzverteilungdes 72 Mitglieder umfassenden Gremiums aus? Stellen Sie das Ergebnis in den dafur typischenKuchendiagramm dar. Beschriften Sie ihre Graphiken unter Verwendung des

”text“-Befehls.

Page 46: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

Kapitel 8

Verfahren der numerischenlinearen Algebra

Die Verfahren der numerischen linearen Algebra und die Tools zur Erzeugung von Graphiken sinddie beiden Eckpfeiler von Matlab. Da es so zahlreiche Verfahren der numerischen linearen Algebragibt, werden hier nur einige exemplarisch aufgefuhrt.

8.1 Gewohnliche Matrizen

8.1.1 Erzeugen von Matrizen und Vektoren

In den bisherigen Kapiteln haben wir bereits einige Varianten zur Erzeugung von Matrizen ken-nengelernt. Hier sind einige spezielle Matrizen aufgefuhrt.

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 uber 40 verschiedene Sondermatrizen, wie z.B: Toeplitz- und Ris-Matrizen. Die

zugehorige Hilfe kann mit dem Befehl”private“ aktiviert werden.

8.1.2 Rechnen mit Matrizen

Zur Wiederholung nochmals die Rechenoperationen, die fur Matrizen zur Verfugung stehen, sowieeinige weitere spezielle Funktionen, die nur fur Matrizen definiert sind.

A+B Addition A-B Subtraktion

A′ Transposition undkomplex konjungiert

A.′ Transposition

A 2 Potenz A*B Multiplikation

A.*B elementweise Multiplikation A/B Losen von XA = B

A\B Losen von AX = B A./B elementweise Division

expm(A) Matrixexponentialfunktion logm(A) Matrixlogarithmus

45

Page 47: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

KAPITEL 8. VERFAHREN DER NUMERISCHEN LINEAREN ALGEBRA 46

sqrtm(A) Quadratwurzel einer positivdefiniten Matrix

inv(A) Inverse zu A

norm 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

Falls A eine quadratische Matrix ist, so ist”expm(A)“ definiert als

expm(A) =

∞∑

k=1

1

k!Ak .

Nur falls A ein Skalar oder eine Diagonal-Matrix ist, gilt expm(A) = exp(A).Fur 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“ ausfuhrlich bespro-

chen. Nicht ganz so ausfuhrlich aber dafur in deutsch ist Robert Plato’s”Numerische Mathematik

kompakt“.

lu LR-Zerlegung: Mittels der Gauß-Elimination mit Zeilenpivotierung werden Matrizen L, U und Perzeugt mit LU = PA. Um alle drei Matrizen zu erhalten, ist der Befehl

”[L,U,P]=lu(A);“ zu

benutzen. Bei nur zwei Ruckgabewerten, 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 orthogonaleMatrix Q und eine obere Dreiecksmatrix R. Diese Operation ist zum Beispiel hilfreich beimLosen von kleinst-Quadrat-Aufgaben. Zum Updaten von QR-Zerlegungen sind die Befehle

”qrinsert“,

”qrdelete“ und

”qrupdate“ nutzlich.

chol Cholesky-Zerlegung: Die Cholesky-Zerlegung ist ein Spezialfall der LR-Zerlegung fur symme-trische positiv definite Matrizen. Dies spart viel Rechenaufwand und ist numerisch besser.

eig Eigenwert-Zerlegung: Berechnet die Jordan-Zerlegung einer Matrix. Es gibt viele weitere Ver-fahren in Matlab zum Berechnen von Eigenwert-Zerlegungen, z.B:

”schur“ und

”qz“.

svd Singularwert-Zerlegung: Die Singularwerte einer Matrix A sind die Quadratwurzeln der Ei-genwerte von AT A. Allerdings wird die Berechnung anders durchgefuhrt.

diag Diagonale: Liefert die Werte entlang der Diagonalen der Matrix bzw. nimmt einen Vektorund erzeugt die zugehorige 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+A′∣∣∣ >> eig(B)∣∣∣ >> C = sqrtm(B);∣∣∣ >> [V,D] = eig(B);

Page 48: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

KAPITEL 8. VERFAHREN DER NUMERISCHEN LINEAREN ALGEBRA 47

∣∣∣ >> E = diag(sqrt(diag(D)));∣∣∣ >> F= C-V*E*V ′∣∣∣ >>

Mit Hilfe der Befehle”diag“,

”tril“ und

”triu“ konnen iterative Verfahren zum Losen 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(′Fehler ||x − y||=%f \n′,norm(x-y));∣∣∣ end;∣∣∣ >>

8.2 Dunnbesetzte Matrizen

In vielen Anwendungen kommen sehr große und dunnbesetzte Matrizen vor. Das sind n × mMatrizen mit n, m 1000, wobei pro Zeile nur wenige Werte belegt sind, z.B. weniger als 1%.Fur solche Matrizen ist es sinnvoll speichereffiziente Darstellungen und Verfahren zu entwickeln.Speichereffiziente Darstellungen solcher Matrizen sind fester Bestandteil von Matlab. Die stan-dard Rechenoperationen sind auf dunnbesetzte Matrizen problemlos ubertragbar, allerdings sinddie Losungsoperatoren fur Gleichungen \ und / meistens nicht effizient. Zum Losen von solchenGleichungssystemen verwendet man statttdessen iterative Methoden.

8.2.1 Erzeugen dunnbesetzter Matrizen

sparse Konvertierung von voller zu dunner Matrix:”sparse(A)“ liefert die Matrix A, allerdings

werden alle Werte als Tripel (Zeile,Spalte,Wert) gespeichert, es sei denn, der Wert ist gleichNull. Der Aufruf

”sparse(n,m)“ erzeugt eine n × m Matrix mit den Eintragen Null. Da die

Nullen nicht gespeichert werden brauchen, wird nur das Format der Matrix gespeichert, sehreffizient.

speye dunne Einheitsmatrix: Der Unterschied zwischen”eye(n,m)“ und

”speye(n,m)“ ist nur das

Speicherformat.

spdiags Besetzen von Haupt- und Nebendiagonalen: Viele dunnbesetzte Matrizen haben eine Dia-gonalstruktur, das heißt die Zahlenwerte ungleich Null liegen auf der Haupt- und wenigenNebendiagonalen. Zum Erzeugen solcher Matrizen ist

”spdiags“ eine effiziente Routine.

Der Befehl”full“ ist das Gegenstuck 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);∣∣∣ >>

Page 49: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

KAPITEL 8. VERFAHREN DER NUMERISCHEN LINEAREN ALGEBRA 48

8.2.2 Iterative Verfahren zum Losen von linearen Gleichungssystemen

pcg Preconditioned Conjungate Gradient: Eines der besten iterativen Verfahren zum Losen dunn-besetzer linearer Gleichungssysteme, wenn die Matrix symmetrisch positiv definit ist.

cgs Conjungate Gradient Squared: Zum Losen indefiniter nicht singularer symmetrischer Glei-chungssyteme.

minres Minimum Residual: Ebenso zum Losen indefiniter, nicht singularer, symmetrischer Glei-chungssyteme.

gmres Generalized Minimum Residual: Zum Losen beliebiger nicht singularer 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 unvollstandig! Am besten schaut man sich hier die Hilfe-Seiten an undbesucht entsprechende Vorlesungen. Des weiteren ist hier das Buch von Youcef Saad,

”Iterative

Methods for Sparse Linear Systems“ hilfreich.In vielen Fallen benotigt 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 unddie erste obere und die erste untere Nebendiagonale den Wert −1 haben. Wie viel Speicherplatzverbraucht diese Matrix im dunnbesetzten und wie viel im vollbesetzten Format? (Verwenden sieden Befehl

”whos“.)

Aufgabe 8.2 Gegeben sei die Matrix aus Aufgabe 8.1. Berechnen Sie die zugehorige CholeskyZerlegung. 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

minx

‖Ax − b‖2. (8.1)

Die Losung des Ausgleichsproblem kann uber die Normalengleichung

AT Ax = AT b (8.2)

berechnet werden. Eine numerisch bessere Berechnung ist durch

Rx = QT b (8.3)

Page 50: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

KAPITEL 8. VERFAHREN DER NUMERISCHEN LINEAREN ALGEBRA 49

gegeben, wobei Q und R die Faktoren der QR-Zerlegung von A sind. Berechnen Sie die Losung von(8.1) mittels der Normalengleichung, (8.2), und der QR-Zerlegung, (8.3), fur die Matrix A undden Vektor b, die beide durch die Ausfuhrung des Skripts kleinstquad.m erzeugt werden.

Page 51: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

Kapitel 9

Numerische Verfahren

Zum numerischen Losen von mathematischen Problemen gibt es zusatzlich zu den Standardver-fahren sogenannte Toolboxen. Einen Uberblick uber alle Toolboxen erhalt man bei Mathworks.Die meisten Bucher zu Matlab oder unter Verwendung von Matlab betrachten spezielle Anwen-dungsgebiete und damit spezielle Toolboxen.

In diesem Kapitel beschranken wir uns auf eine Auswahl von Standardfunktionen.

9.1 Polynome

Die einfachste Klasse von Funktionen sind Polynome, fur die es in Matlab ein paar spezielleHilfsmittel gibt.

poly Konvertiert Nullstellen zu Koeffizienten: Fur einen Vektor von (komplexwertigen) Nullstellenwird ein Vektor mit den Koeffizienten desselben Polynoms berechnet. Der letzte Eintrag desresultierenden 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, wobeipi der Koeffizient von yi ist. x ist vom Typ Matrix. Hier wird jede Komponente von x alseine separate Auswertungsstelle betrachtet. Durch den Aufruf

”z=polyval(p,x)“ haben die

Eintrage von z die Form

zij =n∑

k=0

pk(xij)k.

roots Nullstellen eines Polynoms: Fur ein durch einen Koeffizienten-Vektor definiertes Polynomwerden 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: Fur vorgegebene Datenpunkte wird ein Polynom mit spezifizier-tem maximalen Rang gesucht, das den Fehler in den Datenpunkten minimiert.

spline Spline-Approximation: Stuckweise 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 zuruck, das aus derMultiplikation der beiden Eingangspolynome entsteht.

50

Page 52: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

KAPITEL 9. NUMERISCHE VERFAHREN 51

∣∣∣ >> % Das Beispiel p(x)= (x-1). 4∣∣∣ >> 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,′ ∗′);∣∣∣ >> 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),′y′);∣∣∣ >> plot(z,polyval(p2,z),′m′);∣∣∣ >> plot(z,polyval(p3,z),′r′);∣∣∣ >> plot(z,polyval(p4,(z-m(1))/m(2)),′k′);∣∣∣ >>

Nur in wenigen Fallen ist poly(roots(a)) ≈ a, da poly nur n Parameter hat, um n+1 Koeffizien-ten zu bestimmen. Es wird also ein normiertes Polynom zuruckgegeben. Damit ist das resultierendePolynom korrekt bis auf einen skalaren Multiplikator.

Obiges Problem ist schlecht konditioniert und fuhrt bei einer Approximation hoheren Gradeszum Abbruch des Verfahrens. Um eine bessere Konditionierung zu erhalten, benutzt man, wie obenfur die 4. Approximation geschehen, 3 Ruckgabewerte, siehe

”help polyfit“.

9.2 Quadratur

Die numerische Berechnung eines bestimmten Integrals wird als Quadratur bezeichnet.

quad adaptives Simpson-Verfahren:”quad(f,a,b)“ berechnet das Integral

b∫a

f(x)dx mittels des ad-

aptiven Simpson-Verfahrens. Der Fehler des Integrals ist fur glatte Funktionen kleiner als10−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

Page 53: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

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 Stutzstellen sein darf; also es ist auf elementweiseMultiplikation, 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 Eintragen.

randn Normalverteilte Zufallsvariablen: Wie”rand“, aber jetzt standard-normalverteilte Eintrage.

mean Erwartungswert: Berechnet zu einem Vektor den Erwartungswert. Falls die Eingabe eineMatrix 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 reprasentiert jede Zeile ein Zufalls-experiment und jede Spalte die Realisierungen einer Zufallsgrosse.

median Median: Arbeitet wie”mean“ und liefert den Median.

Ein ausfuhrlicheres 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 Nahe 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 Fun : Rn → R.

fminbnd Minimierung auf einem Intervall: Da die Minimierung auf einem Intervall eine haufigauftretende Aufgabe ist, gibt es dieses spezielle Werkzeug,

”fminbnd(Funktion,links,rechts)“.

Fouriertransformationen sind in der Numerik und vor allem in den Ingenieurwissenschaften Stan-dardwerkzeuge. Es stehen hier wiederum diverse Varianten zur Verfugung. Als Beispiel seien diebeiden klassischen Varianten erwahnt.

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 Lange 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 lasst sich die Polynommultiplikation schneller als aufdem direkten Weg losen.

∣∣∣ >> a = [2,3,1,6];∣∣∣ >> b = [7,1,3];∣∣∣ >> c = conv(a,b)∣∣∣ >> af = fft(a,8)

Page 54: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

KAPITEL 9. NUMERISCHE VERFAHREN 53

∣∣∣ >> bf = fft(b,8)∣∣∣ >> df = af.*bf∣∣∣ >> d = ifft(df)∣∣∣ >> d = d(find(d))∣∣∣ >>

9.5 Gewohnliche Differentialgleichungen

Zum Losen von Anfangswertaufgaben

d u

dt= f(t, u) u(0) = u0

stehen eine Reihe von Verfahren zur Verfugung.

ode113 ode15i ode15s ode23ode23s ode23t ode45

Obige Verfahren kombinieren eine Vielzahl von numerischen Ideen, um diverse Schwierigkeiten,die beim Losen von gewohnlichen Differentialgleichungen auftreten konnen, zu meistern. Fernerlassen sich diese Verfahren durch zahlreiche optionale Parameter tunen.

Die Verfahren”ode23s“ und

”ode15s“ sind zum Beispiel besonders geeignet steife Differential-

gleichungen zu losen.Ein Beispiel

u =

(−0.1 1−1 −0.1

)u u(0) =

(10

)(9.1)

hat die Losung

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),′r′);∣∣∣ >>

Eine deutlich ausfuhrlichere Beschreibung der ode-Loser kann in Higham & Higham”Matlab

guide“ gefunden werden.Zuweilen sind auch sogenannte Randwertaufgaben zu losen, z.B.

uxx + (1 − u)(1 + u2

x)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 zuruckfuhren. Doch haufig empfiehlt

sich ein Ansatz mittels Kollokation, siehe Quateroni/Sacco/Saleri”Numerische Mathematik II“

bzw.”Numerical Mathematics“.

bvp4c Randwertloser:”bvp4c“ ist ein effizienter, leistungsfahiger Randwertloser, der auf Kolloka-

tion beruht.

Page 55: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

KAPITEL 9. NUMERISCHE VERFAHREN 54

9.6 Partielle Differentialgleichungen

Partielle Differentialgleichungen kommen in praktischen Problemen (Anwendungen) haufig vor,wie z.B die Warmegleichung

∂ u

∂t=

∂2u

∂x2∀t ∈ [t0, T ], ∀x ∈ Ω.

Je nach Form der partiellen Differentialgleichung werden noch diverse Rand- und Anfangsbedin-gungen benotigt.

Zum Losen von einigen eindimensionalen, parabolischen und ellliptischen Differentialgleichun-gen der Form

c(x, t, u, ux)∂u

∂t= x−m ∂

∂x(xmf(x, t, u, ux)) + d(x, t, u, ux)

gibt es den Befehl”pdepe“, der die folgende Syntax hat:

Losung = pdepe(m,F,Start,Rand,Gitter,Zeit,Optionen)

Dabei ist m = 0, 1, 2 der Parameter aus der allg. Form der Differentialgleichung. Die Funktion Fist eine dreidimensionale Abbildung der Koeffizientenfunktionen und hat die Form

F (x, t, u, ux) −→

c(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 spezi-fiziert, oder, dass F innerhalb eines M-Files, in dem diese Differentialgleichung gelost werden soll,als Unterfunktion definiert ist. Start beinhaltet den Startwert u(0, x) = u0(x) an den Gitterpunk-ten Gitter. Die Funktion Rand erlaubt die Spezifizierung von allgemeinen Randbedingungen in aund b. Sollen die Rander der Differentialgleichung fur geeignete Funktionen pa, qa, pb und qb denBedingungen

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

genugen, so hat Rand die Form

Rand(xa, ua, xb, ub, t) −→

paqapbqb

,

wobei pa, qa, pb und qb Skalare sind. Fur Rand gilt die gleiche Einschrankung wie fur die Funkti-on F : Sie muss in einem M-File definiert werden.

9.7 Aufgaben

Aufgabe 9.1 Die Losung der Differentialgleichung (9.1) kann auf verschiedene Weise berechnetwerden. 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 ∗

t) ∗ V −1 ∗ u(0). Ferner kann man die Losungsformel (9.2) und den numerischen Loser”ode45“

verwenden. Berechnen Sie die Losung von (9.1) mittels der vier Methoden und vergleichen Sie dieGenauigkeit und den Zeitaufwand, der bei der Berechnung entsteht.

(Fur die Bestimmung des Zeitaufwands sind die Befehle”tic“ und

”toc“ hilfreich.)

Page 56: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

KAPITEL 9. NUMERISCHE VERFAHREN 55

Aufgabe 9.2 Fuhren 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 lautendie Nullstellten von p, q und p · q?

Aufgabe 9.4 Berechnen Sie die Losung der Warmegleichung 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 dieLosung graphisch darzustellen.

Page 57: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

Kapitel 10

Beispiele

10.1 Zufallszahlengeneratoren

In vielen praktischen Problemen sollen zufallige Ereignisse modelliert werden. Um dieses Problemam Computer zu realisieren, benotigt man Zufallszahlen. Da ein Computer streng deterministischarbeitet, kann er maximal Pseudo-Zufallszahlen erzeugen. Pseudo-Zufallszahlen sind Zahlen, diestreng deterministisch erzeugt sind, aber die Eigenschaften von Zufallszahlen haben. Dies hat denVorteil, dass Ergebnisse reproduzierbar sind.

Um Zufallszahlen zu erzeugen, gibt es eine Reihe von Ideen, einige werden im Anschluss vor-gestellt. Das Hauptaugenmerk aber wird sein, wie man diese

”Zufallszahlengeneratoren“ auf ihre

Qualitat pruft und naturlich 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) gewahlt, 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)

14∣∣∣ fprintf(′Nicht genuegend Eingangsvariablen\n′);

15∣∣∣ Y = -1;

16∣∣∣ return

17∣∣∣ end

18∣∣∣ if (nargin < 5)

19∣∣∣ if isempty(KongruenzX)

20∣∣∣ X = round(M/3+1);

56

Page 58: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

KAPITEL 10. BEISPIELE 57

21∣∣∣ else

22∣∣∣ X = KongruenzX;

23∣∣∣ end

24∣∣∣ else

25∣∣∣ X = S;

26∣∣∣ end

27∣∣∣ Y = zeros(n,1);

28∣∣∣ for i = 1:n

29∣∣∣ X = mod(a*X+b,M);

30∣∣∣ Y(i) = X/M;

31∣∣∣ end

32∣∣∣ KongruenzX = X;

33∣∣∣

Der Befehl”global“ stellt sicher, dass die Variable KongruenzX auch nach dem Beenden des

Programms und somit beim nachsten Aufruf noch existiert. Ferner definiert”global KongruenzX“

die Variable, wir erhalten also keine Fehlermeldung, wenn wir KongruenzX verwenden. Allerdingsist 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 = Ui − Uj

falls a < 0, setze a = a + 1Ui = X = aVerringere i und j um 1falls 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∣∣∣ % gewahlt, 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)

12∣∣∣ fprintf(′Nicht genuegend Eingangsvariablen\n′);

13∣∣∣ Y = -1;

14∣∣∣ return

15∣∣∣ end

16∣∣∣ if (nargin < 2)

17∣∣∣ if isempty(FibonacciX)

18∣∣∣ X = [7,18,21,4,9.29,sqrt(2),sqrt(5),3,2,17]/31;

19∣∣∣ I = 3;

20∣∣∣ J = 8;

21∣∣∣ K = 11;

22∣∣∣ else

Page 59: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

KAPITEL 10. BEISPIELE 58

23∣∣∣ X = FibonacciX;

24∣∣∣ I = FibonacciI;

25∣∣∣ J = FibonacciJ;

26∣∣∣ K = FibonacciK;

27∣∣∣ end

28∣∣∣ else

29∣∣∣ X = U;

30∣∣∣ K = length(U); I = round(K/3); J = round(4/5*K);

31∣∣∣ end

32∣∣∣ Y = zeros(n,1);

33∣∣∣ for i = 1:n

34∣∣∣ y = X(I)-X(J);

35∣∣∣ if (y < 0)

36∣∣∣ y = y+1;

37∣∣∣ end

38∣∣∣ Y(i) = y;

39∣∣∣ X(I) = y;

40∣∣∣ I = I-1; J = J-1;

41∣∣∣ if (I==0)

42∣∣∣ I = K;

43∣∣∣ end

44∣∣∣ if (J==0)

45∣∣∣ J = K;

46∣∣∣ end

47∣∣∣ end

48∣∣∣ FibonacciX = X;

49∣∣∣ FibonacciI = I;

50∣∣∣ FibonacciJ = J;

51∣∣∣ FibonacciK = K;

52∣∣∣

Um nun die einzelnen Zufallszahlengeneratoren auszutesten und in ihrer Qualitat zu beurteilen,noch ein paar nutzliche Werte zur Gleichverteilung:

Erwartungswert 1

2Varianz 1

12

Schiefe 0 Wolbung 1.8

Median 1

2

Die folgende Funktion berechnet die stochastischen Werte zu den obigen Kennzahlen und er-zeugt eine kleine Graphik, die die Streuung zweier aufeinander folgender Zufallszahlen demon-striert.

1∣∣∣ % Tester fur 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 durchgefuhrt.

7∣∣∣ % Dabei ist von Interesse, ob K aufeinanderfolgende Zufallszahlen

8∣∣∣ % korreliert sind.

Page 60: Programmieren mit Matlab | Eine Einfuhrungnumerik/lehre/Vorlesungen/Matlab_Vor_09/... · Kapitel 1 Einfuhrung 1.1 Allgemeines 1.1.1 Ziel des Kurses Erlernen von grundlegenden Kenntnissen

KAPITEL 10. BEISPIELE 59

9∣∣∣ function Kennzahlen = GeneratorTest(Gen,n,k)

10∣∣∣ X = Gen(n);

11∣∣∣ MX = mean(X);

12∣∣∣ Z = X-MX;

13∣∣∣ Kennzahlen.Erwartungswert = MX;

14∣∣∣ Kennzahlen.Varianz = var(X);

15∣∣∣ Kennzahlen.Schiefe = mean( Z. 3 );

16∣∣∣ M2 = mean( Z. 2);

17∣∣∣ M4 = mean( Z. 4);

18∣∣∣ Kennzahlen.Woelbung = M4/M2 2;

19∣∣∣ Kennzahlen.Median = median(X);

20∣∣∣ %%%%

21∣∣∣ % Nun bereiten wir die Korrelationsanalyse vor

22∣∣∣ %%%%

23∣∣∣ d = [1:n-k]’;

24∣∣∣ ind = d ∗ ones(1, k) + ones(n − k, 1) ∗ d(1 : k)′ − ones(n − k, k);

25∣∣∣ Y = X(ind);

26∣∣∣ C = cov(Y);

27∣∣∣ Kennzahlen.Unabhaengigkeit = norm(C – eye(k));

28∣∣∣ fiugre(1); clf;

29∣∣∣ if (n < 101)

30∣∣∣ plot(Y(:,1),Y(:,2),′ .′);

31∣∣∣ else

32∣∣∣ scatter(Y(:,1),Y(:,2),1);

33∣∣∣ end

34∣∣∣

Nun werten wir drei Beispiele aus und vergleichen Sie mit den zugehorigen Sollwerten.∣∣∣ >> Soll=struct(′Erwartungswert′,1/2,′Varianz′,1/12,...∣∣∣ ′Schiefe′,0,′Woelbung′,1.8,...∣∣∣ ′Median′,1/2,′Unabhaengigkeit′,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)∣∣∣ >>