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)

Documentos relacionados