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.
© Copyright 2024 ExpyDoc