Einführung in die Programmierung (MA8003)
Transcrição
Einführung in die Programmierung (MA8003)
Einführung in die Programmierung (MA8003) Theorie 1.1: Einführung, Grundlagen, Vektoren & Matrizen I Dr. Christian Waluga Technische Universität München Fakultät Mathematik, Lehrstuhl für Numerische Mathematik M2 04. März 2014 Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003) Ablauf Theorie 1.1+1.2 Praxis 1.1 Praxis 1.2 Theorie 2.1+2.2 Praxis 2.1 Praxis 2.2 Theorie 3.1+3.2 Praxis 3.1 Praxis 3.2 Theorie 4.1+4.2 Praxis 4.1 Praxis 4.2 Klausur Di (04.03.2014) Di (04.03.2014) Di (04.03.2014) Mi (05.03.2014) Mi (05.03.2014) Mi (05.03.2014) Do (06.03.2014) Do (06.03.2014) Do (06.03.2014) Fr (07.03.2014) Fr (07.03.2014) Fr (07.03.2014) Mo (24.03.2014) 09:30 11:30 13:30 09:30 11:30 13:30 09:30 11:30 13:30 09:30 11:30 13:30 08:30 - 11:00 13:00 15:00 10:30 13:00 15:00 10:30 13:00 15:00 10:30 13:00 15:00 09:30 Uhr Uhr Uhr Uhr Uhr Uhr Uhr Uhr Uhr Uhr Uhr Uhr Uhr MI HS 1 große Rechnerhalle große Rechnerhalle MI HS 1 große Rechnerhalle große Rechnerhalle MI HS 1 große Rechnerhalle große Rechnerhalle MI HS 1 große Rechnerhalle große Rechnerhalle MW0001 Kurswebseite mit Infos, Folien und Übungsblättern: https://www-m2.ma.tum.de/bin/view/Allgemeines/IntroProgWS13 Bitte melden Sie sich über TUM-Online für die Klausur an! Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003) Was werden wir lernen? Ziele sind... Vermittlung elementarer Programmierkenntnisse am Beispiel einer matrixbasierten Hochsprache (MATLAB). Fähigkeit, einfache Programmieraufgaben zu lösen. Grundlagen für die effiziente Bearbeitung von Problemstellungen mit Bezug zur Numerischen Mathematik. Graphische Aufbereitung von Ergebnissen. Ziele sind NICHT Programmierung komplexer Anwendungen (z.B. Datenbanken, Handy-Apps, Social-Media-Websites, Betriebssysteme usw.) Behandlung weiterer Sprachen wie z.B. C, C++, C#, Objective C, Java, Fortran, Python, Ruby, . . . Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003) Inhalte Die folgenden Theorieblöcke werden paarweise im Vormittag gelesen und im anschließenden Tutorium vertieft. 1.1 1.2 2.1 2.2 3.1 3.2 4.1 4.2 Einführung, Grundlagen, Vektoren & Matrizen I Vektoren & Matrizen II, Funktionen, Indizierung, Matrizen manipulieren Relationale und logische Operatoren, Funktionen definieren Schleifen, Vektorisierung, bedingte Ausführung 2D Plots, 3D Plots, Plots erstellen mit der GUI Effiziente Behandlung dünnbesetzter Systeme, Nützliche Werkzeuge Datenorganisation: Strukturen und Cell-Arrays Einführung in die Objektorientierung mit MATLAB Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003) Was ist Matlab? Matlab ist... ein Softwaresystem für technische Berechnungen: Numerische Berechnungen Entwicklung von Algorithmen (Rapid Prototyping) Visualisierung von Ergebnissen Anwendungen mit grafischer Benutzeroberfläche Toolboxen zur Modellierung und Simulation technischer Probleme Viele Numerikbibliotheken bieten Matlab-Schnittstelle (z.B. PETSc, IPOpt, . . . ) Quasi-Standard in Wissenschaft und Industrie → Eigene Codes nutzbar für Anwender und Kooperationspartner Matlab ist NICHT... Matlab ist kein Computer Algebra System wie z.B. Mathematica oder Maple (es gibt aber eine symbolic Toolbox). Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003) Bezugsmöglichkeit und Alternativen Installiert auf den Rechnern in der Rechnerhalle (Login notwendig → Helpdesk in der kleinen Rechnerhalle) Matlab Campus Lizenz (mit persönlicher Registrierung) https://matlab.rbg.tum.de/ Studentenversion bei MathWorks bestellbar (ca. 80 Euro? ) www.mathworks.de/academia/student_version/ Freie Alternativen (z.B.): Octave (weitgehend codekompatibel; www.octave.org) Scilab (http://www.scilab.org) Python mit Numpy/Scipy/Matplotlib (www.python.org) ? ohne Gewähr Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003) Theorie 1.1: Inhalt 1 Einführung Motivation Grundlagen 2 Vektoren und Matrizen Erzeugen von Matrizen Doppelpunkt Operator Operatoren Beispiel: Auswerten von Polynomen Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003) Beispiel: Numerische Berechnungen Lösen eines Gleichungssystems. >> A = gallery(’poisson’,4); >> f = ones(16,1); >> x = A \ f x = 0.8333 1.1667 1.1667 ... 1.1667 0.8333 Numerische Mathematik M2 z.T. basierend auf Boris von Loesch >> full(A) ans = 4 -1 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 -1 4 -1 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 -1 4 -1 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 -1 4 0 0 0 -1 0 0 0 0 0 0 0 0 -1 0 0 0 4 -1 0 0 -1 0 0 0 0 0 0 0 0 -1 0 0 -1 4 -1 0 0 -1 0 0 0 0 0 0 0 0 -1 0 0 -1 4 -1 0 0 -1 0 0 0 0 0 0 0 0 -1 0 0 -1 4 0 0 0 -1 0 0 0 0 0 0 0 0 -1 0 0 0 4 -1 0 0 -1 0 0 0 0 0 0 0 0 -1 0 0 -1 4 -1 0 0 -1 0 0 0 0 0 0 0 0 -1 0 0 -1 4 -1 0 0 -1 0 0 0 0 0 0 0 0 -1 0 0 -1 4 0 0 0 -1 0 0 0 0 0 0 0 0 -1 0 0 0 4 -1 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 -1 4 -1 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 -1 4 -1 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 -1 4 Einführung in die Programmierung (MA8003) Beispiel: Entwicklung von Algorithmen Iteratives Lösungsverfahren (PCG). function [u,m] = solvePCG(A, f, u_s, C1, C2, tol, m_max) u = u_s; m = 0; r = f - A * u; p = C2 \ (C1\ r); norm_f = norm(f); while( (norm(r)/norm_f > tol) & (m < m_max)) a = A * p; a_dot_p = a’ * p; lambda = (r’ * p) / a_dot_p; u = u + lambda * p; r = r - lambda * a; inv_C_times_r = C2 \ (C1 \ r); p = inv_C_times_r - ((inv_C_times_r’ * a) / a_dot_p) * p; m=m+1; end Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003) Beispiel: Visualisierung 3D-Plot der Funktion 1 x 2 +y 2 . Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003) Beispiel: Modellierung und Simulation Berechnen und Darstellen der Verschiebungsfigur eines Querschnitts unter einer Flächenlast. Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003) Beispiel: GUI-Anwendungen Partial Differential Equations Toolbox pdetool von Matlab. Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003) Beispiel: Prototyping Temperaturverteilung in einer Erdmantelkonvektions-Simulation: Anmerkung: Die 3D-Simulation links mit 1010 Freiheitsgraden erfordert optimierte Codes, die auf Maschinen wie z.B. SuperMUC ausgeführt werden. Prototyping mit MATLAB o.ä. (2D, rechts) erlaubt es wichtige Fragen mit weit weniger Aufwand (bzgl. Implementierung und Ressourcen) zu beantworten. Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003) Stärken von Matlab Algorithmen lassen sich in einer an die Mathematik angelehnten Form implementieren Native Unterstützung von Vektoren und Matrizen (auch dünnbesetzt!) Große Bibliothek mit numerischen Funktionen, z.B. spline zur Berechnung kubischer Splines Umfangreiche Visualisierungsmöglichkeiten Matlab wählt automatisch effizienten Algorithmus für bestimmte Aufgabe, z.B. beim Lösen von linearen Gleichungssystemen mit \ Weite Verbreitung in der Community Leicht zu lernende, umfangreiche Programmierumgebung Nicht so langsam wie sein Ruf bei Beachtung gewisser Regeln Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003) Matlab IDE Verzeichnis-Fenster Befehls-Fenster Befehls-Historie Variablenspeicher Hilfe (help und doc) Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003) Befehlseingabe Eingaben können direkt in das Befehlsfenster gemacht werden Mit help <Funktionsname> und doc <Funktionsname> findet man Hilfe Stichwortsuche in den Hilfetexten aller Funktionen mit lookfor <Stichwort> Tabulator-Taste verwenden um Befehle automatisch zu vervollständigen Mit den Hoch/Runter-Tasten können die zuletzt verwendeten Befehle durchgegangen werden Laufende Operationen können mit Ctrl+C abgebrochen werden Keine Ausgabe bei Abschluss mit ; Mehrere Befehle in einer Zeile mit , oder ; trennen Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003) Rechnen in Matlab Variablenzuweisung durch = Punkt-vor-Strich-Rechnung In ans steht das Ergebnis der letzten Rechnung Eingabe im Dezimalsystem Format: [Vorzeichen] Zahl [Exponent] Vorzeichen: + oder − Zahl: mind. 1 Ziffer, ggf. Dezimalpunkt Exponent: e oder E gefolgt von + oder − und ganzer Zahl >> a=5; >> 5*a+2 ans = 27 >> b=sqrt(a), b^2 b = 2.2361 ans = 5.0000 Numerische Mathematik M2 z.T. basierend auf Boris von Loesch >> 1+2/3*4-5 ans = -1.3333 >> ans ans = -1.3333 >> 1+2/3*4-5; >> Einführung in die Programmierung (MA8003) Komplexe Zahlen Matlab unterstützt das Rechnen mit komplexen Zahlen. Eingabeformat: a+bi oder a+bj Alternativ: complex(a,b) Achtung: Automatischer Wechsel kann zu Problemen führen >> j=2; >> z3 = a+b*j >> z=5+3.5i z = z3 = 5.0000 + 3.5000i 8 >> a=2; >> b=3; >> z2 = a+bi ??? Undefined function or variable ’bi’. >> z2 = a+b*j z2 = 2.0000 + 3.0000i Numerische Mathematik M2 z.T. basierend auf Boris von Loesch >> z3=complex(a,b) z3 = 2.0000 + 3.0000i >> sqrt(-5.2) ans = 0 + 2.2804i Einführung in die Programmierung (MA8003) Alles ist Matrix! Matlab unterstützt das Rechnen mit mehrdimensionalen Datenstrukturen (bei uns Vektoren und Matrizen). Jede Variable wird als Matrix gespeichert, z.B. wird eine Zahl als 1 × 1-Matrix interpretiert. Um Matlab effizient zu nutzen muss vektorisiert gearbeitet werden! Dies führt in der Regel auch zu (zumindest für Mathematiker) gut lesbarem Code. Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003) Erzeugen von Matrizen I Spezielle häufig benötigte Matrizen können mit Hilfe von Befehlen erzeugt werden: eye: Einheitsmatrix ones: Einsmatrix zeros: Nullmatrix rand: Matrix mit gleichverteilten Zufallswerten in (0, 1) Syntax (bei allen identisch) rand(n,m): Matrix mit n Zeilen und m Spalten rand(n): Quadratische Matrix mit n Zeilen und n Spalten Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003) Erzeugen von Matrizen II >> R = rand(2,4) >> ones(4,1) R = 0.8913 0.7621 0.4565 0.0185 0.8214 0.4447 0.6154 0.7919 >> eye(4,3) ans = ans = 1 1 1 1 >> zeros(1,3) 1 0 0 0 0 1 0 0 0 0 1 0 Numerische Mathematik M2 z.T. basierend auf Boris von Loesch ans = 0 0 Einführung in die Programmierung (MA8003) 0 Erzeugen von Matrizen III Matrizen und Vektoren können auch direkt mit Hilfe von [...] erzeugt werden Zeileneinträge mit Leerzeichen oder Komma trennen Zeilenumbruch oder Semikolon für eine neue Zeile Anzahl der Einträge muss in jeder Zeile gleich sein >> x = [3,4 5 -6] x = 3 4 5 >> x = [2,3;4,5] x = 2 3 4 5 >> x = [2,3,4 5 6 7] -6 x = 2 5 3 6 4 7 >> x = [1,2,3;4,5] ??? Error using ==> vertcat CAT arguments dimensions are not consistent. Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003) Erzeugen von Matrizen IV Statt Zahlen können auch Vektoren oder Matrizen innerhalb von [...] verwendet werden (Blockmatrizen). Achtung: Auf Dimensionen achten >> A=[eye(2); ones(2)] A = >> A=[eye(2), [1;2]; rand(1,2), 5] A = 1 0 1 1 0 1 1 1 Numerische Mathematik M2 z.T. basierend auf Boris von Loesch 1.0000 0 0.9218 0 1.0000 0.7382 1.0000 2.0000 5.0000 Einführung in die Programmierung (MA8003) Doppelpunkt Operator, Linspace I Mit Hilfe der Doppelpunkt Operators können spezielle Vektoren erzeugt werden. Diese finden häufig in Schleifen oder beim Indizieren Anwendung. Syntax v = <Start>:<Abstand>:<Ende> Erzeugt einen Vektor v mit Elementen von <start> bis <Ende>, wobei je zwei benachbarte Elemente den Abstand <Abstand> haben. Hinweis: <Start>:<Ende> == <Start>:1:<Ende> Auch der verwandte Befehl linspace erzeugt Vektoren. Syntax v = linspace(<Start>, <Ende>, n) Erzeugt einen Vektor v der Länge n mit Elementen von <Start> bis <Ende>, wobei je zwei benachbarte Elemente denselben Abstand haben. Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003) Doppelpunkt Operator, Linspace II >> x = 1:2.5:7 >> x = linspace(1,2,4) x = x = 1.0000 3.5000 6.0000 >> x = -1:-2:-6 -3 ans = 4.0000 -5 >> x = -1:2 1.6667 1.5000 -1.0000 >> linspace(1,2,1) x = -1 1.3333 >> linspace(4,-1,3) x = -1 1.0000 0 1 2 ans = 2 >> 2:-1 >> linspace(1,2,0) ans = Empty matrix: 1-by-0 ans = Empty matrix: 1-by-0 Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003) 2.0000 Weitere Möglichkeiten: Einlesen aus Datei Matrizen können aus Textdateien, die z.B. durch Tabellenkalkulationsprogramme erzeugt wurden oder numerische Eregbnisse enthalten, eingelesen werden. Syntax A = csvread(’eingabe.csv’) erwartet per Kommata getrennte Spalten. A = dlmread(’eingabe.txt’,’\t’) erlaubt die Angabe des Trennungszeichens zwischen den Spalten (hier Tabulator). Analog zu csvread,dlmread gibt es Befehle um Matrizen in Textdateien abzuspeichern: csvwrite,dlmwrite In der Matlab-Hilfe finden Sie zahlreiche Lese- und Schreibbefehle für andere Dateiformate (z.B. Bild-, Audio- und Videodateien) Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003) Weitere Möglichkeiten repmat erzeugt Matrizen durch mehrfaches Kopieren. Syntax repmat(A, n, m) Matrix A wird insgesamt m-mal nach rechts kopiert und die entstehende Matrix n-mal unten angehängt. >> B=[1,2;3,4] >> [B,B,B; B,B,B] B = ans = 1 3 1 3 1 3 2 4 2 4 2 4 1 3 1 3 2 4 2 4 >> repmat(B, 2, 3) >> repmat(1:3, 3, 1) ans = 1 3 1 3 2 4 2 4 1 3 1 3 2 4 2 4 1 3 1 3 2 4 2 4 Numerische Mathematik M2 z.T. basierend auf Boris von Loesch ans = 1 1 1 2 2 2 3 3 3 Einführung in die Programmierung (MA8003) 1 3 1 3 2 4 2 4 Operatoren I +, -, .*, ./, .^: Elementweise Operationen Achtung: Auf den Punkt bei .*, ./ und .ˆachten. Syntax C = s + A mit s Skalar, A Matrix/Vektor: cij = aij + s. C = A .* B mit A und B Matrizen: cij = aij · bij . Achtung: A und B müssen die gleiche Anzahl Zeilen und Spalten haben >> (1:5).^2 >> A = eye(2)+2 ans = A = 3 2 1 2 3 9 16 25 8 16 32 >> 2.^(1:5) >> R = rand(2,3); >> 3.*ones(2,3) + R ans = 3.8147 3.9058 4 3.1270 3.9134 ans = 2 3.6324 3.0975 Numerische Mathematik M2 z.T. basierend auf Boris von Loesch 4 >> ones(2) + [1,2] ??? Error using ==> plus Matrix dimensions must agree. Einführung in die Programmierung (MA8003) Operatoren II *: Multiplikation im Matrizenprodukt Sinn oder elementweise Multiplikation mit Skalar Syntax P C = A*B mit Matrizen A und B: cij = k aik bkj . Achtung: Anzahl der Spalten von A muss gleich der Anzahl Zeilen von B sein s*A == s.*A, wenn s Skalar. Hinweis: A*x mit x Spaltenvektor ist das normale Matrix-Vektor Produkt von A mit x . Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003) Operatoren III >> y = [2, 3, 4]; >> y*x >> x = [1; 2; 3]; >> A = ones(3)+eye(3) A = 2 1 1 1 2 1 1 1 2 >> A*x ans = 7 8 9 >> y = [2; 3; 4]; >> x*y ??? Error using ==> mtimes Inner matrix dimensions must agree. Numerische Mathematik M2 z.T. basierend auf Boris von Loesch ans = 20 >> B = [2,2;-3,1; 0,1] B = 2 -3 0 2 1 1 >> A*B ans = 1 -4 -1 6 5 5 >> B*A ??? Error using ==> mtimes Inner matrix dimensions must agree. Einführung in die Programmierung (MA8003) Operatoren IV A’: Adjungierte Matrix A∗ == ĀT (alternativ: ctranspose(A))) A.’: Transponierte Matrix AT (alternativ: transpose(A)) Wird häufig verwendet um aus Zeilenvektoren (z.B. x = 1:n;) Spaltenvektoren zu machen (x = (1:n)’;) Hinweis: A’ und A.’ unterscheiden sich nur bei Matrizen mit komplexen Einträgen. >> A=[1, 1+i;2,3] >> A.’ A = 1.0000 2.0000 1.0000 + 1.0000i 3.0000 >> A’ ans = 1.0000 1.0000 - 1.0000i ans = 1.0000 1.0000 + 1.0000i 2.0000 3.0000 >> transpose(A) 2.0000 3.0000 Numerische Mathematik M2 z.T. basierend auf Boris von Loesch ans = 1.0000 1.0000 + 1.0000i Einführung in die Programmierung (MA8003) 2.0000 3.0000 Beispiel: Auswerten von Polynomen Beispiel: Auswerten des Polynoms p(x ) := 3.5x 3 + 2x 2 − 2 an den Punkten xi = 0 + i/2, i = 0, . . . , 4. In der Regel speichert man den Koeffizientenvektor, also p = [-2; 0; 2; 3.5]. >> p = [-2; 0; 2; 3.5] >> X=[x.^0, x, x.^2, x.^3] p = X = -2.0000 0 2.0000 3.5000 1.0000 1.0000 1.0000 1.0000 1.0000 0 0.5000 1.0000 1.5000 2.0000 0 0.2500 1.0000 2.2500 4.0000 0 0.1250 1.0000 3.3750 8.0000 >> x=(0:0.5:2)’ >> y = X * p x = 0 0.5000 1.0000 1.5000 2.0000 y = -2.0000 -1.0625 3.5000 14.3125 34.0000 Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003) Fragen? Ende Theorie 1.1 Fragen? Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)