Wissenschaftliches Rechnen – Grundlagen

Wissenschaftliches Rechnen – Grundlagen
(Studienjahr 2015/2016)
Stefan Brechtken
Skriptum basierend auf den Skripten von Doz.Dr.habil. Werner Vogt
Technische Universität Ilmenau
FG Numerische Mathematik und Informationsverarbeitung
98684 Ilmenau, Germany
e-mail: [email protected]
Kapitel 3 Teil 1
Programmierung
mit MATLAB
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
14. Oktober 2015
Eine Sprache erlernt man nur,
wenn man in ihr spricht –
eine neue Programmiersprache lernt man nur,
wenn man in ihr Programme schreibt.
∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗∗
(frei nach B. Kernighan und D. Richie)
Das ursprüngliche Scriptum entstand 2007 - 2012 während der Vorlesungen zu “Algorithmen und Programmierung“ und “Grundlagen des
Wissenschaftlichen Rechnens“. Diese Version wurde dem Vorlesungsstoff
“Grundlagen des Wissenschaftlichen Rechnens” angepasst und verkürzt.
Den Urheberretsansprüchen des Originals entsprechend ist dieser Teil
ausschließlich für den individuellen Gebrauch der Studierenden an der
Technischen Universität Ilmenau bestimmt.
Es ist einschließlich aller seiner Teile urheberrechtlich geschützt. Jede
Verwertung außerhalb der engen Grenzen des Urheberrechtsgesetzes,
insbesondere jegliche kommerzielle Nutzung, ist unzulässig und strafbar. Das gilt besonders für Vervielfältigungen, Übersetzungen, Mikroverfilmungen und die Einspeicherung und Verarbeitung in elektronischen
Systemen.
Inhaltsverzeichnis
3 Matlab
3.1 Datentypen in Matlab . . . . . . . . . . . . .
3.1.1 Grundlegende Sprachelemente . . . . . . .
3.1.2 Vordefinierte skalare Standardtypen . . . .
3.1.3 Arithmetische Ausdrücke . . . . . . . . . .
3.2 Programme in Matlab . . . . . . . . . . . . .
3.2.1 Deklaration und Aufruf eines Script-Files . .
3.2.2 Mathematische Standardfunktionen in Matlab
3.3 Bedingte Anweisungen (Selektion) . . . . . .
3.3.1 Bedingungen . . . . . . . . . . . . . . .
3.3.2 Einseitige if-Anweisung . . . . . . . . . .
3.3.3 Zweiseitige (vollständige) if-Anweisung . . .
3.3.4 Mehrseitige if-Anweisung . . . . . . . . .
3.3.5 Switch-Anweisung (Auswahlanweisung) . . .
3.4 Zyklusanweisungen (Repetition) . . . . . . .
3.4.1 While–Anweisung . . . . . . . . . . . . .
3.4.2 For–Anweisung . . . . . . . . . . . . . .
3.5 Prozedurale Programmierung . . . . . . . . .
3.5.1 Funktionsdeklaration und –definition . . . .
3.5.2 Funktionsaufruf . . . . . . . . . . . . . .
3.6 Lokale und globale Objekte . . . . . . . . . .
3.6.1 Lokale Programmobjekte . . . . . . . . .
3.6.2 Globale Programmobjekte . . . . . . . . .
3.6.3 Geschachtelte Funktionen . . . . . . . . .
3.7 Felder (arrays) . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
4
4
4
7
8
8
11
13
13
14
14
15
16
17
17
19
20
20
22
28
28
30
31
33
4
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
3.7.1
3.7.2
3.7.3
3.8
3.9
3.10
3.11
3.12
3.13
3.14
3.15
Feldkonstruktion . . . . . . . . . . . .
Operationen auf Feldern . . . . . . . . .
Feld–Manipulation . . . . . . . . . . .
2-dimensionale Grafik mit Feldern . . . . .
3.8.1 Das Plot-Kommando . . . . . . . . . .
3.8.2 Weitere 2D–Plots . . . . . . . . . . .
Algorithmen auf Zeichenketten . . . . . . .
3.9.1 Zeichenketten-Definition und -Verarbeitung
3.9.2 Datum und Uhrzeit . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Algorithmen auf mehrdimensionalen Feldern .
3.10.1 Feldkonstruktion und Feldallozierung . . . . .
3.10.2 Feldmanipulation und höherdimensionale Felder
Matrizen und lineare Systeme . . . . . . . . .
3.11.1 Arithmetik auf Matrizen . . . . . . . . . . .
3.11.2 Lineare Gleichungssysteme . . . . . . . . . .
3.11.3 Beschleunigung aller Algorithmen . . . . . .
3-dimensionale Grafik . . . . . . . . . . . . . .
3.12.1 Raumkurvendarstellung (plot3) . . . . . . . .
3.12.2 Gitter- und Flächendarstellungen . . . . . . .
Rekursive Algorithmen . . . . . . . . . . . . .
3.13.1 Direkte und indirekte Rekursivität . . . . . .
3.13.2 Abarbeitungsprinzip rekursiver Funktionen . .
3.13.3 Terminiertheit rekursiver Funktionen . . . . .
3.13.4 Entwurfsprinzipien rekursiver Algorithmen . . .
Algorithmen auf Strukturen und Dateien . . .
3.14.1 Algorithmen auf Strukturen (struct) . . . . .
3.14.2 Felder von Strukturen . . . . . . . . . . . .
Algorithmen auf Dateien (file) . . . . . . . . .
3.15.1 Diary-Files und Script-Files in Matlab . . .
33
35
36
38
38
40
41
41
44
46
46
49
50
50
51
53
53
53
54
56
57
57
61
61
64
64
66
67
69
0
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
3.15.2 Schreiben/ Lesen von Binärdateien . . .
3.15.3 Schreiben/ Lesen von ASCII-Textdateien
3.16 Symbolische Algorithmen und Grafik . . . . . .
3.16.1 Computeralgebra-Systeme . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
69
71
72
73
Kapitel 3
Matlab
Was ist Matlab?
• Matlab = Matrix Laboratory ist ein multifunktionales Programmsystem der Firma Mathworks (www.mathworks.com)
• Matlab besitzt eine imperative Programmiersprache zur strukturierten und zur prozeduralen Programmierung. Abstrakte Datentypen lassen sich generieren.
• Matlab arbeitet als Interpretersystem, wobei Compilation möglich
ist. Die Grundfunktionen liegen als schneller Code compiliert vor.
• Matlab ist anwendungsorientiert und wird weltweit von Tausenden von Ingenieuren (ET, MB, Regelungstechnik, Werkstofftechnik
etc.) und Naturwissenschaftlern erfolgreich in der Praxis eingesetzt.
Toolboxen von Matlab (Auswahl)
• Symbolic Math Toolbox – symbolisches Rechnen (CAS)
• Optimization Toolbox – lin. und nichtlin. Optimierung
• Partial Differential Equation Toolbox – Näherungslösung PDGLn
• Curve Fitting Toolbox – Approximation von Datenpunkten
• Statistics Toolbox – statistische Daten-Analyse
• Signal Processing Toolbox – digitale Signalverarbeitung
• Wavelet Toolbox – Signal- und Bildverarbeitung mit Wavelets
• Image Processing Toolbox – digitale Bildverarbeitung
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
2
• Video and Image Processing Blockset – Videoverarbeitung
• Financial Toolbox – finanzmathematische Analysen
• Financial Derivatives Toolbox – equity and fixed-income derivatives
Analysen
• Parallel Computing Toolbox – Parallelverarbeitung auf MulticoreComputern und Computer-Clustern
Erweiterungen von Matlab (Auswahl)
• Simulink – Simulation und Analyse dynamischer Systeme
• SimMechanics – Modellierung und Simulation mechanischer 3DSysteme mit Animation
• Stateflow – Design-Umgebung zur Entwicklung von Flussdiagrammen, automatische Generierung von C Code
Weitere Infos: www.mathworks.com/products
Integrierte Entwicklungsumgebung (IDE) von Matlab
• Benutzeroberfläche (konfigurierbar) mit
1.
2.
3.
4.
5.
6.
Kommandofenster (Command Window)
Aktuelles Verzeichnis (Current Directory)
Speicherbelegung (Workspace)
Kommando-Historie (Command History)
Menü- und Symbolleiste
Startpfad (Launch Pad)
• Texteditor (konfigurierbar) mit
1. Syntax-Hervorhebung (Highlighting), Nummerierung
2. Debugger zur schnellen Fehlersuche
• Hilfesystem mit
1. ausführlichem Matlab -Tutorial
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
3
2. Referenz aller Funktionen und Eigenschaften
3. Stichwort-Suche und Erläuterung
• Grafiksystem (leicht programmierbar) mit
1.
2.
3.
4.
Grafikfenstern für 2D- und 3D-Grafiken
Grafikeditor (Property Editor)
umfangreiche Visualisierungsfunktionen
GUIDE zur Schaffung grafischer Nutzeroberflächen (GUIs)
Alternative zu Matlab: GNU Octave
• gleicher Grundfunktionsumfang wie Matlab, gleiche Syntax
• vielzahl von Toolboxen (nicht vergleichbar mit Matlab)
• auf allen Plattformen verfügbar, open source und kostenlos
• ab Version 3.8 mit zu Matlab ähnlicher Grafikoberfläche
• https://www.gnu.org/software/octave/ =⇒ Downloads
• weitere Pakete für spezifische Aufgaben
http://octave.sourceforge.net/index.html
• Übungsaufgaben können mit Octave gelöst werden, solange auf Syntaxkompatibilität geachtet wird!
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
3.1
4
Datentypen in Matlab
3.1.1 Grundlegende Sprachelemente
Alphabet (Grundsymbole) :
⟨Buchstabe⟩
⟨Ziffer⟩
⟨Sonderzeichen⟩
⟨Grundsymbol⟩
::=
::=
::=
::=
A|B|C|...|Z|a|b|c|...|y|z
0|1|2|3|4|5|6|7|8|9
+| − | ∗ | = | < | > | . . . |⟨Schlüsselwort⟩
⟨Buchstabe⟩|⟨Ziffer⟩|⟨Sonderzeichen⟩
Hinweis: Matlab unterscheidet zwischen Groß- und Kleinbuchstaben,
es ist “case sensitiv“!
Wichtige Zeichen:
•
•
•
•
Semikolon (;) dient der Unterdrückung der Ausgabe!
Prozentzeichen (%) leitet eine Kommentarzeile ein!
3 Punkte (...) dienen der Fortsetzung einer Eingabezeile!
Wo 1 Leerzeichen stehen kann, dürfen beliebig viele stehen!
3.1.2 Vordefinierte skalare Standardtypen
Ein Datentyp definiert die Art der Werte, die eine Variable annehmen
kann. Jede Variable in einem Programm muß genau einem Datentyp zugeordnet werden. Das geschieht im allg. durch eine Wertzuweisung.
Matlab unterscheidet skalare Datentypen und strukturierte Datentypen. Letztere werden aus den skalaren Typen aufgebaut.
5
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
Standard-Datentypen:
1. Gleitpunkt-Typen (float-Typen) für reelle und komplexe Zahlen:
double, single
2. Ganzzahl-Typen (integer-Typen)für ganze und nat. Zahlen:
int8,uint8,int16,uint16,int32,uint32,int64,uint64
3. Logik-Typ (Boolscher Typ) für logische Wahrheitswerte:
logical mit Werten false, true (1 Byte)
4. Charakter-Typ für alphanumerische Zeichenketten:
'kette' mit Werten gemäß ASCII-Code (2 Bytes pro Zeichen)
ANSI/IEEE - Standard 754 zur Gleitpunktarithmetik
Zahlenformate :
single
single
extended
double
double
extended
Wortbreite
32 Bit
4 Byte
≥ 43 Bit
≥ 6 Byte
64 Bit
8 Byte
≥ 79 Bit
≥ 10 Byte
Mantissenbreite
Exponentenbreite
hidden bit
bias
24 Bit
8 Bit
ja
127
≥ 32 Bit
≥ 11 Bit
undefiniert
undefiniert
53 Bit
11 Bit
ja
1023
≥64 Bit
≥15 Bit
undefiniert
undefiniert
max. Exponent
min. Exponent
+127
−126
≥ +1023
≤ −1022
+1023
−1022
≥ +16383
≤ −16382
6.9 − 7.2
≥9.3 − 9.6
15.6 − 15.9
≥18.9 − 19.2
Dezimalstellen
größte Zahl
3.4 ∗ 10
kleinste norm. Zahl
1.2 ∗ 10−38
≤2.3 ∗ 10−308
2.3 ∗ 10−308
≤3.4 ∗ 10−4932
kl. denorm. Zahl
1.5 ∗ 10−45
≤1.7 ∗ 10−317
5.0 ∗ 10−324
≤3.7 ∗ 10−4951
+38
≥1.7 ∗ 10
+308
1.7 ∗ 10
+308
≥1.1 ∗ 10+4932
6
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
Ganzzahl-Typen für ganze und natürliche Zahlen:
MLTyp
VorAnz.
Zeichen Bytes
uint8
uint16
uint32
uint64
nein
nein
nein
nein
1
2
4
8
int8
int16
int32
int64
ja
ja
ja
ja
1
2
4
8
Wertebereich
GNUPascal
0 .. 28 − 1
0 .. 216 − 1
0 .. 232 − 1
0 .. 264 − 1
Byte
ShortWord
Word
LongWord
−27
−215
−231
−263
..
..
..
..
27 − 1
215 − 1
231 − 1
263 − 1
ByteInt
ShortInt
Integer
LongInt
Hinweise zur Nutzung von Datentypen:
• double ist der wesentlichste Datentyp, in dem standardmäßig alle
Rechengrüßen dargestellt und verarbeitet werden!
• Für single, int*, uint* stehen nur wenige Operationen zur
Verfügung; int64, uint64 sind reine Speicherkategorien!
• Logische Variablen können nur die Werte 0 (false) und 1 (true) annehmen!
• Zeichenketten (strings) sind Felder vom Typ char!
7
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
3.1.3 Arithmetische Ausdrücke
Variablen:
• Name besteht aus maximal 63 lat. Buchstaben, Ziffern, _ , erstes
Zeichen ist ein Buchstabe (siehe Bezeichner)
• keine Deklaration, Speicher Allokation bei Definition
• Datentyp kann explizit festgelegt werden (standard ist double)
• Freigabe mit clear, Anweisungssequenz mit ; , ...
Wertzuweisungen / Definition:
• Syntax
⟨Variablenname⟩ = ⟨Ausdruck⟩
⟨Variablenname⟩ = ⟨Datentyp⟩(⟨Ausdruck⟩)
• Einsicht in Speicherverwendung mittels whos
Aritmetische Operatoren und Ausdrücke:
Der Verknüpfung arithmetischer Variablen dienen folgende Operatoren:
Operator
Operation
()
^
+
*
/
\
+
-
(x)
x ^ y
- x
+ x
x * y
x / y
x \ y
x + y
x - y
Bedeutung
Prioritätsveränderung
Potenzierung xy
Negation −x
Vorzeichen +x
Multiplikation x ∗ y
Division x/y
Division y/x
Addition x + y
Subtraktion x − y
Auswertung
1
2
3
3
4
4
4
5
5
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
8
Hinweis: Operatoren mit gleicher Priorität werden von links nach rechts
abgearbeitet (Linksassoziativität). Mittels Klammerung können diese Prioritäten durchbrochen werden.
3.2
Programme in Matlab
Ein Programm ist eine geordnete oder strukturierte Menge von Anweisungen zur Abarbeitung eines Algorithmus. Ein Computerprogramm ist
die Formulierung eines Algorithmus in maschinell abarbeitbarer Form. In
Matlab entspricht dem im Wesentlichen das sogenannte Script-File.
3.2.1 Deklaration und Aufruf eines Script-Files
Ein Script-File ist eine Anweisungsfolge, die mit bel. Editor erstellt wird
und als ASCII-Datei unter ⟨Name⟩. m abgespeichert wird.
Kommentare: Zur Dokumentation sollen Kommentare nach % notiert werden. Die ersten Kommentarzeilen dienen der Hilfe. Ausgabe bei
help ⟨Name⟩ oder doc ⟨Name⟩
Programmaufruf:
• Er erfolgt mittels des Namens ⟨Name⟩.
• Das Script kann auf alle im Workspace befindlichen Objekte (des
aufrufenden Programmes) zugreifen.
• Alle berechneten Größen stehen auch nach Abarbeitung im Workspace zur Verfügung.
9
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
Eingabeanweisung (input-Anweisung):
• Syntax:
⟨Variable⟩ = input( ′⟨Eingabeprompt⟩′);
⟨Variable⟩ = input( ′⟨Eingabeprompt⟩′, ′s ′);
• Wirkung:
1. Form: Ausgabe von ⟨Eingabeprompt⟩ und Wartezustand (pause);
eingegebener Wert wird (nach Enter) der ⟨Variable⟩ zugewiesen.
2. Form: Zuweisung einer Zeichenkette (′s′ wie string)
Einfache Ausgabeanweisung (disp-Anweisung):
• Syntax:
disp(⟨Variable⟩)
oder
disp( ′⟨String⟩′)
• Wirkung: Ausgabe von ⟨Variable⟩ bzw. des Textes aus
disp( ′⟨String⟩′) ohne Variablennamen im gesetzten Format!
Kommando
Beschreibung
format
format
format
format
format
format
format
short
long
short e
long e
short g
long g
Festpunkt, 5 Dezimalstellen (Default)
Festpunkt, 15 Dezimalstellen
wie format short (Default)
Gleitpunkt, 5 Dezimalstellen
Gleitpunkt, 15 Dezimalstellen
Fest- oder Gleitpunkt, 5 Dezimalstellen
Fest- oder Gleitpunkt, 15 Dezimalstellen
format
format
format
format
hex
’+’
bank
rat
Hexadezimal-Format
Symbole +, - und Leerzeichen gedruckt
Festpunkt für Dollars und Cents
Approximation durch rationale Zahl
format compact
format loose
Unterdrückung von Leerzeilen
Einfügen von Leerzeilen
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
10
Ausgabe formatierter Daten (fprintf-Anweisung):
1. Syntax:
fprintf(⟨Format-String⟩, ⟨Arg1⟩, ⟨Arg2⟩, . . .)
fprintf( 1 , ⟨Format-String⟩, ⟨Arg1⟩, ⟨Arg2⟩, . . .)
2. Wirkung: ⟨Format-String⟩ enthält Umwandlungs-Spezifikationen
(wie in der Sprache C). Damit wird beschrieben, wie jedes Argument
⟨Arg1⟩, ⟨Arg2⟩, . . . auszugeben ist.
• Umwandlungs-Spezifikationen: % w . p c mit
– Feldbreite w (max. Zahl der Zeichen)
– Zahl der Stellen nach dem Dezimalpunkt p (optional)
– Umwandlungstyp c
• Wesentlichste Umwandlungstypen c sind:
c
Beschreibung
c
d
u
e, E
f
g, G
s
x, X
Einzelnes Zeichen
Dezimalnotation (ganzzahlig, signed)
Dezimalnotation (ganzzahlig, unsigned)
Gleitpunktnotation (3.1415e+002)
Festpunktnotation
Kompaktere Darstellung von e oder f
Zeichenketten-Notation
Hexadezimal-Notation
• Spezielle Steuerzeichen in ⟨Format-String⟩ sind:
Zeichen
Beschreibung
\b
\n
\t
%%
Backspace
Zeilenwechsel
Tabulator horizontal
Prozentzeichen
• Datei-Identifizierer: 1 = Bildschirm (optional)1
1
Die Arbeit mit Dateien (I/O) wird in Kapitel 8 behandelt.
11
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
3.2.2 Mathematische Standardfunktionen in Matlab
Aufruf
Bedeutung
abs(x)
sign(x)
sqrt(x)
pow2(x)
exp(x)
log(x)
log10(x)
log2(x)
|x|
Signum: −1, 0, +1
√
x
2x, x reell
ex
ln x, x > 0
lg x, x > 0
log2 x, x > 0
sin(x)
cos(x)
tan(x)
cot(x)
asin(x)
acos(x)
atan(x)
acot(x)
sin x, Bogenmaß
cos x, Bogenmaß
tan x, Bogenmaß
cot x, Bogenmaß
arcsin x
arccos x
arctan x
arccot x
sinh(x)
cosh(x)
tanh(x)
coth(x)
asinh(x)
acosh(x)
atanh(x)
acoth(x)
sinh x
cosh x
tanh x
coth x
asinh x
acosh x
atanh x
acoth x
Beispiele
sign(-2.4) ⇒ -1
sqrt(-1) ⇒ 0 + 1.0000i
pow2(-2.4) ⇒ 0.1895
exp(i) ⇒ 0.5403 + 0.8415i
sin(pi/2) ⇒ 1
tan(pi/2) ⇒ 1.6331e+016
cot(0) ⇒ ans = Inf
asin(1) ⇒ 1.57079632679490
tanh(10) ⇒ 0.99999999587769
coth(10) ⇒ 1.00000000412231
acosh(cosh(2)) ⇒ 2
acoth(1-i) ⇒ 0.4024 + 0.5536i
12
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
Mathematische Standardfunktionen in Matlab (Auswahl):
Aufruf
Bedeutung
Beispiele
fix(x)
floor(x)
ceil(x)
round(x)
mod(x,y)
Rundung in Richtung 0
Rundung gegen −∞
Rundung gegen +∞
Rundung zum nächsten Integer
Ganzer Rest von x/y
fix(3.55) ⇒ 3
floor(-3.55) ⇒ -4
ceil(-3.55) ⇒ -3
round(3.55) ⇒ 4
mod(41,17) ⇒ 7
abs(z)
angle(z)
real(z)
imag(z)
conj(z)
Absolutbetrag von z
Phasenwinkel von z
Realteil von z
Imaginärteil von z
Konjugiert komplexes von z
abs(-2i) ⇒ 2
angle(-2i) ⇒ -1.5708
real(2+5i) ⇒ 2
imag(2+5i) ⇒ 5
conj(2+5i) ⇒ 2 - 5i
Spezielle Variablen und Konstanten in Matlab (Auswahl):
Name
Bedeutung
Wert, Auftreten
ans
why
eps
realmax
realmin
Inf, inf
NaN
Aktuelle Antwort
UNBEKANNT
Rel. Gleitpunktgenauigkeit
Größte pos. Gleitpunktzahl
Kleinste pos. Gleitpunktzahl
Unendlich (∞)
“Not-a-Number“
ans = 2.6667
“The computer did it.“
2.220446049250313e-016
1.797693134862316e+308
2.225073858507201e-308
exp(1000) ⇒ Inf
0.0 / 0.0 ⇒ NaN
pi
i, j
exp(1)
Kreiszahl
Imaginäre Einheit
Basis der nat. Logarithmen
3.141592653589793e+000
√
−1
2.718281828459046e+000
13
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
Matlab besitzt strukturierte Anweisungen (Kontrollstrukturen):
• Bedingte Anweisungen
• Zyklusanweisungen
3.3
Bedingte Anweisungen (Selektion)
3.3.1 Bedingungen
If-Anweisungen führen das Programm in Abhängigkeit vom Wert einer
Bedingung aus, die die Form eines logischen Ausdruckes hat. Darin treten
Vergleichsoperatoren und logische Operatoren auf.
Vergleichsoperatoren in Matlab:
Name
Symbol
Bedeutung
eq
ne
ge
gt
le
lt
==
∼=
>=
>
<=
<
gleich
ungleich
größer gleich
größer als
kleiner gleich
kleiner als
Auswertung
7
7
7
7
7
7
Logische Operatoren in Matlab:
Name
Symbol
Bedeutung
and
&
&&
|
||
∼
logische UND
logisches UND (short circuit)
logisches ODER
logisches ODER (short circuit)
logisches NICHT
exclusives ODER
Partikularisator ∃
Generalisator ∀
or
not
xor
any
all
Auswertung
8
10
9
11
3
-
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
14
3.3.2 Einseitige if-Anweisung
Syntax:
PAP:
⟨Einseitige if -Anweisung⟩ ::= if ⟨Bedingung⟩
⟨Anweisungssequenz⟩
end
Struktogramm:
3.3.3 Zweiseitige (vollständige) if-Anweisung
Ausführung der Anweisungssequenz 1, falls die Bedingung erfüllt ist;
andernfalls erfolgt die Ausführung der Anweisungssequenz 2.
Syntax:
PAP:
⟨Zweiseit. if -Anweisung⟩ ::= if ⟨Bedingung⟩
⟨Anweisungssequenz 1⟩
else
⟨Anweisungssequenz 2⟩
end
Struktogramm:
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
15
3.3.4 Mehrseitige if-Anweisung
Wenn Anweisungssequenz 2 wiederum eine if-Anweisung enthält, wird
else und if zu elseif zusammengezogen und es entstehen so 3 Alternativen. Beliebig viele weitere elseif-Zweige können nun folgen.
Syntax:
PAP:
⟨Mehrseit. if-Anweisung⟩ ::= if ⟨Bedingung 1⟩
⟨Anweisungssequenz 1⟩
elseif ⟨Bedingung 2⟩
⟨Anweisungssequenz 2⟩
elseif ⟨Bedingung 3⟩
⟨Anweisungssequenz 3⟩
...
elseif ⟨Bedingung n-1⟩
⟨Anweisungssequenz n-1⟩
else
⟨Anweisungssequenz n⟩
end
Struktogramm:
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
16
3.3.5 Switch-Anweisung (Auswahlanweisung)
Struktur der switch-Anweisung:
switch
case
case
otherwise
⟨case-Ausdruck⟩
⟨Selektor 1⟩
⟨Anweisungen 1⟩
⟨Selektor 2⟩
⟨Anweisungen 2⟩
...
⟨Anweisungen n⟩
end
Bem.: Stimmt der Wert des Case-Ausdruckes mit einem Selektor überein, so wird dieser Fall abgearbeitet und die switch-Anweisung beendet!
Der otherwise-Fall entspricht dem else-Zweig und ist optional. Ein Selektor kann
• ein Einzelwert <wert_1> oder
• eine Liste von Einzelwerten (in geschweiften Klammern) sein:
{<wert_1>, <wert_2>, ..., <wert_n>}
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
3.4
17
Zyklusanweisungen (Repetition)
3.4.1 While–Anweisung
Die while-Anweisung ist abweisend bzw. Kopfgesteuert.
Syntax:
⟨while-Anweisung⟩ ::= while ⟨ Bedingung⟩
⟨Anweisungssequenz⟩
end
PAP:
Struktogramm:
Nichtabweisende, fußgesteuerte while-Anweisung:
Keine Kontrollstruktur vorhanden, Realisierung über logische “Flaggen”
(Statusindikatoren) oder die break-Anweisung.
• In if– und switch–Anweisungen beendet break diese Anweisung.
• In while– und for–Schleifen beendet break diese (innere) Schleife.
• Außerhalb von Anweisungen beendet break das Programm.
Syntax (flag):
while 1
% 1 == true
⟨Anweisungssequenz 1⟩
if ⟨ Bedingung⟩
break;
end
⟨Anweisungssequenz 2⟩
end
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
Syntax (break):f lag = true;
while f lag
% 1 == true
⟨Anweisungssequenz⟩
f lag = ⟨ Bedingung⟩;
end
PAP:
Struktogramm:
18
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
19
3.4.2 For–Anweisung
Die for-Anweisung (Laufanweisung, Zählschleife) nutzt man für Zyklen,
die durch eine Laufvariable (Kontrollvariable) Lv gesteuert werden. Diese
Variable durchläuft einen Laufbereich von einem Anfangswert Aw bis zu
einem Endwert Ew mit einer Schrittweite Sw.
Syntax: ⟨for-Anweisung⟩ ::= f or ⟨Laufvariable⟩ = ⟨Laufliste⟩
⟨Anweisungssequenz⟩
end
⟨Laufliste⟩ ::= ⟨Aw⟩ : ⟨Ew⟩ | ⟨Aw⟩ : ⟨Sw⟩ : ⟨Ew⟩ |
[Element1, . . . , Elementn] | . . .
Merke:
• Der Schleifenkopf wird nur genau einmal ausgewertet.
• Die for-Anweisung ist abweisend, d.h. zuerst wird die Zulässigkeit
der Laufvariablen geprüft!
Geschachtelte for–Anweisungen:
Eine Zyklusanweisung kann komplett im Schleifenkörper einer anderen
Zyklusanweisung liegen (geschachtelte Zyklen). Die Schleifenkörper dürfen dann einander nicht überschneiden. Geschachtelte for-Anweisungen
dürfen nicht ein- und dieselbe Laufvariable besitzen.
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
3.5
20
Prozedurale Programmierung
Ziel: Universalität, Unabhängigkeit
Lösung: Unterprogramme (Prozeduren)
Definition 1 : Prozedur 2
Eine Prozedur ist eine Folge von Anweisungen (Aktionen), die einen in
sich abgeschlossenen Programmteil darstellt, der von einem anderen Programmteil aus aufgerufen, d.h. ausgeführt werden kann. Eine Prozedur
hat eine Schnittstelle, die ihren Namen, die zulässigen Eingabeobjekte
(auch Argumente genannt) und das Resultat, d.h. die nach der Ausführung vorliegenden Resultatobjekte, spezifiziert. Bei jeder Funktion (function) sind zu unterscheiden:
• Deklaration (+ Definition, Vereinbarung der Funktion)
• Aufruf (Aktivierung der Funktion)
3.5.1 Funktionsdeklaration und –definition
Jede Funktion besteht aus dem Funktionskopf, gefolgt vom Funktionsblock.
Eine Funktionsdeklaration kann (wie ein Script-File) mit bel. Editor erstellt werden und ist als separate ASCII-Datei unter ⟨N ame⟩.m
abzuspeichern (deshalb auch: “M-File“).
(a) Funktionskopf
⟨Funktionskopf⟩ ::= function [⟨Rückgabeparameter⟩]
= ⟨Funktionsname⟩
(⟨Eingangsparameter⟩)
⟨Rückgabeparameter⟩ ::= ⟨Variable⟩{, ⟨Variable⟩}
⟨Eingangsparameter⟩ ::= ⟨Variable⟩{, ⟨Variable⟩}
Syntax:
2
Rechenberg,P.; Pomberger,G.(Hrsg.): Informatik-Handbuch. 4. erw. Auflage. Hanser Verlag 2006
21
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
Semantik:
• Der Funktionsname darf im nachfolgenden Funktionsblock benutzt
werden ⇒ rekursive Funktion.
• Eingangs- und/oder Rückgabeparameter können fehlen.
(b) Funktionsblock
Besteht aus Anweisungssequenz, alle Kontrollstrukturen sind zulässig.
Alle Eingangsparameter dürfen verwendet werden. Rückgabeparameter
dürfen nach Definition wie Variablen verwendet werden.
Hilfetext zu Funktionen: help <Funktionsname> bzw.
doc <Funktionsname>
Auftretende Parameterarten:
• Funktionsparameter = formale Parameter:
Eingangs- Rückgabeparameter, da die aktuellen Werte zum Zeitpunkt der Deklaration nicht bekannt sind, dienen sie als “Platzhalter“.
• Hilfsparameter = lokale Parameter:
Alle Variablen die innerhalb der Funktion definiert werden und nicht
im Funktionskopf stehen. Bei Verlassen der Funktion wird ihr Speicherplatz automatisch freigegeben.
Return–Anweisung:
Sie bewirkt den unmittelbaren
Rücksprung aus der Funktion
in das aufrufende Programm
bzw. in das Kommandofenster
(im interaktiven Modus).
function y = f(x)
...
y = 0;
if abs(x) > 1
return
end
...
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
22
3.5.2 Funktionsaufruf
Der Funktionsaufruf aktiviert den Funktionsblock und überträgt ihm die
Steuerung des Programmablaufes. Dabei werden die formalen Parameter
durch aktuelle Parameter (Argumente) ersetzt.3
Funktionen können aufgerufen werden:
• aus dem Kommandofenster, einem Programm, einer Funktion
Syntax des Funktionsaufrufes
[⟨Rückgabeargumente⟩] = ⟨Funktionsname⟩(⟨Eingangsargumente⟩) |
⟨Funktionsname⟩ (⟨Eingangsargumente⟩)
⟨Rückgabeargumente⟩ ::= ⟨Variable⟩{, ⟨Variable⟩}
⟨Eingangsargumente⟩ ::= ⟨Ausdruck⟩{, ⟨Ausdruck⟩}
Semantik:
• Eingabeargumente können Variablen, aber auch Ausdrücke (auswertbar) und insbesondere Konstanten sein.
• Funktionen können innerhalb von Ausdrücken aufgerufen werden.
Semantik:
• Das erste Rückgabeargument ist das “Hauptresultat“ und kann direkt verarbeitet werden.
• Zuordnung der aktuellen Parameter dem entsprechenden Formalparameter der Reihenfolge nach zugeordnet.
• Folge: Anzahl und Typen der Parameter sollten übereinstimmen,
Bezeichner hingegen können sich unterscheiden.
3
Matlab übersetzt beim ersten Aufruf die Funktion in eine interne Form; weitere Aufrufe sind schneller.
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
23
Parameterübergabe
Eine Variable kann benutzt werden, wenn sie
(a) einen Namen,
(b) eine Speicheradresse und
(c) einen Wert
besitzt. Formale Parameter besitzen anfangs jedoch nur Namen und
Adresse. In imperativen Sprachen sind 2 Mechanismen der Wertvermittlung üblich:
(a) Referenzaufruf (Namensaufruf, call by name)
• nicht vorgesehen
• Hinweis: mittels libpointer sehr eingeschränkt möglich.
(b) Wertaufruf (call by value)
• Realisierung:
– Automatische Bildung einer lokalen Hilfsvariablen
– Berechnung des Wertes des aktuellen Parameters und Zuweisung zur Hilfsvariablen
– Direkte Verwendung der Hilfsvariablen und ihres Wertes im Funktionsblock
• Bezeichnung: Wertparameter (hier: a, b, epsi)
• Konsequenzen:
– Aktueller Parameter e kann eine Variable, Konstante oder ein
Ausdruck sein
– Variablen des aufrufenden Programmes behalten ihren Wert; es
findet keine wertmäßige Veränderung statt
• Hinweis: Matlab benutzt stets Wertaufruf für alle Parameter!
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
24
Frage: Wie werden transiente Parameter behandelt, die zugleich Eingangs- und auch Ergebnisparameter sind?
Variable Argumentzahl und optionale Parameter
Nicht übergebene Parameter dürfen nicht genutzt werden.
Die optionale Verwendung von Formalparametern wird durch 2 Funktionen unterstützt:
• nargin liefert im Funktionskörper die Zahl der Eingangsargumente,
• nargout liefert im Funktionskörper die Zahl der Ergebnisargumente,
die im aktuellen Aufruf dieser Funktion benutzt werden.
Anwendung von nargin und nargout:
Abfrage der Werte und Besetzen der fehlenden Parameterwerte mit
Default-Werten.
Hinweis:
nargin und nargout sind parameterlose Funktionen; deshalb kann ihr
Wert nicht verändert werden (d.h. nargin = nargin+1 ist falsch).
Funktionsnamen als Parameter
Viele Sprachen gestatten auch Funktionsnamen als Formalparameter an
die aufrufende Funktion bzw. ein Script-File zu übergeben.
Funktionszeiger (function handle):
Hinter dem Namen f verbirgt sich die konstante Startadresse dieser
Funktion. Variablen zur Aufnahme von Adressen werden als Zeigervariablen (Zeiger, pointer) bezeichnet. Matlab benutzt den Begriff “function
handle“ (Funktionszeiger), der auch manipulierbar ist. Ein Wert eines
Funktionszeigers wird mit @⟨Funktionsname⟩ bezeichnet.
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
25
Auswertung des Funktionszeigers zur Funktionswert-Berechnung durch
direkten Aufruf:
Syntax:
⟨Funktionszeiger⟩({⟨Funktionsparameter⟩} )
Semantik:
Anzahl und Reihenfolge der Parameter muss mit den Variablen der Funktion f (var1, var2, . . . , varn) korrespondieren.
Hilfe zu Funktionszeigern:
functions ( ⟨Funktionszeiger⟩ )
Anonyme Funktionen:
Einfache (typischerweise mathematische) Funktionen können elegant und
kurz innerhalb des Kommandofensters, von Skriptfiles und von Funktionsdefinitionen erklärt werden. Sie können beliebig viele Ein- und Ausgabeparameter besitzen.
Syntax:
⟨Fkt.name⟩ = @(⟨Eingangsp.⟩)[⟨Rückgabep.⟩]
⟨Rückgabeparameter⟩ ::= ⟨Variable⟩{, ⟨Variable⟩}
⟨Eingangsparameter⟩ ::= ⟨Variable⟩{, ⟨Variable⟩}
Semantik:
Es wird eine Speicheradresse angelegt und Speicher alloziert. In diesen Speicherbereich wird die anonyme Funktion abgespeichert und die
Startadresse wird dem Funktionszeiger zugewiesen. Die Funktion ist ausschließlich über diesen Zeiger zu erreichen und ansonsten nicht vorhanden (anonyme Funktion). Man kann nun mit diesem Funktionszeiger wie
mit jedem anderen Funktionszeiger arbeiten.
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
26
Bemerkung:
Rückgabe von mehr als einem Parameter geschieht als eindimensionales
Feld, im Unterschied zu nicht anonymen Funktionen. Warum?
Die Matlab–Funktion fzero
fzero basiert auf einem klassischen Algorithmus von T. Dekker mit Bisektions-, Sekanten-Verfahren und inverser quadratischer Interpolation
(>> doc fzero).
Hinweis: Prinzipien der Programmentwicklung
Bisher wurden einfache Probleme betrachtet, deren Algorithmierung,
Programmierung, Implementierung und Erprobung durch 1 Person ausgeführt werden konnte.
Bei umfangreichen Projekten ist jedoch eine Korrespondenz zwischen
Auftraggeber, Programmentwickler und Programmnutzer erforderlich,
um
– die Struktur der Ein- und Ausgabedaten
– die Struktur des Programmes und seiner Teile
endgültig festzulegen.
Systematisierung des Entwicklungsprozesses:
(1) Anforderungsdefinition: Festlegung der Aufgabenstellung
(2) Problemanalyse: Algorithmierung wesentlicher Teilschritte
(3) Festlegung der logischen Programmstruktur (Schrittalg.)
(4) Entwicklung der physischen Programmstruktur
(5) Programmerprobung: Verifikation, Optimierung
(6) Programmanalyse: Alternativen und Aufwandsvergleiche
27
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
Höhere transzendente Funktionen in Matlab (Auswahl):
Aufruf
Bedeutung
Bemerkung
gamma(x)
gammainc(x,a)
gammaln(x)
psi(k,x)
Gammafunktion Γ(x), x reell
Unvollständige Gammafunktion
Logarithmus der Gammafkt.
Polygammafunktion
Γ(n + 1) = n!
x, a reell
beta(z,w)
betainc(x,z,w)
betaln(z,w)
Betafunktion B(z, w)
Unvollständige Betafunktion
Logarithmus der Betafunktion
z, w reell [s.u.]
x ∈ [0, 1]
airy(k,z)
besselj(ν,z)
bessely(ν,z)
besselh(ν,k,z)
besseli(ν,z)
besselk(ν,z)
Airy–Funktionen Ai und Bi
Bessel-Funktionen 1. Art
Bessel-Funktionen 2. Art
Bessel-Funktionen 3. Art
Modif. Bessel-Fktnen. 1. Art
Modif. Bessel-Fktnen. 2. Art
k
z
z
k
z
z
expint(x)
ellipj(u,m)
ellipke(m)
Exponentialintegral E1(x)
Jacobi’sche ellipt. Fktnen.
Vollst. ellipt. Integral
x komplex
m ∈ [0, 1]
1. und 2. Gattung
erf(x)
erfc(x)
erfinv(x)
erfcinv(x)
Fehlerintegral (error function)
komplementäres Fehlerintegral
inverses Fehlerintegral
inverses kompl. Fehlerintegral
x
x
x
x
Beispiele:
∈ {0, 1, 2, 3}
komplex, ν reell
komplex, ν > 0
∈ {1, 2}
komplex, ν reell
komplex, ν reell
reell [s.u.]
reell
∈ [−1, 1]
∈ [0, 2]
∫1
xz−1 (1−x)w−1 dx,
B(z, w) =
0
erf(x) =
2
∫x
π
0
e−t dt
2
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
3.6
28
Lokale und globale Objekte
3.6.1 Lokale Programmobjekte
Der Programmblock besteht - wie der Funktionsblock - aus einer Anweisungssequenz, die in dieser natürlichen Reihenfolge abgearbeitet wird.
Auf die in einem Block vereinbarten Datenobjekte kann man innerhalb
dieses Blockes zugreifen, man kann sie verarbeiten. In Matlab muss
man jedoch zwischen Script-Files und Function-Files unterscheiden:
• Blöcke von Script-Files bilden keinen eigenen Vereinbarungsblock:
Das Script kann auf alle Objekte der Umgebung zugreifen und diese
wiederum auf alle im Script eingeführten Objekte. Alle befinden sich
im Workspace von Matlab , z.B. auf oberstem Niveau (1).
• Jeder Funktionsblock eröffnet ein neues Vereinbarungsniveau (2)
mit eigenem Workspace. Matlab 7 gestattet auch die Deklaration
von Funktionen im Innern von Funktionsblöcken (sog. geschachtelte Funktionen, nested functions) womit Vereinbarungsniveaus 3,4,…
eröffnet werden können.
Prinzip der rationellen Speichernutzung:
Zielsetzung der Blockstrukturierung: Allen Programmobjekten (Variablen, Funktionen etc.) ist nur so lange Speicherplatz zuzuweisen, wie sie
gebraucht werden!
Lebensdauer eines Programmobjektes:
Die Lebensdauer eines Objektes definiert den Zeitraum, in dem den Namen im Speicher reale, physikalische Objekte zugewiesen sind. In Matlab unterscheiden wir
• statische Objekte:4 Verfügbarkeit im Workspace von Matlab während der gesamten Matlab -Sitzung, betrifft Variablen auf Niveau
1 sowie Funktionen im Suchpfad von Matlab
4
Zur Unterscheidung von den expliziten globalen Objekten (global) wird hier dieser Terminus benutzt.
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
29
• lokale Objekte: Zuweisung bei Eintritt in einen Funktionsblock und
(“automatischer“) Verlust des Speicherplatzes bei Verlassen dieses
Blockes; betrifft Variablen und Funktionen auf Niveaus 2,3,...
• globale Objekte: Verfügbarkeit aus allen Funktionen und Scripten,
in denen diese Objekte explizit mit global benannt werden.
Hinweis: Imperative Sprachen (C, Pascal etc.) unterscheiden die statische, automatische und dynamische Speicherklasse. Laufzeit-Objekte mit dynamischer Lebensdauer erfordern spezielle Aktionen zur Allozierung und Disallozierung von Speicherplatz.
Gültigkeitsbereich G eines Namens:
Der Gültigkeitsbereich G ist derjenige Programmteil, in dem über den
Namen auf das Objekt zugegriffen werden kann. Matlab legt fest:
• Statische Objekte: im Kommandomodus und in allen direkt aufgerufenen Script-Files auf direkter Anweisungsebene (Niveau 1)
• Lokale Objekte: G ist genau derjenige Funktionsblock B, in dem
der zugehörige Name auf direkter Anweisungsebene benutzt wird.
Der Terminus “direkte Anweisungsebene“ schließt bei Funktionsaufrufen
deren Blöcke aus.
Sichtbarkeit eines Namens:
Unter der Sichtbarkeit eines Namens versteht man denjenigen Teil seines
Gültigkeitsbereiches, von dem aus ein zulässiger Zugriff auf das Objekt
möglich ist. Das Auftreten eines doppelten Bezeichners unterbricht die
Sichtbarkeit, die erst wieder eintritt, wenn der Gültigkeitsbereich des
doppelten Namens endet.
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
30
3.6.2 Globale Programmobjekte
Zugriff aus unterschiedlichen Funktionen auf ein-und-dieselbe Variable
wird durch die explizite Deklaration mit global möglich.
Syntax der global-Deklaration:
global ⟨Name⟩ | global ⟨Name⟩ {⟨Name⟩}
Semantik:
Bei der ersten global-Deklaration wird eine Variable ⟨Name⟩ im “globalen
Workspace“ angelegt. Bei jeder weiteren global-Deklaration dieser Variablen wird im “lokalen Workspace“ der betreffenden Funktion eine Referenz auf die globale Variable angelegt.
Empfehlungen:
• Die Benutzung globaler Objekte innerhalb von Funktionen sollte im
Interesse der Klarheit und Universalität weitgehend vermieden werden.
• Mitunter macht der - sparsame - Einsatz globaler Variablen jedoch
Sinn, z.B. bei der Behandlung von Systemparametern (Konstanten)
in Funktionen.
• Bei globalen Variablen sollte eine wertmäßige Veränderung innerhalb
von Funktionsblöcken möglichst unterbleiben.
Freigabe von Speicherplatz mit clear:
Das Kommando clear gibt Speicherplatz von Variablen, Funktionen und
Klassendefinitionen unmittelbar frei. Wesentliche Anwendungen sind:
• clear all löscht alle lokalen und globalen Variablen, Funktionen und
MEX-Links (vgl. demosimpson.m u.a. Scripte).
• clear löscht alle lokalen Variablen im jeweiligen Workspace.
• clear global löscht physisch alle globalen Variablen.
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
31
• clear var1 var2 ... löscht die angegebene Variablen.
• clear global var1 var2 ... löscht diese globalen Variablen.
Hinweis: Falls var global ist, so entfernt clear var es vom aktuellen
Workspace, belässt es jedoch in allen Funktionen, die es als global deklariert haben.
3.6.3 Geschachtelte Funktionen
Drei Varianten der Organisation eines Projektes:
• Klassische Gliederung in separate functions
• Gliederung mit subfunctions
• Gliederung mit nested functions.
(a) Gliederung in separate functions
Jede Function f und jedes Script s wird separat und i.allg. mit Dateinamen f.m bzw. s.m gespeichert.
(b) Gliederung mit Subfunctions
Eine (Haupt-)Function f kann mehrere Subfunctions f1, f2, ..., fn besitzen. Diese werden seriell im Function-File mit Dateinamen f.m definiert.
(c) Gliederung mit Nested functions
Eine Function g kann ganz im Innern einer Function f definiert werden. g kann wiederum im Innern eine Function h enthalten usw. Diese
“geschachtelten Funktionen“ (engl.: nested functions) werden im Function-File mit Dateinamen f.m definiert
Merke: Das Ende jeder Funktion ist nun mit dem Schlüsselwort end zu
kennzeichnen!
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
32
Grundlegende Datenstrukturen
Bisher wurden die vordefinierten Datentypen
• double, single (Gleitpunkttypen)
• int8, int16, int32, int64,
uint8, unit16, uint32, uint64 (Speichertypen)
• char (Zeichentyp)
• logical (Logiktyp; in Matlab wird er nur simuliert)
für skalare Daten benutzt. Weitere (abstrakte) Datentypen können mit
dem Klassenkonzept der objektorientierten Programmierung in Matlab selbst definiert werden.
Datenstrukturen entstehen durch Zusammenfassung skalarer Daten zu
Aggregaten, die über einen Namen angesprochen und verarbeitet werden
können.
3 grundlegende Datenstrukturen:
1. Felder (array) mit nummerierten (indizierten) Elementen ein- und
desselben beliebigen Basistyps
2. Records (struct) mit benannten Datenfeldern (named fields) verschiedener und beliebiger Datentypen
3. Zellen (cell array) mit nummerierten (indizierten) Datenfeldern verschiedener und beliebiger Datentypen.
Zeichenketten (character strings) werden als Felder auf dem Basistyp
char behandelt.
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
3.7
33
Felder (arrays)
Definition 1 : Feld (array)
• Ein Feld ist eine aus einer festgelegten Anzahl von Komponenten
gleichen Typs bestehende Datenstruktur.
• Zugriff auf eine Komponente des Feldes erfolgt durch Angabe von
Indizes.
• Die Anzahl der Indizes zur Auswahl einer Komponente gibt die
Dimension des Feldes an. Diese kann beliebig groß sein.
Felder (arrays) sind die häufigsten Datenstrukturen im Bereich mathematisch-naturwissenschaftlich-technischer Algorithmen. Die Festlegung
der Strukur dieser Daten einschließlich des Speicherbedarfs (Allozierung)
erfolgt in Matlab dynamisch (d.h. während der Abarbeitung). Felder
können dynamisch verändert bzw. disalloziert werden.
3.7.1 Feldkonstruktion
Sie kann durch Zusammenfassung mittels Klammern erfolgen. Kommata
bzw. Leerzeichen wirken als Trennzeichen der Elemente. Syntax:
⟨Feldkonstruktion⟩ ::= [ Element1, Element2, . . . , Elementn ] |
[ Element1 Element2 . . . Elementn ]
Semantik:
• Die Anzahl n der Elemente ist die Länge des Feldes x. length(x) und
size(x) liefern diese Zahl n.
• Mathematisch wird das Feld x als Zeilenvektor (row vector) bezeichnet. Die Elemente werden in der Zeile ausgegeben.
• Wird x als Spaltenvektor (column vector) gewünscht, so notieren wir
x’ (Zeichen für Transposition) bzw. benutzen anstelle des Kommas
bei der Konstruktion das Semikolon.
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
34
Konstruktion spezieller Felder:
1. Laufbereich mit Schrittweiten-Angabe:
Anfangswert : Schrittweite : Endwert | Anfangswert : Endwert
2. Linearer Laufbereich mit Anzahl der Werte:
linspace(Anfangswert, Endwert, Zahl der Werte)
3. Logarithmischer Laufbereich mit Anzahl der Werte:
logspace(Anfangsexponent, Endexponent, Zahl der Werte)
Indizierte Variablen:
Der Zugriff auf eine Feldkomponente erfolgt durch Angabe der dafür
nötigen Indizes.
Syntax:
⟨Feldvariable⟩ (⟨Index⟩) | ⟨Feldvariable⟩ (⟨Indexfeld⟩)
Semantik:
• Index steht für eine einzelne Komponente. Der Ausdruck wird ausgewertet und die Komponente ausgewählt. end steht stets für die
letzte Komponente!
• Indexfeld kann nach bisherigen Regeln gebildet werden und steht für
ein Teilfeld mit Werten im Indexbereich!
35
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
3.7.2 Operationen auf Feldern
Arithmetik auf Feldern:
• Skalar– Feld–Arithmetik: Addition, Subtraktion, Multiplikation, Division von Feld und Skalar
• Feld–Feld–Arithmetik: Elementweise Verknüpfung durch Addition,
Subtraktion, Multiplikation oder Division, falls gleiche Feldlänge vorliegt
Definition der Feld–Arithmetik:
a = [a1, a2, . . . , an],
b = [b1, b2, . . . , bn],
c
skalar
Operation
Resultat
Skalar–Addition
Skalar–Subtraktion
Skalar–Multiplikation
a + c = [a1 + c, a2 + c, . . . , an + c]
a − c = [a1 − c, a2 − c, . . . , an − c]
a ∗ c = [a1 ∗ c, a2 ∗ c, . . . , an ∗ c]
Feld–Addition
Feld–Subtraktion
Feld–Multiplikation
Rechts–Division
Links–Division
a + b = [a1 + b1, a2 + b2, . . . , an + bn]
a − b = [a1 − b1, a2 − b2, . . . , an − bn]
a .∗ b = [a1 ∗ b1, a2 ∗ b2, . . . , an ∗ bn]
a ./b = [a1/b1, a2/b2, . . . , an/bn]
a .\ b = [a1\b1, a2\b2, . . . , an\bn]
Feld–Potenzen
a .∧ c = [a1 ∧ c, a2 ∧ c, . . . , an ∧ c]
c .∧ b = [c ∧ b1, c ∧ b2, . . . , c ∧ bn]
a .∧ b = [a1 ∧ b1, a2 ∧ b2, . . . , an ∧ bn]
Interpretation der beiden Divisionen:
a/b :=
a
b
,
a\b :=
b
a
36
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
Funktionen auf Feldern:
Die Standardfunktionen können auf Feldargumente angewandt werden.
Bei selbst-definierten Funktionen ist auf Feldarithmetik zu achten, um
sie für Feldanwendungen listenfähig (listable) zu machen!
Funktionen auf Feldern x zur Datenanalyse:
Matlab verfügt über zahlreiche Funktionen, z.B zur Datenanalyse
∑
∏
• sum(x) = ni=1 xi,
prod(x) = ni=1 xi
√∑
n
x2i = sqrt(sum(a .* a))
•
norm(x) =
•
max(x) = max xi,
i=1
min(x) = min xi
i=1(1)n
i=1(1)n
•
•
1
n
mean(x) = x =
wert)
std(x) =
√
1
n−1
∑n
∑n
i=1
i=1 (xi
xi
(arith. Mittel, Erwartungs-
− x)2
(Standardabweichung)
Hinweis: Man nutze diese Funktionen anstelle der for-Zyklen!
3.7.3 Feld–Manipulation
Felder werden dynamisch alloziert und können deshalb während der Abarbeitung vergrößert, verkleinert, zusammengefügt und (mit clear) auch
disalloziert werden.
1. Verändern und Expandieren von Feldern
2. Zusammenfügen von Feldern
3. Verkleinern von Feldern
4. Teilfelder
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
5. bedingte Teilfelder
(a) logische Vektoren / Felder
(b) logische Vektoren / Felder im Indexbereich
(c) Indexfelder von Teilfeldern - find
6. Feldvergleich und Mengenoperationen
Funktion
Bedeutung
isequal(a,b)
ismember(a,b)
intersect(a,b)
union(a,b)
setdiff(a,b)
setxor(a,b)
True, falls a und b identisch sind
True, falls a ganz in b enthalten ist
Werte im Durchschnitt von a und b
Werte in der Vereinigung von a und b
Werte von a, die nicht in b sind
Werte im exclusiven ODER von a und b
37
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
3.8
38
2-dimensionale Grafik mit Feldern
Matlab kann numerische Daten als Punkte und Linien in 2 Dimensionen (2D) sowie als Flächen in 3 Dimensionen (3D) darstellen, bei Bedarf
weiter editieren und speichern. Grundlage ist die Darstellung in Feldern.
3.8.1 Das Plot-Kommando
Syntax:
plot (⟨y -Werte⟩) |
plot (⟨x -Werte⟩, ⟨y -Werte⟩) |
plot (⟨x -Werte⟩, ⟨y -Werte⟩, ⟨Format⟩) |
plot (⟨x1⟩, ⟨y1⟩, ⟨Format1⟩, ⟨x2⟩, ⟨y2⟩, ⟨Format2⟩, ...) |
Semantik:
• ⟨x -Werte⟩ werden horizontal, ⟨y -Werte⟩ werden vertikal dargestellt. Beide Felder müssen dieselbe Länge n haben.
• Fehlt ⟨x -Werte⟩, so wird es durch das Feld [1, 2, . . . , n] der Indizes ersetzt.
• Mit ⟨Format⟩ können Farbe (F), Symbol (S) und Linienstil (L) gewählt werden. Form als Zeichenkette ⟨Format⟩ := ’FSL’.
F
Farbe
S
Symbol
L
Linienstil
-------------------------------------------------b
blue
.
point
solid
g
green
o
circle
:
dotted
r
red
x
x-mark
-. dashdot
c
cyan
+
plus
-- dashed
m
magenta
*
star
y
yellow
s
square
k
black
d
diamond
p
pentagram
h
hexagram
-------------------------------------------------S := v,^,<,>
triangles (down,up,left,right)
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
39
• Fehlt ⟨Format⟩, so wird eine Linie (solid) gezeichnet. Fehlt die Farbangabe F, so wird die Farbskala - beginnend mit blue - durchlaufen.
• plot gestattet beliebig viele Ausgaben (vgl. 4. Form). Formatangaben können fehlen; jedoch sind beide Vektoren ⟨xk⟩ und ⟨yk⟩ stets
anzugeben und müssen dieselbe Länge haben.
Konfigurieren der Ausgabe (Auswahl):
•
•
•
•
•
•
•
•
xlabel, ylabel – Festlegung der Achsenbeschriftung
legend – Erzeugung einer Bild-Legende
title – Eingabe einer Bildüberschrift
grid – Erzeugung eines rechtwinkligen Gitternetzes (on, off)
box – Erzeugung eines Diagrammrahmens (on, off)
axis – Steuerung der Achsendarstellung (on, off,...)
hold – Ausgabe mehrer Plots in die gleiche figure (on,off)
colordef – Festlegung der Diagramm- und Beschriftungsfarben
• Gleichzeitige Darstellung mehrerer Figuren (figure-Funktion):
Matlab plottet Grafiken in eigenen Fenstern (desweiteren “Figuren“
genannt), die die fortlaufenden Nummern 1,2,3,…besitzen.
1. figure kreiert eine neue Figur mit fortlaufender Nummer
2. figure(k) öffnet eine Figur mit Nummer k (neu oder vorhanden)
3. gcf (get handle to current figure) liefert Nr. der aktiven Figur.
4. clf (clear current figure) löscht die Objekte in der aktuellen Figur
5. close schließt die aktuelle Figur
6. close(k) schließt die Figur mit Nummer k
7. close all schließt alle offenen Figuren
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
40
• Unterteilung der Ausgabefigur in Unterfiguren (subplot-Funktion):
Eine Figur kann in eine m × n-Matrix (m Zeilen, n Spalten) unterteilt werden. Nummeriert man deren m·n Teilfenster zeilenweise
von links her, so öffnet subplot(m, n, p) das p-te Teilfenster in
dieser Anordnung.
3.8.2 Weitere 2D–Plots
• Modifikationen von plot:
– semilogx stellt die x-Achse logarithmisch skaliert dar
– semilogy stellt die y-Achse logarithmisch skaliert dar
– loglog stellt beide Achsen logarithmisch skaliert dar
– area wirkt wie plot; die Fläche zwischen 0 und y wird gefüllt
– stem stellt diskrete Daten mit senkrechten Linien dar.
• Darstellung von Diagrammen:
– bar(x,y) erzeugt ein vertikales Säulendiagramm mit y-Werten
– barh(x,y) erzeugt ein horizontales Säulendiagramm mit y-Werten
– stairs(x,y) erzeugt ein vertikales Treppendiagramm mit y-Werten
– hist(y,n) erzeugt ein vertikales Histogramm mit y-Werten
– pie(a,b) erzeugt ein Tortendiagramm mit Wertevektor a
– polar(t,r,S) erzeugt einen Polarplot
• Weitere nützliche Plot-Utensilien:
– [a,b] = ginput(n) gestattet die interaktive Auswahl von n Punkten aus einer bestehenden Grafik mit linker Maustaste. Speicherung der Punktkoordinaten in den Vektoren a und b
– fill(x,y,’F’) füllt ein Polygon mit Farbe F, dessen Ecken durch
die Vektoren x und y spezifiziert sind (Letzter und erster Punkt
werden verbunden)
– text(x,y,’string’) fügt die Zeichenkette string an den Koordinaten (x,y) in den aktuellenn Plot ein.
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
3.9
41
Algorithmen auf Zeichenketten
3.9.1 Zeichenketten-Definition und -Verarbeitung
Während Zeichenketten in vielen Sprachen statisch angelegt werden als
• Zeichenketten mit fester Maximallänge und variabler aktueller Länge (Längenidikator) oder
• Null-terminierte Zeichenketten (theoretisch) beliebiger Länge,
verwaltet Matlab Strings als eindimensionale Felder (Vektoren) auf
dem Basistyp char (character strings). Jedes Zeichen belegt 2 Bytes5.
Syntax:
⟨Kettenkonstante⟩ ::=
’ ’ | ’⟨Zeichen⟩{⟨Zeichen⟩}’
Semantik:
• Apostroph (’) in der Kette ist durch 2 Apostrophe anzugeben.
• In Matlab existiert auch die leere Zeichenkette.
• length und size sind anwendbar.
Manipulation von Strings:
• double(String) wandelt jedes Zeichen in seinen ASCII-Code um.
• char(Vektor) wandelt jeden ASCII-Code in das Zeichen um (Gegenstück zu double).
• Zugriff auf einzelne Zeichen und auf Teilketten ist mit Indexnotation
für Felder möglich.
• Verkettung ist durch Feldverknüpfung möglich.
• Transposition mit (’) liefert die Zeichen in einer Spalte.
5
Grund für 216 Zeichen ist die Einbeziehung fernöstlicher Alphabete, wie Japanisch und Chinesisch.
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
42
Zeichenketten-Konvertierungen und -Abfragen:
Während double und char zeichenweise umwandeln, wird oft eine komplette Konvertierung Zahl ⇔ Zeichenkette gewünscht.
• Konvertierung Ganzzahl ⇒ Zeichenkette
Format
: str = int2str(aus)
Parameter : aus – arithmet. Ausdruck mit Wert double
str – Kettenvariable
Wirkung : Berechnung von aus, Rundung auf Ganzzahl
und Konvertierung in die Kette str
• Konvertierung Zahl ⇒ Zeichenkette mit Formatierung
Formate
Parameter
Wirkung
: str = num2str(aus)
str = num2str(aus,n)
str = num2str(aus,format)
: aus – arithmet. Ausdruck mit Wert double
n – natürliche Zahl (Präzision)
format – Formatierungs-Kette
: Berechnung von aus, Konvertierung in str
auf 4 (Default) bzw. n Nachkommastellen
bzw. gemäß Formatierungs-Kette format
• Konvertierung Zeichenkette ⇒ Zahl
Formate
Parameter
Wirkung
: x = str2num(str), x = str2double(str)
: str – Kettenausdruck für eine double-Zahl
x – double-Variable
: Berechnung von str, Versuch der Konvertierung
in eine Zahl x (andernfalls [ ] )
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
43
• Abfragefunktionen
Formate
Parameter
: t = ischar(a), t = isletter(a)
: a – beliebige Zahl oder Zeichenkette
t – (Feld) logische(r) Werte 0 (false) bzw. 1 (true)
: ischar: Prüfung, ob a eine Zeichenkette ist,
isletter: Prüfung, ob die Zeichen Buchstaben sind.
Wirkung
Zeichenketten-Funktionen (Auswahl):
Zur Vereinfachung der Zeichenketten-Verarbeitung stehen in Matlab
u.a. folgende Funktionen zur Verfügung.
• Horizontale Verkettung
Format
: s = strcat(s1,s2,...,sn)
Parameter : s1,s2,...,sn – Kettenausdrücke, s – Kettenvariable
Wirkung : Verkettung von s1,s2,...,sn ohne Berücksichtigung
von Leerzeichen an Anfang und Ende
Bemerkung : s = [s1,s2,...,sn] (s.o.) berücksichtigt
Leerzeichen an Anfang und Ende
• Ersetzen in einer Zeichenkette
Format
: s = strrep(s1,s2,s3)
Parameter : s1, s2, s3 – Kettenausdrücke, s – Kettenvariable
Wirkung : Jedes Auftreten von s2 in s1 wird durch s3 ersetzt.
• Vergleich zweier Zeichenketten
Format
Parameter
Wirkung
Bemerkung
:
:
:
:
t = strcmp(s1,s2)
s1,s2 – Kettenausdrücke, t – 0 (false) bzw. 1 (true)
t = 1, falls s1 und s2 übereinstimmen, sonst t = 0.
t = strcmpi(s1,s2) ignoriert
Groß- und Kleinschreibung.
44
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
• Suchen in einer Zeichenkette
Format
: nr = strfind(text,s)
Parameter : text, s – Kettenausdrücke, nr – Zahlenvektor
Wirkung : nr ist das Feld der Startindizes jedes Auftretens der
Kette s in der Kette text.
3.9.2 Datum und Uhrzeit
Matlab bietet Funktionen zur Verarbeitung von Datum und Uhrzeit an, insbesondere zur Bestimmung, Darstellung und Arithmetik bei
Datum und Zeit, zur Kalenderfunktion und zur Stoppuhr-Funktion bei
Rechenzeit-Bestimmungen.
(a) Aktuelles Datum und Uhrzeit
• clock liefert aktuelles Datum und Uhrzeit als Feld
• now liefert aktuelles Datum und Uhrzeit als double-Zahl
• date liefert aktuelles Datum als String ’dd-mmm-jjjj’
(b) Datum- und Uhrzeitformate
• datestr konvertiert von now-Darstellung in String-Form
• datenum konvertiert von String-Form in now-Darstellung
• datevec konvertiert von String-Form in Feld-Darstellung
Datenform des Resultats von datestr:
datestr(tage,datumform) konvertiert den String tage von nowDarstellung in String-Form mit Kennzahl datumform .
datumform
0
1
2
3
4
5
6
String tage
'dd-mmm-yyyy HH:MM:SS'
'dd-mmm-yyyy'
'mm/dd/yy'
'mmm'
'm'
'mm'
'mm/dd'
Beispiel
01-Mar-2000 15:45:17
01-Mar-2000
03/01/00
Mar
M
03
03/01
45
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
7
'dd'
8
'ddd'
9
'd'
10
'yyyy'
11
'yy'
12
'mmmyy'
13
'HH:MM:SS'
14
'HH:MM:SS PM'
15
'HH:MM'
16
'HH:MM PM'
17
'QQ-YY'
18
'QQ'
19
'dd/mm'
20
'dd/mm/yy'
21
'mmm.dd,yyyy HH:MM:SS'
22
'mmm.dd,yyyy'
23
'mm/dd/yyyy'
24
'dd/mm/yyyy'
25
'yy/mm/dd'
26
'yyyy/mm/dd'
27
'QQ-YYYY'
28
'mmmyyyy'
29 (ISO 8601) 'yyyy-mm-dd'
30 (ISO 8601) 'yyyymmddTHHMMSS'
31
'yyyy-mm-dd HH:MM:SS'
01
Wed
W
2000
00
Mar00
15:45:17
3:45:17 PM
15:45
3:45 PM
Q1-96
Q1
01/03
01/03/00
Mar.01,2000 15:45:17
Mar.01,2000
03/01/2000
01/03/2000
00/03/01
2000/03/01
Q1-1996
Mar2000
2000-03-01
20000301T154517
2000-03-01 15:45:17
(c) Kalenderfunktionen
• weekday liefert den Wochentag (Sonntag=1, Samstag=7)
• calendar generiert einen Monatskalender
(d) Stoppuhr-Funktion
Wie oben bemerkt, liefert clock den aktuellen Zeitvektor T.
• Die Funktion etime(T1,T0) (elapsed time) gibt die zwischen 2
Vektoren T0 und T1 vergangene Zeit zurück.
• Die Stoppuhrfunktionen tic; (Start) und toc (Zeitausgabe) liefern die Zeit in Sekunden.
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
3.10
46
Algorithmen auf mehrdimensionalen Feldern
Um auch Matrizen und Tensoren effizient verarbeiten zu können, bietet
Matlab die Datenstruktur mehrdimensionale Felder (arrays) an.
3.10.1 Feldkonstruktion und Feldallozierung
Zur Erinnerung:
1. Ein Feld ist eine aus einer festgelegten Anzahl von Komponenten
gleichen Typs bestehende Datenstruktur.
2. Zugriff auf eine Komponente des Feldes erfolgt durch Angabe von
Indizes.
3. Die Anzahl der Indizes zur Auswahl einer Komponente gibt die
Dimension des Feldes an. Diese kann beliebig groß sein.
4. Matlab -Felder können dynamisch alloziert, verändert bzw. disalloziert werden.
Matlab (MATrix LABoratory) ist an 2-dimensionalen Feldern orientiert, die mathematisch als Matrizen (mit Zeilen und Spalten) interpretiert werden können.
Feldeingabe und -abspeicherung:
• 2-dimensionale Felder: Zeilenweise Eingabe (als 1-dimensionale Felder) und Zeilentrennung mittels Semikolon (;) oder Enter6
• Mehrdimensionale Felder werden allgemein in invers-lexikografischer
Reihenfolge abgespeichert, d.h. die Komponenten sind im Speicher
so angeordnet, daß der erste Index am schnellsten variiert, der letzte
Index dagegen am langsamsten.
Insbesondere werden Matrizen spaltenweise gespeichert!
6
Höherdimensionale Felder werden anschließend behandelt.
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
47
• Gestalt und Größe des Feldes:
s = size(A)
liefert für ein d-dimensionales Feld A den Zeilenvektor s aller d Indexbereiche.
d = ndims(A) liefert die Dimension d von A: d=length(size(A))
L = length(A) liefert die Länge L der größten Dimension d
von A: L=max(size(A))
n = numel(A) liefert die Zahl n aller Elemente von A:
n=prod(size(A))
Indizierte Variablen:
Der Zugriff auf eine Feldkomponente erfolgt durch Angabe aller dafür
nötigen n Indizes.
Syntax:
⟨Feldvariable⟩ ( Index1, Index2, . . . , Indexn ) |
⟨Feldvariable⟩ ( Indexfeld1, Indexfeld2, . . . , Indexfeldn )
Semantik:
• Index steht für eine einzelne Komponente. Der Ausdruck wird ausgewertet und die Komponente ausgewählt.
Merke: end steht stets für die letzte Komponente!
• Indexfeld kann nach bisherigen Regeln gebildet werden und steht für
eine Komponente oder ein Teilfeld mit Werten im Indexbereich!
Wertung:
Skalare und Vektoren werden intern ebenfalls als 2-dimensionale Felder
(Matrizen) behandelt (Man überprüfe dies mit whos):
• Skalare als (1,1)-Matrizen
• Zeilenvektoren als (1,n)-Matrizen
• Spaltenvektoren als (m,1)-Matrizen.
48
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
Spezielle Felder und Prä-Allozierung:
Mit folgenden Matrix-Funktionen können Felder beliebiger Dimensionen
n leicht generiert werden.
Syntax:
⟨Matrix-Funktion⟩ |
⟨Matrix-Funktion⟩ ( dim ) |
⟨Matrix-Funktion⟩ ( dim1, dim2, . . . , dimn )
Semantik:
• Im 1. Fall wird eine skalare Variable (d.h. eine (1,1)-Matrix) erzeugt.
• Im 2. Fall wird eine quadratische (dim,dim)-Matrix erzeugt.
• Im 3. Fall wird allgemein ein n-dimensionales Feld mit Indexbereichen dim1, dim2, ..., dimn erzeugt.
Funktionen für spezielle Felder in Matlab (Auswahl):
Name
Bedeutung
zeros
ones
rand
Feld mit Einträgen Null (0)
Feld mit Einträgen Eins (1)
Feld mit gleichverteilten
Zufallszahlen in (0,1)
Feld mit normalverteilten Zufallszahlen um Mittel 0 mit Varianz 1
randn
eye
magic
pascal
hilb
Einheitsmatrix
Magisches Quadrat
Pascalsche Dreiecks-Matrix
Hilbert-Matrix
Dimension
bel.
bel.
bel.
bel.
n
n
n
n
=
=
=
=
2
2
2
2
Hinweis: Große Felder A sollten mit A = zeros(d1,d2,...,dn) zu
Beginn prä-alloziert werden, da sonst innerhalb von Schleifen ggf. ein
ständiges Erweitern des Feldes vorgenommen werden muss!
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
49
3.10.2 Feldmanipulation und höherdimensionale Felder
Matlab bietet viele Möglichkeiten zur dynamischen Veränderung von
Feldern, wie Erweiterung, Reduzierung, Streckung, Vervielfachung, Drehung, Spiegelung, Herausschneiden von Teilfeldern usw., analog zu FeldManipulationen siehe 3.7.3.
Hinweis: Der gesamte Bereich eines Index kann mittels
A(d1,d2,..., 1 : end,...,dn) oder A(d1,d2,..., : ,...,dn)
angegeben werden.
1. Verändern und Expandieren von Feldern
2. Ausschneiden von Teilfeldern, Verkleinern
3. Zusammensetzen von Feldern
Streckung von Feldern (Stretching):
Matlab kann alle Elemente eines Feldes A in ihrer natürlichen SpeicherAnordnung zu einem 1-dimensionalen Spaltenvektor machen (Stretching).
Bei Matrizen wird also spaltenweise gestreckt!
• A(:) liefert alle Elemente des Feldes A als Spaltenvektor.
• A(Indexbereich) liefert alle Elemente des gestreckten Vektors im
angegebenen Indexbereich als Zeilenvektor.
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
3.11
50
Matrizen und lineare Systeme
Alle bereits für Vektoren eingeführten Operationen sind auch bei Matrizen, d.h. echten“ 2-dimensionalen Feldern, gültig. Hinzu kommen die
”
Matrizenmultiplikation und die Matrixpotenzierung.
3.11.1 Arithmetik auf Matrizen
Folgende Matrixoperationen werden nun betrachtet:
• Skalar– Matrix–Arithmetik: Addition, Subtraktion, Multiplikation,
Division, Potenzierung von Matrix und Skalar
• Matrix–Matrix–Arithmetik: Elementweise Verknüpfung durch Addition, Subtraktion, Multiplikation, Division oder Potenzierung, falls
gleiche Indexbereiche vorliegen.
• Matrixmultiplikation A ∗ B (Priorität 4 - wie zu erwarten) und Matrixpotenzierung An, n ∈ N (Priorität 2 - wie zu erwarten)
• Transposition mittels A.′ und A′ (Priorität 2 !)
Definition der Matrix–Arithmetik:
A = (aik ), B = (bik ), c skalar
Operation
Resultat
Skalar–Addition
Skalar–Subtraktion
Skalar–Multiplikation
Skalar–Division
A + c = (aik + c)
A − c = (aik − c)
A ∗ c = (aik ∗ c)
A/c = (aik /c)
Matrix–Addition
Matrix–Subtraktion
Elementweise Multiplikation
Elementweise Rechts-Division
Elementweise Links-Division
A + B = (aik + bik )
A − B = (aik − bik )
A .∗ B = (aik ∗ bik )
A ./B = (aik /bik )
A .\ B = (aik \bik )
51
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
Operation
Resultat
Elementweise
Matrix–
Potenzen
Matrix–Multiplikation
A .∧ c = (aik ∧ c)
c .∧ B = (c ∧ bik )
A .∧ B = (aik ∧ bik )
(∑
)
A∗B =
j aij ∗ bjk
Matrix–Potenzierung
Matrix–Transposition
Matrix–Transposition
A ∧ n = A ∗ A ∗ · · · ∗ A (n-mal)
A′ = AH (konjugiert komplex)
A.′ = AT (nicht-konjugiert komplex)
3.11.2 Lineare Gleichungssysteme
Lösung von
A·x = a
mit
A ∈ Rn×n, a ∈ Rn
.
Matlab benutzt dazu u.a. die numerisch stabile QR-Zerlegung.
(c) Matlab-Funktionen für lineare Gleichungssysteme:
Folgende direkte Verfahren werden in Matlab häufig benutzt:
• Verfahren 1: LR-Zerlegung von A mit Pivotisierung (P A = LR)
[L,R,P] = lu(A);
y = L\(P*a);
x = R\y
• Verfahren 2: Backslash-Operator A\a (x = A\a)
x = A\a
• Verfahren 3: Inverse Matrix A−1 (x = A−1a)
x = inv(A)*a
52
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
• Verfahren 4: Cholesky-Zerlegung von AT A (AT Ax = AT a)
L = chol(A'*A)';
b = A'*a;
x = L'\(L\b)
• Verfahren 5: QR-Zerlegung von A (A = QR)
[Q,R] = qr(A);
b = Q'*a;
x = R\b
Wichtige Funktionen für Matrizen in Matlab (Auswahl):
Aufruf
Bedeutung
Dim.
det(A)
trace(A)
rank(A)
norm(A,inf)
norm(A,1)
norm(A,2)
cond(A,inf)
cond(A,1)
cond(A,2)
Determinante det(A)
Spur von A ab A11
Rang von A
Zeilensummen-Norm von A
Spaltensummen-Norm von A
Sektralnorm von A
Konditionszahl cond∞ von A
Konditionszahl cond1 von A
spektrale Konditionszahl von A
(n,n)
(m,n)
(m,n)
(m,n)
(m,n)
(n,n)
(n,n)
(n,n)
(n,n)
inv(A)
pinv(A)
eig(A)
[V,D]=eig(A)
svd(A)
null(A)
orth(A)
Inverse Matrix A−1 von A
Pseudoinverse A+ von A
Eigenwerte von A
Eigenwerte und -vektoren
Singulärwert-Zerlegung von A
Nullraum (Kern) von A
Orthogonalisierung von A
(n,n)
(m,n)
(n,n)
(n,n)
(m,n)
(m,n)
(m,n)
53
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
Aufruf
Bedeutung
Dim.
lu(A)
qr(A)
chol(A)
qz(A,B)
expm(A)
logm(A)
LR-Zerlegung (LU-Zerlegung) von A
QR-Zerlegung von A
Cholesky-Zerlegung von A
QZ-Zerlegung verallg. EW-Probleme
Matrixexponent exp(A) von A
Matrixlogarithmus ln(A) von A
(n,n)
(n,n)
(n,n)
(n,n)
(n,n)
(n,n)
3.11.3 Beschleunigung aller Algorithmen
Welchen Effizienzvorteil bietet die Matrixnotation gegenüber elementeweiser Verarbeitung?
• Fazit:
3.12
3-dimensionale Grafik
Matlab kann numerische Daten als Punkte und Linien sowie als Flächen in 3 Dimensionen (3D) perspektivisch darstellen, bei Bedarf weiter
editieren und speichern. Grundlage ist die Darstellung in Matrizen.
3.12.1 Raumkurvendarstellung (plot3)
Syntax:
plot3 (X, Y, Z) |
plot3 (X, Y, Z, Format) |
plot3 (X1, Y1, Z1, Format1, X2, Y2, Z2, Format2, ...)
Semantik:
• Sind X,Y und Z Vektoren derselben Länge n, so wird 1 Kurve (mit
n Punkten) gezeichnet. X -Werte und Y -Werte werden horizontal,
Z -Werte werden vertikal dargestellt.
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
54
• Sind X,Y und Z Matrizen derselben Größe (n, m), so werden m
Kurven spaltenweise gezeichnet, d.h. (X(:,i), Y(:,i), Z(:,i)), i=1(1)m.
• Mit Format können Farbe (F), Symbol (S) und Linienstil (L) wie in
plot gewählt werden (s.dort).
• plot3 gestattet beliebig viele Ausgaben (vgl. 3. Form).
Zusätzlich zu den Optionen von plot gilt u.a.:
• xlabel(’x’), ylabel(’y’), zlabel(’z’) setzt 3 Labels
• axis([xmin xmax ymin ymax zmin zmax]) setzt die Zeichenbereiche in 3 Richtungen
• text(x,y,z,’String’) platziert den String an Position (x,y,z)
3.12.2 Gitter- und Flächendarstellungen
Matlab definiert mit mesh, meshc, meshz, surf, surfc, surfl
usw. eine Gitter-Oberfläche über einem rechteckigen (n,m)-Gitter der
xy-Ebene. Funktionswerte sind die z-Werte.
(a) Plot der Werte einer reellen Matrix A
• mesh(A) erzeugt ein rechteckiges Gitter mit X = 1:n und Y = 1:m,
wobei [m,n] = size(A) ist. Die m·n reellen Matrixwerte Aik werden
über dem XY-Gitter senkrecht dargestellt. Die Farbe ist proportional
der Höhe. Verdeckte Linien werden nicht gezeichnet.
• surf(A) stellt die Fläche mittels farbiger Patches“ bei verdeckten
”
Kanten dar.
Modifikationen der beiden Kommandos:
• meshc(A) und surfc(A) erzeugen zusätzlich einen Contour-Plot
in der xy-Ebene
• meshz(A) – Gitterplot mit Referenzebene um das Gitter
• surfl(A) – Flächenplot mit colormap-basierter Beleuchtung
55
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
(b) Plot der Werte einer Funktion z = f (x, y)
Zuerst ist eine (m,n)-Matrix Z zu erzeugen, die dann mit den eingeführten Kommandos mesh, surf usw. dargestellt wird.
• [X,Y] = meshgrid(x,y) erzeugt ein rechteckiges Gitter: Gegeben
sind die Knotenvektoren x der Länge n und y der Länge m. Dann
ist X eine (m,n)-Matrix, deren Zeilen identisch mit x sind, während
Y eine (m,n)-Matrix ist, deren Spalten identisch mit y sind.
• Z = f(X,Y) erzeugt die gewünschte (m,n)-Matrix über X und Y.
Achtung: Funktion muss Matrixwertige Argumente verarbeiten können!
• mesh(X,Y,Z,C) stellt Z über X und Y dar. Die Farbskalierung
wird durch die Werte der Matrix C beschrieben.
• mesh(X,Y,Z) benutzt die Farbwerte von Z, d.h. C = Z.
• surf(X,Y,Z) und weitere Modifikationen siehe oben.
(c) Plot parametrisch definierter Flächen
Ist für die Flächenparameter a ≤ u ≤ b und c ≤ v ≤ d die
Parameterdarstellung einer Oberfläche durch
x = x(u, v),
y = y(u, v),
z = z(u, v)
gegeben, so liefern
• [U,V] = meshgrid(u,v) ein rechteckiges Gitter
• X=x(U,V), Y=y(U,V), Z=z(U,V) die (m,n)-Matrizen
• mesh(X,Y,Z), surf(X,Y,Z) usw. die Flächendarstellung.
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
3.13
56
Rekursive Algorithmen
Rekursion stellt eines der grundlegendsten algorithmischen Konzepte dar.
Sie tritt deshalb in der Programmierung häufig auf, wobei 2 Erscheinungsformen zu unterscheiden sind:
• Rekursive Algorithmen: rekursive Funktionen, rekursive Prozeduren (rekursive Unterprogramme)
• Rekursive Datenstrukturen: Listen (Ketten, Stapel etc.), Bäume, Graphen (Geflechte)
Der induktive Aufbau der natürlichen Zahlen N = {0, 1, 2, 3, . . .}
durch die Peanoschen Axiome ermöglicht außer dem Beweisprinzip der
vollständigen Induktion auch rekursive Definitionen von Abbildungen.
Rekursive Definition
Eine Abbildung f : N → W wird rekursiv definiert, indem man
(i) f (0) explizit festlegt und
(ii) f (n) für beliebiges n ∈ N≥1 in Abhängigkeit von f (n − 1)
definiert, d.h. auf f (n − 1) zurückführt.
Damit ist die Abbildung f für alle n ∈ N definiert.
Verallgemeinerte Rekursion
Außer in der Grundform kommen rekursive Definitionen in zahlreichen
Varianten vor: Häufig wird f (n) nicht nur auf f (n − 1) zurückgeführt, sondern auf f (n′) mit beliebigem n′ < n . Mitunter wird
f (n) auf mehrere Vorgänger zurückgeführt, z.B. auf f (n1), f (n2)
mit n1 < n, n2 < n .
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
57
3.13.1 Direkte und indirekte Rekursivität
Rekursiver Aufruf
(i) Ein rekursiver Aufruf einer Funktion oder Prozedur A liegt vor, wenn
das Unterprogramm vor Beendigung der Abarbeitung seines Anweisungsteils erneut aufgerufen wird.
(ii) Direkte Rekursivität: Das Unterprogramm A ruft sich während seiner Abarbeitung selbst (direkt) auf.
(iii) Indirekte Rekursivität: A ruft sich über mindestens ein weiteres Unterprogramm B auf.
Frage: Wie verhält sich der Computer bei der Abarbeitung von fib(15)
oder fac(2) ?
3.13.2 Abarbeitungsprinzip rekursiver Funktionen
Bei der Abarbeitung von fac(2) werden die Parameter wie üblich behandelt, d.h. Wertparameter und lokale Parameter werden im Stack abgelegt (Stapelung, Kellerung), globale Parameter hingegen nicht. Das
heißt insbesondere:
1. Mit jedem Aufruf von fac wird eine neue Version (auch: Inkarnation) von fac erzeugt.
fac(2) −→ fac(1) −→ fac(0)
sind die Inkarnationen zu n = 2 .
2. Zu jeder Inkarnation können Wert- und lokale Parameter gehören,
deren Gültigkeitsbereich genau der Anweisungsblock dieser Inkarnation ist. Bei erneutem Aufruf von fac werden sie dann unsichtbar.
3. Diese Parameter n, n − 1, n − 2, . . . , 2, 1, 0 , werden im Stack
abgelegt, bis die Rekursion abbricht (terminiert) und erstmalig der
Wert fac(0) = 1 berechnet wird.
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
58
4. Die Inkarnationen werden nun sukzessive in umgekehrter Reihenfolge
abgeschlossen:
fac(0) −→ fac(1) −→ fac(2),
wobei die gesperrten (gekellerten) Werte sukzessive sichtbar und
verarbeitet werden.
Fazit: Die Ablage und Verarbeitung auf dem Stack erfolgt nach dem
automatischen Speicherprinzip.
Ist die Anweisung m := fib(5) abzuarbeiten, so lauten die Inkarnationen:
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
59
Lineare und nichtlineare Rekursion
(i) Ist F eine Funktion und A eine Anweisung, so heißt A linear in F ,
wenn gilt:
1. Ist A keine bedingte Anweisung, so enthält A höchstens einen
Aufruf von F .
2. Ist A eine bedingte Anweisung der Form
if B1, A1; elseif B2, A2; elseif B3, A2;
. . . . . . . . . .
else An; end
oder eine äquivalente switch-Anweisung, so sind alle Anweisungen A1,A2,...,An linear in F .
(ii) Eine rekursive Funktion F mit Anweisungsblock A heißt linearrekursiv, wenn A linear in F ist. Andernfalls heißt sie nichtlinearrekursiv.
Binärer Baum (Bintree)
M sei eine Menge (die Knotenmenge). Dann wird die Menge B2(M )
der Binärbäume über M rekursiv definiert:
(i) ε ∈ B2(M ) mit ε - leerer Baum
(ii) Ist a ∈ M und x, y ∈ B2(M ) , so ist auch
(a, x, y) ∈ B2(M ) .
Der Knoten a heißt Wurzel, x linker Teilbaum (Unterbaum), y rechter Teilbaum (Unterbaum) des Binärbaumes (a, x, y). Ein Binärbaum
(a, ε, ε) heißt Blatt.
Folgerung:
Der zu einem Aufruf der Funktion F aus der Menge M aller möglichen
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
60
Inkarnationen durch die Rekursionsvorschrift erzeugte binäre Baum heißt
Rekursionsbaum.
Gehen von einer Wurzel a genau p Unterbäume aus, so spricht man von
p-adischen Bäumen (z.B. triadische Bäume bei p = 3). Damit verallgemeinert man die Definition:
p-adischer Baum
M sei eine Menge (die Knotenmenge). Dann wird die Menge Bp(M )
der p-adischen Bäume über M rekursiv definiert:
(i) ε ∈ Bp(M ) mit ε - leerer Baum
(ii) Ist a ∈ M und x1, x2, . . . , xp ∈ Bp(M ) , so auch
(a, x1, x2, . . . , xp) ∈ Bp(M ) .
xk heißt k-ter Teilbaum (Unterbaum) des Baumes (a, x1, x2, . . . , xp).
Ein Baum (a, ε, . . . , ε) heißt Blatt.
Folgerungen:
1. Binärbäume sind die dyadischen Bäume über M .
2. Seien p1, p2, . . . , pr die Anzahlen von Unterbäumen, die in einem
beliebigen Baum auftreten und p := max1=1(1)r pi . Ergänzt
man die Zahl der Unterbäume in jeder Wurzel durch leere Bäume
zur Zahl p, so ist nun der Baum p-adisch.
3. Für p = 1 ergibt sich der Spezialfall der Folge (Sequenz).
4. Jede rekursive Funktion F generiert einen p-adischen Rekursionsbaum. F ist genau dann linear-rekursiv, falls p = 1 ist; andernfalls
ist F nichtlinear-rekursiv.
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
61
3.13.3 Terminiertheit rekursiver Funktionen
Eine Funktion F terminiert für eine gegebene Parameterbelegung V ,
wenn die Bestimmung von F (V ) nach endlich vielen Aufrufen (Inkarnationen) von F einen definierten Wert ergibt.
Korrektheit rekursiver Funktionen
Trotz nachgewiesener Terminiertheit einer rekursiven Funktion F ist damit i. allg. noch nicht verifiziert, daß F gerade die gewünschte Abbildung
darstellt.
Beispiele
• fac(n)
liefert offenbar das Produkt n(n − 1) · · · 2 · 1 = n! , damit ist
die Korrektheit leicht nachweisbar.
• fib(n)
gibt die übliche mathematische Definition der Fibonacci-Zahlen an.
• ggt(m,n)
gibt nicht die algebraische Definition des größten gemeinsamen Teilers an (s.o.). Dennoch gilt: Die Funktion ggt(m,n) ist korrekt,
d.h. sie liefert den größten gemeinsamen Teiler von m und n (Beweis als �bungsaufgabe).
3.13.4 Entwurfsprinzipien rekursiver Algorithmen
Während sich bei rekursiven Funktionen die Gestalt der Matlab Function unmittelbar ableiten läßt (vgl. fac, fib, ggt, co), ist für umfangreiche Algorithmen oft erheblicher gedanklicher Aufwand nötig, um einen
korrekten – und möglichst kurzen – rekursiven Algorithmus zu entwerfen. Folgende allgemeine Entwurfsprinzipien liegen jedoch den meisten
62
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
der rekursiven Algorithmen zugrunde:
• Einbettungsprinzip
• Prinzip Teile und herrsche“ (Divide et impera)
”
• Backtracking-Prinzip (Trial and error)
(a) Prinzip der Einbettung
Die Größe, nach der die Rekursion verläuft, kommt im Algorithmus selbst
häufig nicht vor, so daß die gestellte Aufgabe A nicht rekursiv angebbar
ist.
Idee: Eine allgemeinere Aufgabe A′ = A(n) , die A als Spezialfall
enthält, läßt sich aber oft rekursiv lösen, wenn ein zusätzlicher (Rekursions-)Parameter n eingeführt wird, d.h A wird in A′ eingebettet“.
”
Beispiel
Türme von HANOI
(hanoi.m)
Als der Tempel von Hanoi gebaut wurde, wurden 3 große Stangen in den Boden gerammt und 64 Scheiben abnehmenden Durchmessers auf die erste Stange gesteckt
- mit der kleinsten an der Spitze und der größten am Boden. Die Tempelmönche
mußten die Scheiben ununterbrochen von Stange 1 zu Stange 3 unter Benutzung
der Stange 2 und Beachtung der folgenden 2 Regeln bewegen:
1.
2.
Nur 1 Scheibe darf jedesmal bewegt werden.
Keine Scheibe darf auf eine kleinere Scheibe gelegt werden.
Laut �berlieferung wird, wenn sie die Aufgabe bewältigt haben, das Ende der Welt
eintreten.
Einbettungsprinzip:
• Einfacher Algorithmus A: Lege 64 Scheiben von 1 auf 3 mit Hilfs”
stab 2“ ⇒ keine Parameter
• Verallgemeinerter Algorithmus A′: Lege n Scheiben von x auf y
”
mit Hilfsstab z“ ⇒ Parameter sind nun x,y,z,n; n ist der Rekursi”
onsparameter“
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
Grundform des Algorithmus
63
hanoi(x,y,z,n)
1. Lege n-1 Scheiben von x auf z mit Hilfe von y !
2. Lege 1 Scheibe von x auf y (Ausgabe) !
3. Lege n-1 Scheiben von z auf y mit Hilfe von x !
Terminierungsbedingung:
Falls keine Scheibe auf x liegt, so fertig!“
”
Anzahl der Umlegungen: Offenbar ist T (0) = 0 und
T (n) = T (n − 1) + 1 + T (n − 1), n ≥ 1 .
Induktiv zeigt man daraus T (n) = 2n − 1 , n ≥ 1.
(b) Prinzip Teile und herrsche“
”
Die Entwurfsstrategie empfiehlt
1. die Zerlegung eines Problems P0(n) der Größe n in mehrere Teilprobleme geringerer Größe P1(n′), n′ < n,
2. die jeweils gelöst werden
3. und anschließend zu einer Lösung des Grundproblems zusammengesetzt werden.
Mit jedem Teilproblem wird analog verfahren, bis man zu Teilproblemen
gelangt, die klein genug sind, um ohne weitere Teilung gelöst zu werden.
Häufigster Spezialfall: Zerlegung von P0(n) in 2 Teilprobleme P1(n1)
und P2(n2) mit n1 + n2 = n .
Wichtige praktische Anwendungen:
•
•
•
•
Schnelle Suchverfahren, Sortierverfahren
Schnelle Fouriertransformation (FFT)
Adaptive Integrationsverfahren in 1D und 2D
Parallelisierte Verfahren (Numerik, Visualisierung) etc.
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
64
Die entstandenen Verfahren gehören zu den effektivsten existierenden
Algorithmen!7
3.14 Algorithmen auf Strukturen und Dateien
In vielen Anwendungen der Informationsverarbeitung ist es zweckmäßig,
Datenelemente unterschiedlichen Typs zu logischen Einheiten, den Strukturen (Datensätzen, engl.: records), zusammenzufassen. Damit lassen
sich Dateien (engl.: files) leicht aufbauen. Algorithmen auf diesen 2 Datentypen unterscheiden sich z.T. erheblich von der bisherigen Verarbeitung der Felder.
3.14.1 Algorithmen auf Strukturen (struct)
Eine Struktur ist ein Matlab -Datentyp, der aus einer festgelegten
Anzahl benannter Komponenten, den Datenfeldern (engl.: named data
containers) besteht. Diese Datenfelder können innerhalb einer Struktur
von verschiedenem Typ sein.
Beispiele:
Datum
Name
Komplexe Zahl
Adresse
Student
:
:
:
:
:
Tag, Monat, Jahr
Vorname, Zuname
Realteil, Imaginärteil
PLZ, Ort, Strasse, Nr
Matrikel-Nr., Name, Adresse, Geb.-Datum, Fächer
Erzeugung und Verarbeitung von Strukturen
Die Prä-Allozierung mittels struct legt die Reihenfolge sowie die Namen
und Werte der Datenfelder fest.
7
Vgl. dazu “The Top Ten Algorithms of the Century“ (J. Dongarra and F. Sullivan). Zu diesen 10 TopAlgorithmen gehören der Quicksort-Sortieralgorithmus von Anthony Hoare und die Fast Fourier Transform
(FFT) von James Cooley und John Tukey.
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
Syntax:
65
⟨Strukturname⟩ = struct ( ’Datenfeld 1’, Wert 1, ...
’Datenfeld 2’, Wert 2, ...
........
’Datenfeld n’, Wert n )
Semantik:
• Der Typ der Datenfelder kann beliebig sein - also auch strukturiert
(array, character string, struct etc.).
• Die Abspeicherung der Datenfelder erfolgt linear in Reihenfolge der
Definition.
• Der Gültigkeitsbereich der Datenfeldnamen (name, bafoeg, ort etc.)
ist die Strukturdefinition selbst!
• Strukturen sind Feld-orientiert, d.h. jeder Strukturname repräsentiert bereits ein 1x1-Feld. Damit können Strukturfelder beliebiger
Dimension - wie gewöhnliche Felder - aufgebaut werden.
Strukturierte Typen in Datenfeldern (nested structures):
Als Datenfelder dürfen auch strukturierte Typen stehen. Es ist ratsam,
diese Typen zuvor explizit zu deklarieren und dann die Typnamen zu
verwenden. Damit können hierarchische Strukturen aufgebaut werden.
Strukturzugriff und -verarbeitung
• Zuweisung ganzer Strukturen:
Zuweisung ganzer Strukturen desselben Typs (Muster) ist zulässig.
Sämtliche Werte der Datenfelder werden physisch kopiert.
• Strukturkomponente und Komponentenselektor:
Der Zugriff auf eine Strukturkomponente geschieht durch Angabe
der Strukturvariablen, gefolgt vom Datenfeldbezeichner, getrennt
durch eine Punkt. Es entsteht ein 2-stufiger Name. Er darf als
L-Wert und als R-Wert benutzt werden.
• Strukturen als Funktionsparameter:
Strukturvariablen können als formale und als aktuelle Parameter von
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
66
Funktionen stehen.
Datenstrukturen als Strukturkomponenten
Der Typ der Datenfelder kann beliebig sein - also auch strukturiert (array, character string, struct etc.)
3.14.2 Felder von Strukturen
Ein Strukturtyp kann selbst als Elementtyp eines ein- oder mehrdimensionalen Feldes (Vektor, Matrix,...) dienen. Auf derartige Strukturfelder
treffen alle Aussagen der Kapitel 4 und 5 zu.
Erzeugen von Strukturfeldern
1. Einzel-Zuweisungen: Die Feldelemente werden einzeln generiert und
mit Werten belegt.
• Alle Strukturen des Feldes student haben dieselbe Anzahl von
Datenfeldern. Alle Felder haben dieselben Namen.
• Merke: Felder verschiedener Elemente von student können unterschiedliche Größe heben (z.B. noten, name).
• Mit student(3).name = ’Paul’ wird eine 3. Komponente derselben Struktur generiert. Bis auf name sind alle Datenfelder leer.
2. Prä-Allozierung mit identischen Werten: Nach Definition der Elementstruktur A liefert B = repmat(A,m,n) eine mxn-Matrix
B, deren Elemente gleich A sind. Beispiel:
3. Prä-Allozierung mit verschiedenen Werten: Die Datenfelder werden
mittels Zellen {wert 1,wert 2,...,wert n } initialisiert.
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
3.15
67
Algorithmen auf Dateien (file)
Eine Datei (file) ist ein Datentyp, der aus Komponenten des gleichen
Basistyps besteht und insbesondere der dauerhaften Speicherung großer
Datenmengen außerhalb des Arbeitsspeichers dient. Matlab kann zahlreiche Dateiformate verarbeiten:
Dateityp
Extensionen und Bedeutung
Binärdateien
MAT (Matlab format)
ASCII-Textdateien
DLM (delimited text),
CSV (comma-separated numbers),
TAB (tab-separated text)
Wissenschaftliche
Daten
CDF (common data format),
HDF4, HDF5 (hierarchical data format)
Tabellen-Daten
(spreadsheets)
XLS (Excel worksheet),
WK1(Lotus 123 worksheet)
Bilddateien
TIFF, PNG, BMP, JPEG, GIF, PCX, ...
Audio- u. Videodateien
WAV (Microsoft), AVI, ...
Matlab-Funktionen zum Lesen/ Schreiben von Daten:
Man unterscheidet elementare Dateiverarbeitung (low-level) von vereinfachter Verarbeitung auf höherem Niveau (high-level). Wir werden insbesondere letztere betrachten.
Low-Level File I/O: Kennzeichen ist die Nutzung eines File-Identifiers.
Damit erfolgen explizites Öffnen und Schließen, elementare Lese- und
Schreiboperationen, Bewegung des Dateizeigers usw.
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
Funktion
Wirkung
fopen
fclose
fwrite
fread
fprintf
fscanf
fgetl
fseek
feof
Öffnen von Dateien, Def. eines File-Identifiers
Schließen von Dateien
Schreiben binärer Dateien
Lesen binärer Dateien
Schreiben formatierter Daten
Lesen formatierter Daten
Lesen einer Zeile einer Textdatei
Setzen der Dateiposition (Dateizeiger)
Abfrage des Datei-Status usw...
68
High-Level File I/O: Kennzeichen ist die direkte Benutzung des Dateinamens ohne einen File-Identifier. Öffnen und Schließen erfolgen automatisch.
Funktion
Wirkung
diary
<Name>
save
load
dlmwrite
dlmread
csvwrite
csvread
Schreiben einer Protokoll-Textdatei
Lesen einer Script-Datei <Name>.m
Schreiben von binären und ASCII-Textdateien
Lesen von binären und ASCII-Textdateien
Schreiben ASCII-formatierter Dateien
Lesen ASCII-formatierter Dateien
Schreiben kommaseparierter ASCII-Dateien
Lesen kommaseparierter ASCII-Dateien usw...
69
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
3.15.1 Diary-Files und Script-Files in Matlab
1. Schreiben der Datei <Dateiname>.m :
diary <Dateiname>.m
oder
diary('<Dateiname>.m')
erstellt eine ASCII-Textdatei <Dateiname>.m als Protokolldatei mit
dem gesamten Tastatur-Input und Bildschirm-Output. Bemerkung:
• diary off unterbricht/beendet die Speicherung
• diary on setzt die Speicherung der aktuellen Datei wieder fort
• diary <Dateiname>.m bei existierender Datei hängt das folgende
Protokoll an (append-Funktion)
speichert in das Script-File studenten.m das Strukturfeld student.
2. Anzeige des Inhalts einer ASCII-Textdatei <Dateiname>.m :
type <Dateiname>.m
oder
Anzeige im Matlab -Editor
Nach Anzeige von studenten.m im Editor ist Löschen nicht benötiger
Zeilen und Veränderung leicht möglich!
3. Lesen der Datei <Dateiname>.m :
Ausführen mit dem Aufruf
<Dateiname>
(ohne die Extension .m !) kreiert das Strukturfeld student im Workspace. 4. Erweitern der Datei <Dateiname>.m :
Mittels diary <Dateiname>.m wird zum Anhängen geöffnet.
3.15.2 Schreiben/ Lesen von Binärdateien
Ziel: Effiziente Speicherung von Variablen des Workspace zwecks späterer Weiterverarbeitung mit Matlab sowie Datenschutz!
1. Schreiben (Speichern) einer Binärdatei <Dateiname>.mat :
save
save
<Dateiname>
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
70
save <Dateiname> var1 var2 ...
save ... <Option> ...
save('<Dateiname>', ...)
schreibt eine binäre Datei <Dateiname>.mat des akt. Workspace.
• <Dateiname> kann einen (vollständigen oder partiellen) Pfad enthalten. Speicherung von <Dateiname>.mat im angegebenen bzw.
aktuellen Verzeichnis.
• Fehlt <Dateiname>, so heißt die Datei matlab.mat.
• save speichert alle Variablen des Workspace in <Dateiname>.mat;
die 3. Form speichert nur die aufgelisteten Variablen. Wildcard * ist
möglich, z.B. A* oder klima* .
• Die Option -append speichert die Variablen am Ende einer existierenden mat-Datei ab.
• Die Option -compress dient der komprimierten Speicherung (ab Version 7); Kompression und Unicode sind dort Defaults.
• save('<Dateiname>', ...) ist die äquivalente funktionale Form.
2. Einlesen (Laden) einer Binärdatei <Dateiname>.mat :
load
load <Dateiname>
load <Dateiname> var1 var2 ...
load -mat <Dateiname>
<Variablenname> = load('<Dateiname>', ...)
liest (lädt) Variablen aus der binären Datei <Dateiname>.mat in den
Workspace.
• load liest alle Variablen des MAT-Files matlab.mat in den Workspace.
• load <Dateiname> liest alle Variablen des MAT-Files
<Dateiname>.mat in den Workspace.
71
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
• Die 3. Form liest nur die aufgelisteten Variablen. Wildcard * ist möglich.
• Mit Option -mat wird die Datei als MAT-File behandelt, unabhängig
von der Datei-Extension.
• Die funktionale Form
<Variablenname> = load('<Dateiname>', ...) speichert die
genannten (bzw. alle) Variablen in eine Struktur <Variablenname>.
3.15.3 Schreiben/ Lesen von ASCII-Textdateien
Ziel: Externe Speicherung von Variablen des Workspace zwecks Weiterverarbeitung oder Korrektur mit allen Matlab -Versionen und mit
anderen Programm-Umgebungen bzw. Editoren!
Syntax:
save <Dateiname> var1 var2 ... -ASCII
save <Dateiname> var1 var2 ... -ASCII
load <Dateiname>
load <Dateiname> -ASCII
<Feldname> = load('<Dateiname>')
-double
Semantik:
• 1.Form: Speicherung im 8-bit ASCII-Format
• 2.Form: Speicherung im 16-bit ASCII-Format
• 3.Form: Falls Extension .mat, so erfolgt Lesen als Binätdatei, andernfalls als ASCII-Datei
• 4.Form: Lesen erfolgt stets als ASCII-Datei
• 5.Form: Funktionale Form, die die Datei in eine Variable <Feldname>
einliest.
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
72
Ergänzende Literatur zur Arbeit mit weiteren Dateiformaten:
1. Schweizer, W.:
MATLAB kompakt. 4. aktualisierte Auflage, Oldenbourg Verlag,
München 2009. Kap. 20 (File Handling und Datenverwaltung).
2. MATLAB 7 – Programming:
Tutorial (pdf-Datei), TheMathWorks, 2007. Kap. 6 (Data Import
and Export) und Kap. 7 (Working with Scientific Data Formats).
3.16 Symbolische Algorithmen und Grafik
Einer der Hauptzwecke der Computerentwicklung war stets das wissenschaftliche Rechnen. Obwohl Computer die Fabrikation, Verwaltung,
Kommunikation und den Kommerz vollkommen durchdrungen haben,
werden die leistungsfähigsten Computer für das wissenschaftliche Rechnen entwickelt.
Wissenschaftliches Rechnen (Scientific Computing)
ist die Computer–Simulation technischer, naturwissenschaftlicher oder
sozialwissenschaftlicher Systeme mit Hilfe mathematischer Methoden.
Es ist ein interdisziplinär orientiertes Gebiet, das insbesondere
• numerische Verfahren entwickelt und testet,
• effiziente Algorithmen auf leistungsfähigen Rechnern implementiert,
• numerisches und symbolisches Rechnen einsetzt und die
• Computersimulation komplizierter Prozesse unterstützt.
Bedeutung des Scientific Computing:
• Simulation als Alternative zum Bau teurer Prototypen:
– Vermeidung teurer Versuchsanlagen
– Luftfahrt- und Raumforschung
– Vermeidung von Crashtests
73
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
• Simulation nicht durchführbarer Experimente:
– Veränderungen des Weltklimas
– Zusammenstoß zweier Galaxien
– Epidemiemodelle
– Fortschritte bei der Lösung der grand challenge-Probleme
• Lösung von Alltagsaufgaben:
– Steuerung der Heizanlage von Wohnungen
– Konstruktion strom- und wassersparender Waschautomaten
– Energiesparwirkung von Dämmmaßnahmen
– Vorhersage von Schadstoffausbreitungen etc.
3.16.1 Computeralgebra-Systeme
Moderne Computer sind universelle Maschinen, die prinzipiell jeden beliebig gearteten Algorithmus - z.B. im Sinne von Turing - auszuführen imstande sind. Algebraische (symbolische) Algorithmen bilden hierbei keine
Ausnahme - sie können von einem Computer genauso leicht und effizient
ausgeführt werden wie arithmetische (numerische) Algorithmen.
E : c := (a + b)3
a := 2.00; b := 3.00;
E : c := (a + b)3
expand(c);
A : (2.00 + 3.00)3 =
125.00
A : (a + b)3 =
a3 + 3a2b + 3ab2 + b3
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
74
Definition 1 : Computeralgebra (CA)
Computeralgebra (symbolisches Rechnen) beinhaltet die Algorithmierung, Implementation und Ausführung von endlichen mathematischen
Transformationsvorschriften auf mathematischen Ausdrucksklassen mit
Hilfe von Computern.
Computeralgebra ist symbolisches, algebraisches Rechnen, d.h. Rechnen
mit Symbolen, die mathematische Objekte darstellen.
4 Vorteile des symbolischen Rechnens (CA)
1. Einsparung wertvoller Rechenzeit
• Algebraische Vereinfachung von Formeln vor deren numerischer
Auswertung
• Frage: Wann ist der Einsatz eines CA-Systems sinnvoll ?
• Beispiel: Nullstellenbestimmung f (x) = 0
2. Exaktheit der Ergebnisse in der CA
• Numerische Rechnungen sind mit Rundungsfehlern behaftet, weshalb Fehleranalysen erforderlich sind !
• Beispiel: Berechnung von Integralen
3. Ingenieure und Naturwissenschaftler wollen Formeln – keine Zahlen
• “Der Sinn der Berechnungen liegt darin, Einsichten zu gewinnen
– und nicht Zahlen.“ (Richard W. Hamming)
• Beispiel: Parameterabhängigkeit von Reihen
4. Computeralgebra erweitert die “Grenzen des Machbaren“ in den Naturwissenschaften
• Theorie ⇒ Schlußfolgerungen ⇒ Experimentelle Prüfung
• Die komplizierten algebraischen Berechnungen sind fehleranfällig und kaum von anderen nachvollziebar !
• Beispiel: Berechnung der Mondbahn durch
Charles E. Delaunay : 20 Jahre !
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
75
Definition 2 : Computeralgebra-System (CAS)
Ein CAS ist ein Programmsystem, mit dessen Hilfe symbolische mathematische Transformationen auf mathematischen Ausdrucksklassen
ausführbar sind.
Historie der CAS:
• 1953 – Diplomarbeit von H.G.Kahrimanian zur analytischen
Differentiation (Assemblerprogramm)
• 1962 – LISP Programmers Manual (MIT) von J. McCarthy u.a.
• 1967 – Polynom-Manipulationssystem von G.E.Collins (Fortran)
• 1968 – REDUCE an der Uni von Utah (A.C.Hearn u.a.) entwickelt
• 1969 – MACSYMA am MIT (J. Moses u.a.) auf LISP-Basis
entwickelt
• 1974 – SCRATCHPAD (später AXIOM) mit guten algebraischen
Eigenschaften; von IBM vertrieben
• 1980 – Erste Version von MAPLE an der Uni Waterloo, Kanada
• 1987 – REDUCE 3.3 für Personalcomputer
• 1987 – MATHEMATICA (Kern in C) mit bedienerfreundlicher
grafischer Oberfläche von S.Wolfram u.a. vorgestellt
• 1988 – DERIVE für 386er PC aus MuMath weiterentwickelt
• 1992 – 1. Release von MuPAD an Uni Paderborn (D) vorgestellt;
1994 mit European Academic Software Award prämiiert
• 1996 – MATHEMATICA 3.0 mit vielen Verbesserungen (neuer Kern
zahlreiche Paletten etc.) und schneller Numerik
• 2000 – MAPLE 6 mit Numerik-Funktionen zur linearen Algebra
aus der exzellenten NAG-Bibliothek
• 2002 – MAPLE 8 mit GUI Maplets und mathematischen
Erweiterungen
• 2007 – MAPLE 11 mit verbesserter Grafik, Physik-Paket etc.
Dr. Stefan Brechtken ♠ Wissenschaftliches Rechnen – Grundlagen ♣ 2015/2016
76
Teilgebiete von CA-Systemen
• Exakte Ganzzahl- und Rationalzahl-Arithmetik
• Gleitpunkt-Arithmetik beliebiger Genauigkeit
• Manipulation von rationalen Funktionen
• Vektor- und Matrixalgebra
• Formelmanipulation und Mustervergleich
• Symbolische Lösung von algebraischer Gleichungen
• Elementare Analysis (Differentiation, Integration)
• Symbolische Lösung von Differentialgleichungen
• Höhere Analysis (Vektoranalysis, Tensoranalysis)
Anwendungsgebiete von CA-Systemen
• Mathematik:
Algebraische Geometrie, Zahlentheorie, Numerik, Verzweigungstheorie, Tensoranalysis etc.
• Physik:
Himmelsmechanik, allgemeine Relativitätstheorie, Strukturmechanik, Thermodynamik etc.
• Technik:
Robotik, Schaltkreisentwurf, Finite-Elemente-Methode, Tragflächenentwurf, Analyse dynamischer Netzwerke etc.