Post on 11-Aug-2019
Theorie 1.1: Inhalt
1 EinführungMotivationGrundlagen
2 Vektoren und MatrizenErzeugen von MatrizenDoppelpunkt OperatorOperatorenBeispiel: Auswerten von Polynomen
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Inhalt
1 EinführungMotivationGrundlagen
2 Vektoren und MatrizenErzeugen von MatrizenDoppelpunkt OperatorOperatorenBeispiel: 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.83331.16671.1667...1.16670.8333
>> 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 00 -1 4 -1 0 0 -1 0 0 0 0 0 0 0 0 00 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 00 -1 0 0 -1 4 -1 0 0 -1 0 0 0 0 0 00 0 -1 0 0 -1 4 -1 0 0 -1 0 0 0 0 00 0 0 -1 0 0 -1 4 0 0 0 -1 0 0 0 00 0 0 0 -1 0 0 0 4 -1 0 0 -1 0 0 00 0 0 0 0 -1 0 0 -1 4 -1 0 0 -1 0 00 0 0 0 0 0 -1 0 0 -1 4 -1 0 0 -1 00 0 0 0 0 0 0 -1 0 0 -1 4 0 0 0 -10 0 0 0 0 0 0 0 -1 0 0 0 4 -1 0 00 0 0 0 0 0 0 0 0 -1 0 0 -1 4 -1 00 0 0 0 0 0 0 0 0 0 -1 0 0 -1 4 -10 0 0 0 0 0 0 0 0 0 0 -1 0 0 -1 4
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch 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 1x2+y2 .
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 Querschnittsunter einer Flächenlast.
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Beispiel: GUI-AnwendungenPartial Differential Equations Toolbox pdetool von Matlab.
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Beispiel: PrototypingTemperaturverteilung in einer Erdmantelkonvektions-Simulation:
Anmerkung: Die 3D-Simulation links mit 1010 Freiheitsgraden erfordertoptimierte Codes, die auf Maschinen wie z.B. SuperMUC ausgeführt werden.Prototyping mit MATLAB o.ä. (2D, rechts) erlaubt es wichtige Fragen mit weitweniger Aufwand (bzgl. Implementierung und Ressourcen) zu beantworten.
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Beispiel: SimulationBlutströmungs-Simulation in Arterien:
Anmerkung: 3D-Simulation, Stromlinien (links) und Wandkräfte (rechts).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 angelehntenForm implementierenNative Unterstützung von Vektoren und Matrizen (auchdünnbesetzt!)Große Bibliothek mit numerischen Funktionen, z.B. spline zurBerechnung kubischer SplinesUmfangreiche VisualisierungsmöglichkeitenMatlab wählt automatisch effizienten Algorithmus für bestimmteAufgabe, z.B. beim Lösen von linearen Gleichungssystemen mit \Weite Verbreitung in der CommunityLeicht zu lernende, umfangreiche ProgrammierumgebungNicht 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-FensterBefehls-FensterBefehls-HistorieVariablenspeicherHilfe (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 werdenMit help <Funktionsname> und doc <Funktionsname> findetman HilfeStichwortsuche in den Hilfetexten aller Funktionen mit lookfor<Stichwort>
Tabulator-Taste verwenden um Befehle automatisch zuvervollständigenMit den Hoch/Runter-Tasten können die zuletzt verwendetenBefehle durchgegangen werdenLaufende Operationen können mit Ctrl+C abgebrochen werdenKeine 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-RechnungIn ans steht das Ergebnis der letzten RechnungEingabe im DezimalsystemFormat: [Vorzeichen] Zahl [Exponent]
Vorzeichen: + oder −Zahl: mind. 1 Ziffer, ggf. DezimalpunktExponent: 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
>> 1+2/3*4-5
ans =-1.3333
>> ans
ans =-1.3333
>> 1+2/3*4-5;>>
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch 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
>> z=5+3.5i
z =5.0000 + 3.5000i
>> a=2;>> b=3;>> z2 = a+bi??? Undefined function or variable ’bi’.
>> z2 = a+b*j
z2 =2.0000 + 3.0000i
>> j=2;>> z3 = a+b*j
z3 =8
>> z3=complex(a,b)
z3 =2.0000 + 3.0000i
>> sqrt(-5.2)
ans =0 + 2.2804i
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Inhalt
1 EinführungMotivationGrundlagen
2 Vektoren und MatrizenErzeugen von MatrizenDoppelpunkt OperatorOperatorenBeispiel: Auswerten von Polynomen
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch 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 Matrixgespeichert, z.B. wird eine Zahl als 1× 1-Matrix interpretiert.
Um Matlab effizient zu nutzen muss vektorisiert gearbeitetwerden!
Dies führt in der Regel auch zu (zumindest für Mathematiker) gutlesbarem 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 Befehlenerzeugt werden:
eye: Einheitsmatrixones: Einsmatrixzeros: Nullmatrixrand: Matrix mit gleichverteilten Zufallswerten in (0, 1)
Syntax (bei allen identisch)rand(n,m): Matrix mit n Zeilen und m Spaltenrand(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)
R =
0.8913 0.4565 0.8214 0.61540.7621 0.0185 0.4447 0.7919
>> eye(4,3)
ans =1 0 00 1 00 0 10 0 0
>> ones(4,1)
ans =1111
>> zeros(1,3)
ans =0 0 0
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Erzeugen von Matrizen III
Matrizen und Vektoren können auch direkt mit Hilfe von [...] erzeugtwerden
Zeileneinträge mit Leerzeichen oder Komma trennenZeilenumbruch oder Semikolon für eine neue ZeileAnzahl der Einträge muss in jeder Zeile gleich sein
>> x = [3,4 5 -6]x =
3 4 5 -6
>> x = [2,3;4,5]x =
2 34 5
>> x = [2,3,45 6 7]
x =2 3 45 6 7
>> x = [1,2,3;4,5]??? Error using ==> vertcatCAT 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 =
1 00 11 11 1
>> A=[eye(2), [1;2]; rand(1,2), 5]
A =
1.0000 0 1.00000 1.0000 2.0000
0.9218 0.7382 5.0000
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Doppelpunkt Operator, Linspace I
Mit Hilfe der Doppelpunkt Operators können spezielle Vektoren erzeugtwerden. Diese finden häufig in Schleifen oder beim Indizieren Anwendung.
Syntaxv = <Start>:<Abstand>:<Ende>Erzeugt einen Vektor v mit Elementen von <start> bis <Ende>, wobei jezwei benachbarte Elemente den Abstand <Abstand> haben.Hinweis: <Start>:<Ende> == <Start>:1:<Ende>
Auch der verwandte Befehl linspace erzeugt Vektoren.
Syntaxv = 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 =1.0000 3.5000 6.0000
>> x = -1:-2:-6
x =-1 -3 -5
>> x = -1:2
x =-1 0 1 2
>> 2:-1
ans =Empty matrix: 1-by-0
>> x = linspace(1,2,4)
x =1.0000 1.3333 1.6667 2.0000
>> linspace(4,-1,3)
ans =4.0000 1.5000 -1.0000
>> linspace(1,2,1)
ans =2
>> linspace(1,2,0)
ans =Empty matrix: 1-by-0
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Weitere Möglichkeiten: Einlesen aus Datei
Matrizen können aus Textdateien, die z.B. durchTabellenkalkulationsprogramme erzeugt wurden oder numerischeEregbnisse enthalten, eingelesen werden.
SyntaxA = csvread(’eingabe.csv’) erwartet per Kommata getrennteSpalten.A = dlmread(’eingabe.txt’,’\t’) erlaubt die Angabe desTrennungszeichens zwischen den Spalten (hier Tabulator).
Analog zu csvread,dlmread gibt es Befehle um Matrizen inTextdateien abzuspeichern: csvwrite,dlmwrite
In der Matlab-Hilfe finden Sie zahlreiche Lese- und Schreibbefehlefü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.
Syntaxrepmat(A, n, m)Matrix A wird insgesamt m-mal nach rechts kopiert und die entstehendeMatrix n-mal unten angehängt.
>> B=[1,2;3,4]
B =
1 23 4
>> repmat(B, 2, 3)
ans =1 2 1 2 1 23 4 3 4 3 41 2 1 2 1 23 4 3 4 3 4
>> [B,B,B; B,B,B]
ans =1 2 1 2 1 23 4 3 4 3 41 2 1 2 1 23 4 3 4 3 4
>> repmat(1:3, 3, 1)
ans =1 2 31 2 31 2 3
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Operatoren I+, -, .*, ./, .^: Elementweise OperationenAchtung: 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 Spaltenhaben
>> A = eye(2)+2
A =3 22 3
>> R = rand(2,3);>> 3.*ones(2,3) + R
ans =3.8147 3.1270 3.63243.9058 3.9134 3.0975
>> (1:5).^2
ans =1 4 9 16 25
>> 2.^(1:5)
ans =2 4 8 16 32
>> ones(2) + [1,2]??? Error using ==> plusMatrix dimensions must agree.
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Operatoren II
*: Multiplikation im Matrizenprodukt Sinn oder elementweiseMultiplikation mit Skalar
Syntax
C = A*B mit Matrizen A und B: cij =∑
k aikbkj .Achtung: Anzahl der Spalten von A muss gleich der Anzahl Zeilenvon B seins*A == s.*A, wenn s Skalar.
Hinweis: A*x mit x Spaltenvektor ist das normale Matrix-Vektor Produktvon A mit x .
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Operatoren III
>> x = [1; 2; 3];>> A = ones(3)+eye(3)
A =2 1 11 2 11 1 2
>> A*x
ans =789
>> y = [2; 3; 4];>> x*y??? Error using ==> mtimesInner matrix dimensions must agree.
>> y = [2, 3, 4];>> y*x
ans =20
>> B = [2,2;-3,1; 0,1]
B =2 2
-3 10 1
>> A*B
ans =
1 6-4 5-1 5
>> B*A??? Error using ==> mtimesInner matrix dimensions must agree.
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Operatoren IV
A’: Adjungierte Matrix A∗ == AT (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 komplexenEinträgen.
>> A=[1, 1+i;2,3]
A =1.0000 1.0000 + 1.0000i2.0000 3.0000
>> A’
ans =1.0000 2.00001.0000 - 1.0000i 3.0000
>> A.’
ans =1.0000 2.00001.0000 + 1.0000i 3.0000
>> transpose(A)
ans =1.0000 2.00001.0000 + 1.0000i 3.0000
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Beispiel: Auswerten von Polynomen
Beispiel: Auswerten des Polynoms p(x) := 3.5x3 + 2x2 − 2 an denPunkten xi = 0 + i/2, i = 0, . . . , 4. In der Regel speichert man denKoeffizientenvektor, also p = [-2; 0; 2; 3.5].
>> p = [-2; 0; 2; 3.5]
p =-2.0000
02.00003.5000
>> x=(0:0.5:2)’
x =0
0.50001.00001.50002.0000
>> X=[x.^0, x, x.^2, x.^3]
X =1.0000 0 0 01.0000 0.5000 0.2500 0.12501.0000 1.0000 1.0000 1.00001.0000 1.5000 2.2500 3.37501.0000 2.0000 4.0000 8.0000
>> y = X * p
y =-2.0000-1.06253.5000
14.312534.0000
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Theorie 1.2: Inhalt
1 Vektoren und MatrizenBackslash und Slash
2 Funktionen
3 Indizierung
4 Matrizen manipulieren
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Inhalt
1 Vektoren und MatrizenBackslash und Slash
2 Funktionen
3 Indizierung
4 Matrizen manipulieren
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
\ und / Operator I\ (mldivide) und / (mrdivide) sind im gewissen Sinn das Gegenstück zumMatrizenprodukt *: Mit Ihnen kann man lineare Gleichungssysteme lösenbzw. eine Lösung approximieren.
Fragestellung: Gesucht ist ein Vektor x mit Ax = b. Wenn kein solches xexistiert, dann suche x mit ‖Ax − b‖2 minimal.
Dieser Vektor wird mit A \ b bestimmt. Dazu wird intern je nachStruktur von A ein geeigneter Algorithmus verwendet.
b kann auch eine Matrix sein (z.B. mehrere rechte Seiten).Anzahl Zeilen von A muss gleich Anzahl Zeilen von b sein.Bei Verwendung von Zeilenvektoren, also x = (x1, x2, . . . , xn),verwendet man /.
Merkregel
A \ b ≈= A−1b, wenn b Spaltenvektorb / A ≈= bA−1, wenn b Zeilenvektor
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
\ und / Operator II
>> A = hilb(3)
A =1.0000 0.5000 0.33330.5000 0.3333 0.25000.3333 0.2500 0.2000
>> b = (1:3)’;>> x = A\b
x =27.0000
-192.0000210.0000
>> A*x
ans =1.00002.00003.0000
>> x = b’/A
x =27.0000 -192.0000 210.0000
>> x*A
ans =1.0000 2.0000 3.0000
>> B = [(1:3)’, ones(3,1)]
B =1 12 13 1
>> A\B
ans =27.0000 3.0000
-192.0000 -24.0000210.0000 30.0000
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
\ und / Operator III
Achtung: Aufpassen, wenn Matrix nicht quadratisch oder singulär!>> A = [hilb(3); ones(1,3)]
A =1.0000 0.5000 0.33330.5000 0.3333 0.25000.3333 0.2500 0.20001.0000 1.0000 1.0000
>> b = (1:4)’
b =1234
>> x = A\b
x =-22.415287.1090
-60.6662
>> A*x
ans =0.91722.66222.17234.0276
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Inhalt
1 Vektoren und MatrizenBackslash und Slash
2 Funktionen
3 Indizierung
4 Matrizen manipulieren
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Funktionen
Viele Matlab Funktionen lassen sich in eine von drei Klassen einteilen:Skalarwertig Skalar als Eingabeargument. Wirken bei Feldern
komponentenweise.Vektorwertig Vektor als Argument. Werden bei Matrizen auf jede Spalte
einzeln angewendet. Rückgabewert ist Skalar oder Vektor.Matrixwertig Matrix als Argument, z.B. det
Viele Funktionen in Matlab verhalten sich unterschiedlich je nach Anzahlund Art der Eingabe- bzw. Ausgabeparameter.
QR Orthogonal-triangular decomposition.[Q,R] = QR(A), where A is m-by-n, produces an m-by-n ...[Q,R] = QR(A,0) produces the "economy size" decomposition...[Q,R,E] = QR(A) produces unitary Q, upper triangular R ...[Q,R,E] = QR(A,0) produces an "economy size" decomposition...X = QR(A) and X = QR(A,0) return the output of LAPACK’s ......
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Skalare Funktionen
Beispiele:
sin cos tanasin acos atanexp log (ln) roundsqrt factorial (Fakultät) abs (Betrag)
>> A = magic(2)
A =1 34 2
>> cos(A*pi/2)
ans =0.0000 -0.00001.0000 -1.0000
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Vektor Funktionen I
Wenn das Argument der Funktion eine Matrix ist, wird die Funktioneinzeln auf jede Spalte der Matrix angewendet.Um eine Vektorfunktion auf eine gesamte Matrix A anzuwenden undnicht auf die einzelnen Spalten, A(:) als Argument verwenden.Meist zweites optionales Argument welches angibt, ob Funktion aufSpalten (1) oder Zeilen (2) einer Matrix angewendet werden soll.
Beispiele:
min max meansum prod (Produkt) diffcumsum sort
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Vektor Funktionen II>> x = 4:-1:1;>> prod(x)
ans =24
>> max(x)
ans =4
>> [m, i] = max(x)
m =4
i =1
>> diff(x)
ans =-1 -1 -1
>> A = magic(3);>> sum(A)
ans =15 15 15
>> sum(A,2)
ans =151515
>> sum(A(:))
ans =45
>> sort(A)
ans =3 1 24 5 68 9 7
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Hilfreiche Funktionen
length: Die Länge eines Vektors oder die größere Dimension einerMatrixsize: Vektor mit den Dimensionen des Feldesnumel: Anzahl der Elemente des Feldes
Hinweis: prod(size(A)) == numel(A) == length(A(:))>> A=ones(3,2);>> length(A)
ans =3
>> length(A’)
ans =3
>> size(A)
ans =3 2
>> numel(A)
ans =6
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Inhalt
1 Vektoren und MatrizenBackslash und Slash
2 Funktionen
3 Indizierung
4 Matrizen manipulieren
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Indizierung IMit Matlab kann gezielt auf Teile eines Vektors oder einer Matrixzugegriffen werden. Zum Indizieren verwendet man runde Klammern(...).
x(i): Das i-te Element des Vektors xA(i,j): Das Element in der i-ten Zeile und j-ten Spalteend: Bezeichnet den letzten Index der Dimension
Achtung: Indizes fangen in Matlab bei 1 an!
>> x = 2:-1:0;>> x(2)
ans =1
>> A = [1,2; 3,4]
A =1 23 4
>> A(1,2) = -2
A =1 -23 4
>> A(1,end)
ans =-2
>> A(end,end)
ans =4
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Lineares Indizieren
Auf die Elemente einer Matrix kann auch mit nur einem Index zugegriffenwerden.SyntaxA(i) gibt den i-ten Eintrag der Matrix A zurück. Die Einträge werdenhierbei spaltenweise durchnummeriert.1 4 7 10
2 5 8 113 6 9 12
>> A=magic(3)
A =8 1 63 5 74 9 2
>> A(2)
ans =3
>> A(end)
ans =2
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Indizierung II
Auch Felder können zum Indizieren verwendet werden, sei v ein Vektorbzw. M eine Matrix mit Indizes
x(v): Vektor mit i-tem Element gleich x(v(i))
x(M): Matrix mit (i,j)-ten Element gleich x(M(i,j))
A(v,w): Matrix mit (i,j)-ten Element gleich A(v(i), w(j))
A(v): Vektor mit i-tem Element gleich A(v(i))
Hinweis: Kurschreibweise: : == 1:end.Hinweis: v(:) bzw. A(:) ist immer ein Spaltenvektor.
Achtung: Die Einträge in den Vektoren, bzw. Matrizen, die zumIndizieren verwendet werden, müssen ganzzahlig und größer als 0 sein.
Achtung: Matlab unterstützt keine doppelte Indizierung, z.B. x(v)(1)funktioniert nicht!
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Indizierung IIIx =
-3 -2 -1 0 1 2 3
>> x(2:4)
ans =-2 -1 0
>> x([2 3 end end 1])
ans =-2 -1 3 3 -3
>> M = [1 2; 2 1]
M =1 22 1
>> x(M)
ans =-3 -2-2 -3
>> A = magic(3)
A =8 1 63 5 74 9 2
>> A(1,:)
ans =8 1 6
>> A([1,2],[2,3])
ans =1 65 7
>> A(2:end,:)
ans =3 5 74 9 2
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Lineares Indizieren II
>> A = zeros(3)
A =0 0 00 0 00 0 0
>> A(2:2:end) = 1
A =0 1 01 0 10 1 0
>> x = 1:3
x =1 2 3
>> x(:)
ans =123
>> A*xerror: operator *: nonconformant arguments(op1 is 3x3, op2 is 1x3)
>> A*x(:)
ans =242
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Inhalt
1 Vektoren und MatrizenBackslash und Slash
2 Funktionen
3 Indizierung
4 Matrizen manipulieren
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Einträge löschen
Es ist möglich, Einträge aus Vektoren zu löschen.x(i) = [] löscht den i-ten Eintrag des Vektors x
x(v) = [] löscht alle Einträge von x mit Indizes in v
A(i,:) = [], A(:,i) = [] löscht i-te Zeile bzw. Spalte derMatrix A
>> x=1:5;>> x([2 3]) = []
x =1 4 5
>> A=magic(3)
A =8 1 63 5 74 9 2
>> A(:,2) = []
A =8 63 74 2
>> A([2,1],:) = []
A =4 2
>> A = magic(3);>> A(1:end, 2) = []??? Subscripted assignment dimension mismatch.
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Einträge hinzufügen
Matlab verlängert Felder bei Element-Zuweisung automatisch.x(i) = k setzt das i-te Element auf den Wert k und verlängert denVektor wenn i > length(x).A(i,j) = k setzt das (i,j)-te Element auf den Wert k, hängt ggf.Zeilen und Spalten an.
>> x=1
x =1
>> x(4) = 4
x =1 0 0 4
>> x(3,3) = 5
x =1 0 0 40 0 0 00 0 5 0
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Theorie 2.1: Inhalt
1 Relationale und logische OperatorenFunktionen any und allIndizierung mit logischen Feldern
2 Funktionen definierenAnonyme FunktionenFunktionshandles
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Inhalt
1 Relationale und logische OperatorenFunktionen any und allIndizierung mit logischen Feldern
2 Funktionen definierenAnonyme FunktionenFunktionshandles
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Relationale Operatoren und logische Felder I
Ähnlich wie in anderen Programmiersprachen besitzt Matlab einenlogischen Datentyp. logical Variablen haben entweder den Wert 0(falsch) oder 1 (wahr).
logical ist Rückgabetyp von relationalen Operatoren(Vergleichsoperatoren):
== gleich~= ungleich< kleiner> größer<= kleiner oder gleich>= größer oder gleich~ nicht
L = A <= s: Vergleicht A komponentenweise mit Skalar s
L = A <= B: Vergleicht A komponentenweise mit zugehörigenEintrag aus B. (Dimensionen von A) == (Dimensionen von B)
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Relationale Operatoren und logische Felder II
>> l = logical([0,0,1])
l =0 0 1
>> l = logical([0,2,1.1,-1])
l =0 1 1 1
>> A = rand(2)
A =0.1419 0.91570.4218 0.7922
>> A <= 0.5
ans =1 01 0
>> B = rand(2)
B =0.9595 0.03570.6557 0.8491
>> L = A>B
L =0 10 0
>> whos A LName Size Bytes ClassA 2x2 32 doubleL 2x2 4 logical
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Achtung: (Un-)Gleichheit von Kommazahlen>> (1-0) == 1ans =
1
>> (1.1-0.1) == 1ans =
1
>> (1.01-0.01) == 1ans =
1
>> (1.001-0.001) == 1ans =
0
>> (1.0001-0.0001) == 1ans =
1
>> (1.00001-0.00001) == 1ans =
1
Kommazahlen dürfen nie mit == oder ~= verglichen werden!Dies ist kein Matlab-spezifisches Problem, sondern tritt in praktischallen Programmiersprachen (z.B. C++, Fortran) auf!Abhilfe: Verwenden Sie die vordefinierte Konstante eps
>> epsans =
2.2204e-16
>> abs((1.001-0.001) - 1) <= epsans =
1
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Logische Operatoren
Logische Variablen können mit logischen Operatoren verknüpft werden.
& (and) logisches und| (or) logisches oder∼ (not) logisches nichtxor logisches exklusives oder
Anwendung wieder komponentenweise.>> A=rand(2)
A =0.1419 0.91570.4218 0.7922
>> A<=0.2 | A>=0.8
ans =1 10 0
>> B=rand(2)
B =0.9595 0.03570.6557 0.8491
>> and(A<B, A<0.5)
ans =1 01 0
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
any und all
Die Funktionen any, all sind Vektorfunktionen auf logischen Feldern.any(l): Gibt wahr zurück, wenn mindestens ein Eintrag von l wahristall(l): Gibt wahr zurück, wenn alle Einträge von l wahr sind
>> l = isprime(1:5)
l =0 1 1 0 1
>> any(l)
ans =1
>> A = magic(3)
A =8 1 63 5 74 9 2
>> L = A>7
L =1 0 00 0 00 1 0
>> any(L)
ans =1 1 0
>> all(~L)
ans =0 0 1
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Indizieren mit logischen Feldern I
Eine wichtige Anwendung von logischen Feldern ist das Indizieren.x(l): Vektor mit Elementen xi aus x für die l(i) == 1 also wahrist. Voraussetzung: Länge l == Länge x
A(l): Spaltenvektor mit Elementen i aus A für die l(i) wahr istA(L): Spaltenvektor mit Elementen aij aus A für die L(i,j) wahr istA(l1,l2): Matrix der Elemente aij
mit l1(i) == 1 und l2(j) == 1
Hinweis: Auch Mischformen mit normaler Indizierung sind möglich: z. B.A(l,2:end).
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Indizieren mit logischen Feldern II
>> x = rand(1,5);>> l = x >= 0.5;>> x(l) = 0.5
x =0.1230 0.5000 0.3285 0.2682 0.5000
>> x(x>= 0.5) = 0.6
x =0.1230 0.6000 0.3285 0.2682 0.6000
>> A = rand(2)
A =0.3922 0.17120.6555 0.7060
>> A(A>0.6) = 0.6
A =0.3922 0.17120.6000 0.6000
>> A = magic(3)
A =8 1 63 5 74 9 2
>> A(A<4)
ans =312
>> l = logical([0, 1, 1]);>> A(l,:)
ans =3 5 74 9 2
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
find I
find gibt die Indizes der wahren Einträge eines logischen Feldes zurück:v = find(L): Indizes der wahren Einträge des logischen Feldes L. vist ein Spaltenvektor der linearen Indizes (Spaltenweise).[r,c] = find(L): Vektoren mit Reihen- (r) und Spalten-Indizes(c) der wahren Einträge von L
Hinweis: X(l) == X(find(l))
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
find II
>> x=[-2 5 -1 0 4]
x =-2 5 -1 0 4
>> f = find(x>0)
f =2 5
>> A = magic(3);
A =8 1 63 5 74 9 2
>> f = find(A>4)’
f =1 5 6 7 8
>> A(f)
ans =8 5 9 6 7
>> [r,c] = find(A>4);>> r’
ans =1 2 3 1 2
>> c’
ans =1 2 2 3 3
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Inhalt
1 Relationale und logische OperatorenFunktionen any und allIndizierung mit logischen Feldern
2 Funktionen definierenAnonyme FunktionenFunktionshandles
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Funktionen definieren IHäufig wiederkehrende Programmteile oder Algorithmen können alsFunktionen zur Verfügung gestellt werden.Funktionen werden aufgerufen durch <name>(arg1, arg2,...),z.B. sqrt(2).Eine Funktion foo muss, damit sie von Matlab gefunden wird, in derDatei foo.m stehen und sich entweder im aktuellen Verzeichnisbefinden oder im path (siehe help path).
Syntax
<Dateiname: foo.m>
function [A1, A2, ...] = foo(E1, E2, ...)%FOO <Kurzbeschreibung>%<ausführliche Beschreibung,%wird bei "help foo" angezeigt >
<Code der Funktion in dem die Variablen A1, A2,...richtig besetzt werden>
Kein return notwendig
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Funktionen definieren II
Funktionen ohne Rückgabeargument:function foo(E1, E2, ...)
return kann verwendet werden, um eine Funktion vorzeitig zuverlassen.Funktionsnamen in Matlab bestehen per Konvention nur ausKleinbuchstaben.Eingabeargumente können durch Funktionen nicht verändert werden(pass by value).
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Funktionen definieren III
<Datei: foo.m>function foo(x)
x = x.*(x+1)./2;
>> x=3;>> foo(x);>> x
x =3
<Datei: foo.m>function x = foo(x)
x = x.*(x+1)./2;
>> x=3;>> x=foo(x);>> x
x =6
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Funktionen definieren III
Skalare Funktionen sollten immer auch mit Vektoren/Matrizen alsEingabeargumenten funktionieren.
Beispiel: Primzahltest (nicht sonderlich schnell)<Datei: isprime2.m>function l = isprime2(x)
d = [2, 3:2:sqrt(x)];rest = rem(x, d); %Der Rest der Division x./dl = all((rest ~= 0 & x > 1) | x == 2);
Vektorisiert<Datei: isprime2.m>function l = isprime2(x)
l = logical(x);<Wiederhole für jedes Element von x(:)>
d = [2, 3:2:sqrt(x(i))];rest = rem(x(i), d);l(i) = all((rest ~= 0 & x(i) > 1) | x(i) == 2);
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Anonyme Funktionen
Funktionen die nur aus einem Ausdruck bestehen, z. B. algebraischeAusdrücke wie
sin(x2) + 2x4
können anonym definiert werden.
Syntaxf = @(arg1, arg2, ...) <ausdruck>;Achtung: f ist keine Funktion sondern ein Handle auf eine anonymeFunktion.
Hinweis: Rückgabewerte von f können auch Vektoren/Matrizen sein.
>> f = @(x) sin(x.^2)+2*x.^4;>> f(0.5)
ans =0.3724
>> f2 = @(x,y) [x.^2-y.^2, x*y]
f2 =@(x,y)[x.^2-y.^2,x*y]
>> f2(3,-4)
ans =-7 -12
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Funktionshandles
Funktionen können selber Funktionen als Argument bekommen in Formvon Funktionshandles.SyntaxSei fun eine Funktion, dann wird mit @fun ein Funktionshandle auf funerzeugt. Dieses kann als Argument einer Funktion übergeben werden.>> df = @(f,x) (f(x + 1e-8) - f(x - 1e-8))./2e-8;>> df(@sin, 0)
ans =1
>> df(@exp, 0:0.5:1)
ans =1.0000 1.6487 2.7183
>> exp(0:0.5:1)
ans =1.0000 1.6487 2.7183
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Funktionshandles
>> f = @(x) sin(x.^2)+2*x.^4;>> df(@f, 1)??? Error: "f" was previously used as a variable,conflicting with its use here as the name of a function or command.See MATLAB Programming, "How MATLAB Recognizes Function CallsThat Use Command Syntax" for details.
>> df(f, 1)
ans =
9.0806
>> df(@(x) sin(x.^2)+2*x.^4, 1)
ans =
9.0806
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Theorie 2.2: Inhalt
1 Schleifenfor-SchleifenBeispiel: Jacobi-VerfahrenWhile Schleifen
2 Bedingte Ausführungif, elseif, elseTest der Anzahl von Ein- und Ausgangsgrößen
3 Debugging
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Inhalt
1 Schleifenfor-SchleifenBeispiel: Jacobi-VerfahrenWhile Schleifen
2 Bedingte Ausführungif, elseif, elseTest der Anzahl von Ein- und Ausgangsgrößen
3 Debugging
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Schleifen I
Eine Schleife wiederholt eine Folge von Anweisungen bis eineAbbruchsbedingung erfüllt ist.In Matlab gibt es zwei unterschiedliche Arten von Schleifen:
for Schleifewhile Schleife
Schleifen können beliebig geschachtelt werden.
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Schleifen (for Schleife)
Syntaxfor i=v
<auszufuehrende Anweisungen>endMit v Vektor (oder Matrix), häufig von der Form <start>:<ende>.
Bei einer for Schleife werden die Anweisungen so oft ausgeführt wie esElemente in v gibt. Ist z.B. length(v) == 5 wird der Körper derSchleife 5 Mal ausgeführt. i durchläuft dabei jeweils die Elemente von v.
Achtung: for Schleifen können in vielen Fällen durch vektorwertigeAusdrücke ersetzt werden
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Schleifen (for Schleife)
>> x=[1,2,10,-1];>> k=0;>> for l=xk=k+2*lend
k =2
k =6
k =26
k =24
>> sum(2*x)
ans =24
>> for k=1:5for l=k:5A(k,l)=k/l;A(l,k)=k/l;endend>> A
A =1.0000 0.5000 0.3333 0.2500 0.20000.5000 1.0000 0.6667 0.5000 0.40000.3333 0.6667 1.0000 0.7500 0.60000.2500 0.5000 0.7500 1.0000 0.80000.2000 0.4000 0.6000 0.8000 1.0000
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Beispiel: Jacobi-Verfahren IZum Lösen eines linearen Gleichungssystems Ax = b, mit A ∈ Rn×n
bieten sich in manchen Fällen iterative Verfahren an.a11 · x1 + · · ·+ a1n · xn = b1a21 · x1 + · · ·+ a2n · xn = b2
...an1 · x1 + · · ·+ ann · xn = bn
Ein einfaches Beispiel für diese Klasse ist das Jacobi-Verfahren.Jacobi-VerfahrenAusgehend von einem beliegigen Startvektor x (0)
i löse für alle i die i-teGleichung nach der i-ten Variablen xi auf und iteriere dies.Hinreichende Bedingung für Konvergenz: A strikt diagonaldominant.
x (k+1)i :=
1aii
(bi −
n∑j=1j 6=i
aijx (k)j), i = 1, . . . , n.
=1aii
(bi + aii x (k)
i −n∑
j=1
aijx (k)j)= x (k)
i +1aii
(bi − aT
i x (k))Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Beispiel: Jacobi-Verfahren I
function x = jacobi1(A, b, x0, iter)%JACOBI Verfahren Version 1x = x0;xn = 0*x;n = length(A);for k = 1:iter
for i = 1:nxn(i) = x(i) + (b(i) - A(i,:)*x)./A(i,i);
endx = xn;
end
>> A = gallery(’poisson’,10);>> b=(1:100)’;>> x = jacobi(A,b,zeros(100,1),500);>> norm(A*x - b)
ans =4.6606e-07
>> tic; x = jacobi1(A,b,zeros(100,1),500); tocElapsed time is 0.640984 seconds.
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Jacobi-Verfahren II
Das Jacobi-Verfahren kann man weiter umschreiben:
x (k+1)i := x (k)
i +1aii
(bi − aT
i x (k))
, i = 1, . . . , n
⇒ x (k+1) := x (k) + D−1(
b − Ax (k))
, mit D = Diag(A)
function x = jacobi2(A, b, x0, iter)%JACOBI Verfahren Version 2x = x0;D = diag(A); %diag(A) gibt Vektor der Diagonalelemente zurückfor k = 1:iter
x = x + (b - A*x)./D;end
>> tic; x = jacobi2(A,b,zeros(100,1),500); tocElapsed time is 0.017832 seconds.>> norm(A*x - b)ans =
4.6606e-07
Eliminieren der inneren Schleife beschleunigt Routine um Faktor ≈ 36!
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Schleifen II (while Schleifen)
while Schleifen werden solange ausgeführt solange eine Bedingung wahrist. Zum Beispiel bei einem iterativen Verfahren solange wie einefestgelegte Genauigkeit nicht erreicht wurde.
Achtung: Gefahr von Endlosschleifen!
Syntaxwhile (<Bedingung>)
<auszufuehrende Anweisungen>end
>> j=1;>> while (j>0)epsilon = j;j = j/2;end>> epsilon
epsilon =4.9407e-324
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Jacobi-Verfahren III
Beim Jacobi-Verfahren haben wir bisher die Anzahl der Iterationenvorgegeben.Besser abbrechen, wenn die Norm des Residuums klein ist
function x = jacobi3(A, b, x0, tol)%JACOBI Verfahren Version 3x = x0;D = diag(A); %diag(A) gibt Vektor der Diagonalelemente zurückr = b - A*x;while (norm(r) >= tol)
x = x + r./D;r = b - A*x;
end
>> tic; x = jacobi3(A,b,zeros(100,1),1e-6); tocElapsed time is 0.021556 seconds.
>> norm(A*x - b)ans =
9.8105e-07
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Jacobi-Verfahren IV
Wir haben ein Problem, wenn das Verfahren nicht konvergiert:Gefahr einer Endlosschleife!function x = jacobi4(A, b, x0, tol, iter)%JACOBI Verfahren Version 4x = x0;D = diag(A); %diag(A) gibt Vektor der Diagonalelemente zurückr = b - A*x;k = 1;while (norm(r) >= tol & k < iter)
x = x + r./D;r = b - A*x;k = k + 1;
endk
>> tic; x = jacobi4(A,b,zeros(100,1),1e-6,500); tock =
483Elapsed time is 0.027932 seconds.
>> norm(A*x - b)ans =
9.8105e-07
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Schleifen III
break: Eine Schleife kann durch break sofort verlassen werdencontinue: Bricht den aktuellen Schleifendurchlauf ab und springtzum Kopf der Schleife.
Bei geschachtelten Schleifen wirken die Befehle nur auf die „innerste“.>> j=1;>> for i=1:2000, epsilon=j; j=j/2;if (j == 0), break; end,end>> epsilon
epsilon =4.9407e-324
>> i
i =1075
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Inhalt
1 Schleifenfor-SchleifenBeispiel: Jacobi-VerfahrenWhile Schleifen
2 Bedingte Ausführungif, elseif, elseTest der Anzahl von Ein- und Ausgangsgrößen
3 Debugging
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Bedingte Ausführung I
Häufig möchte man Codeteile nur dann ausführen, wenn bestimmteBedingungen erfüllt sind. Dies kann man mit if-Abfragen realisieren.
Syntaxif (<logischer Ausdruck 1>)
<Anweisungen 1>elseif (<logischer Ausdruck 2>)
<Anweisungen 2>elseif ...else
<Anweisungen 3>end
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Bedingte Ausführung II
function x = foo(x)if (x(1) > x(2))
temp = x(1);x(1) = x(2);x(2) = temp;
elsedisp ’Schon sortiert’
end
>> x=[2,1];>> x = foo(x);
x =1 2
>> x = foo(x)Schon sortiert
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Bedingte Ausführung IIIif-Abfragen werden z. B. verwendet um Voraussetzungen an die Variablenam Anfang einer Funktion zu überprüfen:function fun(x)
if (~isscalar(x))error(’x muss Skalar sein’)
elseif (isnan(x) | isinf(x))error(’x ist keine zulässige Zahl’)
elsedisp(’Juhu’);
end
Hilfreich: is* Funktionen, wie isnan, iscomplex, isvector. . .
>> fun([0,1])
??? Error using ==> fun at 3x muss Skalar sein
>> fun(magic(3))
??? Error using ==> fun at 3x muss Skalar sein
>> fun(1/0)
??? Error using ==> fun at 7x ist keine zulässige Zahl
>> fun(log(-1))Juhu
>> log(-1)ans =
0 + 3.1416i
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Jacobi-Verfahren V
function x = jacobi5(A, b, x0, tol, iter)%JACOBI Verfahren Version 5d = size(A);if (d(1) ~= d(2))
error(’A muss quadratische Matrix sein’);elseif (~isvector(b))
error(’b muss ein Vektor sein’);elseif (length(b) ~= d(1))
error(’Vektor b muss Länge length(A) haben’);elseif (length(x0) ~= d(1))
error(’Vektor x0 muss Länge length(A) haben’);...endx = x0(:);D = diag(A);r = b - A*x;k = 1;while (norm(r) >= tol)
x = x + r./D;r = b - A*x;k = k + 1;if (k >= iter), break; end
end
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Funktionen: Verschiedene Argumentanzahl
Wir haben schon gesehen, dass sich manche Funktionenunterschiedlich verhalten, wenn die Anzahl der Eingabe- oderAusgabeparameter unterschiedlich ist.Eine Funktion mit der Deklarationfunction foo(E1, E2, E3)wird auch aufgerufen, wenn weniger als 3 Parameter übergebenwerden. Die übrigen Variablen sind dann nicht definiert.>> x = jacobi(A,b)??? Input argument "x1" is undefined.
Error in ==> jacobi at 10x = x1(:);
Mit nargin kann die Anzahl der übergebenen Argumente abgefragtwerden. Analog nargout.
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Jacobi-Verfahren VIfunction x = jacobi6(A, b, x0, tol, iter)%JACOBI Verfahren Version 6d = size(A);if (nargin < 2)
error(’Mindestens A und b müssen übergeben werden’);elseif (d(1) ~= d(2))
error(’A muss quadratische Matrix sein’);...endif (nargin < 5), iter = 1000; endif (nargin < 4), tol = 1e-6; endif (nargin < 3),
x = zeros(length(b),1);else
x = x0(:);endD = diag(A);r = b - A*x;k = 1;while (norm(r) >= tol)
x = x + r./D;r = b - A*x;k = k + 1;if (k >= iter), break; end
endNumerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Jacobi-Verfahren VI
>> x = jacobi6(A,b);>> norm(A*x -b)ans =
9.8105e-07
>> x = jacobi6(A,b, 1e-10);??? Error using ==> jacobi at 13Vektor x muss Länge length(A) haben
>> x = jacobi6(A,b, zeros(100,1), 1e-10);
>> norm(A*x - b)ans =
9.7000e-11
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Inhalt
1 Schleifenfor-SchleifenBeispiel: Jacobi-VerfahrenWhile Schleifen
2 Bedingte Ausführungif, elseif, elseTest der Anzahl von Ein- und Ausgangsgrößen
3 Debugging
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
DebuggingIn komplizierten Codes ist es oft nicht einfach, Fehler zu finden. Das wirdeinfacher, wenn man Debug-Werkzeuge benutzt:
Auswahl und recht Maustaste → Evaluate Selection (oder F9) umeinen Teil eines Codes auszuführenBenutzung von Breakpoints
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Theorie 3.1: Inhalt
1 2D-PlotsPlotten von Funktionen mit einer VeränderlichenKonfigurieren der Plots
2 3D-PlotsKurven in 3DPlots bivariater Funktionen in 3D
3 Plots erstellen mit Hilfe der GUI
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Inhalt
1 2D-PlotsPlotten von Funktionen mit einer VeränderlichenKonfigurieren der Plots
2 3D-PlotsKurven in 3DPlots bivariater Funktionen in 3D
3 Plots erstellen mit Hilfe der GUI
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Plotten I
Verwende plot zum Plotten von Punkten im R2 und Kurven ω : R→ R2.
Syntax
plot(x, y) mit x und y Vektoren gleicher Länge:Plottet die Punkte (x(i),y(i)) und verbindet sie mit Strecken.plot(X, Y) mit X und Y Matrizen gleicher Dimension:Plottet jeweils die Spalten von X und Y in verschiedenen Farben, alsojeweils für ein j die Punkte (X(i,j),Y(i,j)) für alle i.plot(x1, y1, x2, y2, ...) == plot([x1, x2, ...], [y1,y2,...]) falls xi und yi Spaltenvektoren sind.plot(x, Y) == plot([x, x, x, ...], Y), wenn xSpaltenvektor und Y Matrix ist.
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Plotten II
>> x = -1:0.1:1;>> y = x.*sin(x.^2);>> plot(x,y)
>> y2 = x.^2;>> plot(x, y, x, y2)
>> y2 = x.^2;>> plot([x’, x’], [y’, y2’])
>> y2 = x.^2;>> plot(x, [y’, y2’])
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Plotten III
Das Aussehen der Plots kann durch mannigfaltige Optionen verändertwerden.
Farber Redg Greenb Bluec Cyanm Magentay Yellowk Blackw White
Markero Kreis∗ Stern. Punkt+ Plusx Kreuzs Quadratd Diamant^ Dreieck nach obenv Dreieck nach unten> Dreieck nach rechts< Dreieck nach links
Linienart- durchgezogene Linie-- gestrichelte Linie: gepunktete Linie-. gepunktet und gestrichelt
Die Parameter werden als String hinter die zu plottenden Daten geschrieben,z. B. plot(x,y,’r’,x2,y2,’–b’).Standard sind die Optionen plot(...,’-’,’color’,[0 0.45 0.74]).
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Plotten IV
>> plot(x,y, ’r’, x,y2,’--b’, x,y2, ’om’) >> t=0:0.1:2*pi;>> x=cos(t);>> y=sin(t);>> plot(x,y, ’*’, x,y, ’:’)>> axis equal
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Plotten V
Um die Skalierung der Achsen manuell anzupassen verwende die Befehleaxis, xlim oder ylim.
Syntax
axis([xmin, xmax, ymin, ymax]) skaliert den Bereich, so dass[xmin, ymin]× [xmax , ymax ] sichtbar ist.ylim([ymin ymax]) bzw. xlim([xmin xmax]) skaliert nur die x-bzw. y-Achse.
Hinweis: Für 3-D Plots gibt es auch zlim.
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Plotten VIWir betrachten die Funktion
x 7→ 1(x − 1)2 +
3(x − 2)2 .
>> x = linspace(0,3,500);>> plot(x, 1./(x-1).^2 + 3./(x-2).^2)>> grid on
>> ylim([0 50])
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Plotten VII
Normalerweise überschreibt Matlab das aktuelle Fenster bei einem neuenPlot-Befehl. Um einen neuen Plot in dem aktuellen zusätzlich zuerzeugen, verwende den Befehl hold on.
>> x = 0:0.01:0.5;>> plot(x, x.*sin(1./x))
>> x = 0:0.001:0.5;>> hold on;>> plot(x, x.*cos(1./x))
Verwende figure um ein neues Plot-Fenster zu öffnen.
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Logarithmische Achsen
Mit semilogx, semilogy und loglog werden Plots mit logarithmischerAchsenskalierung erstellt. Diese werden häufig verwendet umKonvergenzgeschwindigkeiten von Algorithmen besser abzulesen zukönnen.
>> n = 1:1000;>> y = exp(1) - (1+1./n).^n;>> plot(n,y)
>> n = 1:1000;>> y = exp(1) - (1+1./n).^n;>> semilogy(n,y)
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
fplotMit fplot können schnell algebraische Funktionen geplottet werden. DerUser muss sich im Gegensatz zum plot-Befehl nicht um dieDiskretisierung kümmern.Syntaxfplot(f, [xmin, xmax]) mit f Funktionshandle oder Funktionsstring:Plottet die Funktion f im Intervall [xmin, xmax ].
>> f = @(x) [200*sin(x(:))./x(:), ...x(:).^2];>> fplot(f, [-20, 20])
>> fplot(’w.*sin(w.^2)’, ...[0, 10], ’o’);
Vergleiche auch den Befehl ezplot.Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
subplot I
Mit dem Befehl subplot können mehrere Plots in ein Fenster inverschiedene Koordinatensysteme gezeichnet werden.
Syntaxsubplot(n,m,p): Erzeugt beim ersten Aufruf ein Fenster mit n ·mKoordinatensystemen in n Zeilen und m Spalten.Setzt das p-te Koordinatensystem aktiv. Der nächste plot-Befehl zeichnetin dieses Koordinatensystem.>> subplot(2,2,1), fplot(’exp(sqrt(x)*sin(12*x))’,[0 2*pi])>> subplot(2,2,2), plot(0:0.1:10, sin(round(0:0.1:10)), ’--’)>> subplot(2,2,3), fplot(’cos(30*x)/x’,[0.01 1 -15 20], ’-.’)>> subplot(2,2,4), fplot(’[sin(x), cos(2*x), 1/(1+x)]’,[0 5*pi -1.5 1.5])
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
subplot II
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Inhalt
1 2D-PlotsPlotten von Funktionen mit einer VeränderlichenKonfigurieren der Plots
2 3D-PlotsKurven in 3DPlots bivariater Funktionen in 3D
3 Plots erstellen mit Hilfe der GUI
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
plot3 I
Mit dem Befehl plot3 können Kurven ω : R→ R3 geplottet werden.
Syntax
plot3(x,y,z) mit Vektoren x, y, z: Plottet die Punkte (x(i),y(i), z(i)) für alle i ∈ 1, . . . , length(x) und verbindet siegegebenenfalls.Wichtig: length(x) == length(y) == length(z).plot3(X,Y,Z) mit Matrizen X, Y, Z: Wie plot3(X(:,i),Y(:,i), Z(:,i)) für alle Spalten i der Matrizen in verschiedenenFarben.
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
plot3 II
>> t = 0:0.01:10*pi;>> plot3(sin(t),cos(t),t)
>> t = (0:0.01:10*pi)’;>> plot3([sin(t),t./(10*pi).*sin(t)],...[cos(t), cos(t)], [t,t])
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
meshgrid
Um Funktionen f : R2 → R zu plotten, müssen wir den zu plottendenBereich erst diskretisieren.
(0, 0)
(0, 1)
(0, 2.4)
(0, 3.6)(0, 4)
(0, 0) (1, 0) (2, 0) (3, 0) (4, 0)
(2, 2.4)
(1, 1)
>> x = 0:1:4;>> y = [4, 3.6, 2.4, 1, 0];
>> [X, Y] = meshgrid(x,y)
X =0 1 2 3 40 1 2 3 40 1 2 3 40 1 2 3 40 1 2 3 4
Y =
4.0000 4.0000 4.0000 .3.6000 3.6000 3.6000 .2.4000 2.4000 2.4000 .1.0000 1.0000 1.0000 .
0 0 0 .
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
3D - Plots IHaben wir alle Punkte mit meshgrid erzeugt, kann die Funktionanschließend f : R2 → R an jedem Gitterpunkt ausgewertet werden.>> x = -5.5:0.3:5.5; y = -5.5:0.3:5.5;>> [X, Y] = meshgrid(x,y);>> f = @(x,y) sin(sqrt(x.^2+y.^2));>> Z = f(X,Y);
Die Funktion kann dann z. B. mittels des mesh Befehls alsFunktionengebirge geplottet werden:
>> mesh(X,Y,Z);
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
3D - Plots II
Neben mesh gibt es noch viele weitere Befehle die ein ähnlichesFunktionengebirge liefern, z.B. surf, waterfall, . . . Auch Beleuchtungund Schattenwurf kann eingestellt werden, um die Oberflächenrealistischer erscheinen zu lassen:
>> x = -5.5:0.05:5.5;>> y = -5.5:0.05:5.5;>> [X, Y] = meshgrid(x,y);>> Z = f(X,Y);>> surfl(X,Y,Z, ’light’)>> shading interp
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Inhalt
1 2D-PlotsPlotten von Funktionen mit einer VeränderlichenKonfigurieren der Plots
2 3D-PlotsKurven in 3DPlots bivariater Funktionen in 3D
3 Plots erstellen mit Hilfe der GUI
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Plotten mit der GUI - 1
Plots können nicht nur über Befehle, sondern auch über dieMatlab-Oberfläche verändert werden.Variablen für den Plot im Workspace markieren und Plot aus Katalogauswählen:
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Plotten mit der GUI - 2
Öffnen des Editors um erzeugten Plot nachzubearbeiten:
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Plotten mit der GUI - 3
Anpassen der Formattierung und Code-Generierung:
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Plotten mit der GUI - 4Verwenden des generierten Codes ohne GUI und Mausclicks:
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Theorie 3.2: Inhalt
1 Dünnbesetzte MatrizenMotivationSpeichermodellBeispieleErzeugen von Sparse-MatrizenVergleich voll- und dünnbesetztErhalten dünn besetzter Strukturen
2 Beispiel: Kubische Splines
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Inhalt
1 Dünnbesetzte MatrizenMotivationSpeichermodellBeispieleErzeugen von Sparse-MatrizenVergleich voll- und dünnbesetztErhalten dünn besetzter Strukturen
2 Beispiel: Kubische Splines
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
MotivationFür viele Probleme (z.B. bei der Diskretisierung partiellerDifferentialgleichungen, Bestimmung von Koeffizienten bei derInterpolation) erhält man Matrizen, die viele Nullen enthalten.Beispiel: Poissonmatrix
A =
4 −1 0 −1 0 0 0 0 0
−1 4 −1 0 −1 0 0 0 0
0 −1 4 0 0 −1 0 0 0
−1 0 0 4 −1 0 −1 0 0
0 −1 0 −1 4 −1 0 −1 0
0 0 −1 0 −1 4 0 0 −1
0 0 0 −1 0 0 4 −1 0
0 0 0 0 −1 0 −1 4 −1
0 0 0 0 0 −1 0 −1 4
Speicherplatz sparen: nur Nicht-Null-Einträge abspeichernEffizientes Rechnen: Operation mit Null-Einträgen vermeiden
Durch diese Effizienzsteigerungen können Probleme berechnet werden,die ansonsten aufgrund ihrer Größe nicht verarbeitet werden könnten.
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Speichermodell von Sparse-Matrizen
Nur von Null verschiedene Einträge werden abgespeichertDer Ort des Eintrags wird durch den Zeilen- und SpaltenindexgekennzeichnetSpeicherplatzbedarf ist ungefähr gleich der Summe von
4 Bytes, um die Anzahl der Einträge zu speichernpro Eintrag 8 Bytes für Spalten- und Zeilenindexpro Eintrag 8 Bytes für den Zahlenwert
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Beispiele für Sparse-Matrizen
A =
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
A =
(1,1) 1(2,2) 1(3,3) 1(4,4) 1
B =
2 −1 0 0 0
−1 2 −1 0 0
0 −1 2 −1 0
0 0 −1 2 −1
0 0 0 −1 2
B =
(1,1) 2(2,1) -1(1,2) -1(2,2) 2(3,2) -1(2,3) -1...
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Befehle zum Erzeugen von Sparse-Matrizen
Funktion Beschreibungspeye Dünnbesetzte Einheitsmatrixspones Einträge durch Einsen ersetzenspdiags Erzeugen von Bandmatrizensprand Einträge durch Zufallszahlen ersetzen
Konvertierung von A nach dünn- bzw. vollbesetzt:full(A)
sparse(A)
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Beispiel: spdiags
>> n = 5; e = ones(n,1); d = 4*e;>> A = spdiags([-e, d, -e], [-1,0,1], n, n);>> full(A)ans =
4 -1 0 0 0-1 4 -1 0 00 -1 4 -1 00 0 -1 4 -10 0 0 -1 4
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Beispiel: sparse
sparse(A) konvertiert A von vollbesetzt nach dünnbesetzt.A=sparse(I,J,V) erzeugt eine Matrix A mit Dimensionenmax(I)×max(J), so dass
A(I(k),J(k))=V(k).Die Einträge von V mit gleichen Indizes werden summiert.Achtung bei Dimensionen!
>> I = [1 8 9 3 5 4 1 1]’;>> J = [5 1 3 2 9 2 9 5]’;>> V = [10 1 12 21 3 3 8 2]’;>> A = sparse(I,J,V);>> A
A =
(8,1) 1(3,2) 21(4,2) 3(9,3) 12(1,5) 12(1,9) 8(5,9) 3
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Vergleich Speicherplatzbedarf
0 2 4 6 8 10 12 14 16 18 200
500
1000
1500
2000
2500
3000
3500
n: Dimension der n x n Matrix
Spe
iche
rpla
tzbe
darf
in B
ytes
Speicherplatzbedarf einer Tridiagonalmatrix
schwach besetztvoll besetzt
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Vergleich Rechengeschwindigkeit
0 20 40 60 80 100 120 140 160 180 2000
0.002
0.004
0.006
0.008
0.01
0.012
n: Dimension der n x n Matrix
gem
esse
ne G
esch
win
digk
eit a
uf P
4 in
[s]
Geschwindigkeit Lösen eines Tridiagonalsystems mit \
schwach besetztvoll besetzt
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Erhalten dünn besetzter StrukturenIn der Regel ist die Inverse einer dünn besetzten Matrix nicht mehrdünn besetzt.Daher: Oft besser, Inverse nicht explizit zu bestimmen. Stattdessenkann man oft ein lineares Gleichungssystem (z.B. mit dem \Operator) lösen.Beispiel: Matrixstruktur CSOR = D + L für Poisson-Matrix
0 10 20 30 40 50 60 70 80 90 100
0
10
20
30
40
50
60
70
80
90
100
nz = 280
CSOR
(ω = 1)
0 10 20 30 40 50 60 70 80 90 100
0
10
20
30
40
50
60
70
80
90
100
nz = 3025
C−1SOR
(ω = 1)
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Inhalt
1 Dünnbesetzte MatrizenMotivationSpeichermodellBeispieleErzeugen von Sparse-MatrizenVergleich voll- und dünnbesetztErhalten dünn besetzter Strukturen
2 Beispiel: Kubische Splines
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
InterpolationsaufgabeGegeben: Paare (xi , yi) ∈ R× R, i = 0, . . . , n mit x0 < x1 < . . . < xnder zu interpolierenden Werten.Gesucht: Funktion S : R→ R mit S(xi) = yi , i = 0, . . . , n, aus einemvorgegebenen Funktionenraum, z.B. zweimal stetig differenzierbar.
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Kubische Splineinterpolation
Idee: Stelle Funktion S auf jedem Teilintervall [xi , xi+1] als kubischesPolynom dar:
Pi(x) = αi + βi(x − xi) + γi(x − xi)2 + δi(x − xi)
3.
Wähle die Koeffizienten (αi , βi , γi , δi) so, dass Interpolationsaufgabegelöst wird und gesamte Funktion S zweimal stetig differenzierbar ist.
MomentenmethodeMomente: Mi = S ′′(xi) = P ′′i (xi) = P ′′i−1(xi)Koeffizienten (hi+1 = xi+1 − xi):
αi = yi , βi =yi+1 − yi
hi+1− 2Mi + Mi+1
6 hi+1
γi =Mi2 δi =
Mi+1 −Mi6hi+1
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Berechnung der MomenteDie Momente M sind Lösung des linearen Gleichungssystems
2 λ0µ1 2 λ1
µ2 2 λ2. . . . . . . . .
µn−1 2 λn−1µn 2
M0M1...
Mn−1Mn
=
d0d1...
dn−1dn
(1)
mit (j = 1, . . . , n − 1)
λj =hj
hj + hj−1µj = 1− λj
dj =6
hj + hj−1
(yj+1 − yj
hj− yj − yj−1
hj−1
).
Für den natürlichen Spline setzt man noch
λ0 = d0 = dn = µn = 0.
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Matlab Code
function [ P ] = kspline( x, y )n = length(x);jj = 1:n-1; j = 2:n-1;h = [x(jj+1)-x(jj)];lambda = [0, h(j+1)./(h(j)+h(j+1))];mu = [1-lambda(j), 0];d = [0, (6./(h(j)+h(j+1))).*((y(j+1)-y(j))./h(j+1) ...
- (y(j)-y(j-1))./h(j)), 0];A = 2*eye(n) + diag(lambda, 1) + diag(mu, -1);M = (A \ d’)’;alpha = y(jj); gamma = M(jj)/2;beta = (y(jj+1)-y(jj))./h(jj+1) - h(jj+1).*(2*M(jj)+M(jj+1))/6;delta = (M(jj+1)-M(jj))./(6*h(jj+1));P = [alpha’, beta’, gamma’, delta’];
end
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Matlab Code
Aus dicht mach dünn!function [ P ] = kspline( x, y )
n = length(x);jj = 1:n-1; j = 2:n-1;h = [x(jj+1)-x(jj)];lambda = [0, h(j+1)./(h(j)+h(j+1))];mu = [1-lambda(j), 0];d = [0, (6./(h(j)+h(j+1))).*((y(j+1)-y(j))./h(j+1) ...
- (y(j)-y(j-1))./h(j)), 0];A = 2*speye(n) + spdiags([[lambda, 0]’, [mu, 0]’], [1, -1], n, n);M = (A \ d’)’;alpha = y(jj); gamma = M(jj)/2;beta = (y(jj+1)-y(jj))./h(jj+1) - h(jj+1).*(2*M(jj)+M(jj+1))/6;delta = (M(jj+1)-M(jj))./(6*h(jj+1));P = [alpha’, beta’, gamma’, delta’];
end
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Laufzeiten
A vollbesetzt
n Zeit (1000 Ausführungen) Speicher100 0.79sec 93kB200 2.57sec 342kB400 32.00sec 1309kB800 138.00sec 5118kB1600 570.00sec 20237kB
A dünnbesetzt
n Zeit (A dünn) Speicher (A dünn)100 0.87sec 17kB200 1.33sec 34kB400 2.44sec 68kB800 4.85sec 137kB
1600 9.64sec 275kB
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Theorie 4.1: Inhalt
1 Organisation von DatenStrukturen (structures)Cell Arrays
2 Nützliche WerkzeugeProfilerMLINTDependency Report
3 Weitere nützliche Matlab-Befehle
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Inhalt
1 Organisation von DatenStrukturen (structures)Cell Arrays
2 Nützliche WerkzeugeProfilerMLINTDependency Report
3 Weitere nützliche Matlab-Befehle
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Structures
Einfaches Beispiel:
buch||__ .autor ______ ’Barry W. Boehm’||__ .titel ______ ’Software Engineering Economics’||__ .preis ______ 89.00||__ .jahr _______ 1981
Daten beliebiger Art können innerhalb einer Struktur gespeichert werden.
Vorteile:sinnvoll geordnete DatenZugriff mit konkreter Bezeichnung anstelle von Indizesmultidimensionale Struktur möglich
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Aufbau einer Struktur und Zugriff
direkt mit Zuweisungen:>> buch.autor = ’Barry W. Boehm’;>> buch.titel = ’Software Engineering Economics’;>> buch.preis = 89.00;>> buch.jahr = 1981;
mit der struct-Funktion:>> buch = struct(’autor’,’Barry W. Boehm’, ...
’titel’,’Software Engineering Economics’, ...’preis’, 89.00, ’jahr’, 1981);
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Aufbau einer Struktur und Zugriff
Zugriff:>> buchbuch =
autor: ’Barry W. Boehm’titel: ’Software Engineering Economics’preis: 89jahr: 1981
>> buch.jahrans =
1981
Anfügen weiterer Elemente: struct array (Index hinzufügen)>> buch(2).autor = ’Steve McConnel’>> buch(2).title = ’Code Complete’>> ...
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Weitere Befehle zu Strukturen
Funktion Beispiel Beschreibung
fieldnames
>> fieldnames(buch);ans = ’autor’
’titel’’preis’’jahr’
alle Feldnamen holen
getfield>> getfield(buch(2),
’titel’)ans = Code Complete
Inhalt eines Feldes holen
setfield>> setfield(buch(2),
’preis’,59.90) Feldinhalt setzen
isstruct >> isstruct(buch) wahr (= 1) für Struktur
isfield >> isfield(buch,’titel’) wahr (= 1) für Feld
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Weitere Befehle zu Strukturen
Funktion Beispiel Beschreibung
rmfield
>> rmfield(buch,’titel’)ans =1x2 struct array with fields:
autorpreisjahr
Feld löschen
deal
>> [a,b] = deal(buch.titel)a =Software Engineering Economicsb =Code Complete
Feldinhalte inmehrere Varia-blenauslesen
struct2cell >> b_c = struct2cell(buch);Struktur in einCell-Arrayumwandeln
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Besonderheiten bei Strukturen
Vereinfachte Syntax, um über alle Felder einer Struktur zu operieren:
Feld in eckige Klammern einschließen, z.B.:>> total = sum([buch.preis]);
Dies entspricht einer durch Kommata getrennten Liste:>> total = sum([buch(1).preis, buch(2).preis, ...]);
Zwei Formen der Datenorganisation möglich, entweder ebenen- oderelementweise (siehe folgende Folien).
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Datenorganisation: Ebene vs. Einzel-Element
In einem Bild werden pro Pixel die rot/grün/blau-Werte gespeichert.
0 20 10 15 ...10 0 20 12 ... 2 12 34 12 ... . . .
20 24 44 54 ...14 30 2 0 ...54 27 1 2 ... . . .
14 30 2 0 ... 2 12 34 12 ... 0 20 10 15 ... . . .
AA
.r
.g
.b
A.r(1, 2) = 20
B(1,1)
.r 00
.g 20
.b 14
B(2,1)
.r 10
.g 14
.b 22
.r
.g
.b
B(1,2)
.r 20
.g 24
.b 30
.r
.g
.b
B(2,2)
.r 00
.g 30
.b 12
.r 00
.g
.b
...
...
...
..
..
..
..
..
..
BB
B.r(1, 2) = 20
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Beispiel für unterschiedliche Datenorganisation
1) Teilbild holen:
Ebenen-Organisation>> r_sub = A.r(1:10,1:10);>> g_sub = A.g(1:10,1:10);>> b_sub = A.b(1:10,1:10);
Einzel-Element-Organisation>> sub = B(1:10,1:10);
2) Gesamte Farbebene holen:
Ebenen-Organisation
>> r_ebene = A.r;
Einzel-Element-Organisation>> r_ebene = zeros(100,100);>> for k = 1:(100*100)
r_ebene(k) = B(k).r;end;
Also: Daten sollte man immer so organisieren, dass es für die amhäufigsten benötigten Operationen günstig ist.
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Geschachtelte Strukturen
Strukturen können beliebig geschachtelt werden.>> A = struct(’name’,’Hans’,
’zeiten’, [14,15,16; 15.3,14.8,13.6],’adresse’, struct(’strasse’,’Hauptstr. 38’,’stadt’,’Berlin’))
>> A(2).name = ’Max’;>> A(2).zeiten = [14,15,16; 15.2,14.6,13.8];>> A(2).adresse.strasse = ’Albweg 3’;>> A(2).adresse.stadt = ’Muenchen’;
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Geschachtelte Strukturen
A|__ A(1) _____ .name ______ Hans| || |__ .zeiten ____ [ 14 15 16 ]| | [ 15.3 14.8 13.6]| || |__ .adresse ___ .strasse __ Hauptstr. 38| || |_ .stadt ____ Berlin|||__ A(2) _____ .name ______ Max
||__ .zeiten ____ [ 14 15 16 ]| [ 15.2 14.6 13.8]||__ .adresse ___ .strasse __ Albweg 3
||_ .stadt ____ Muenchen
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Cell Arrays
ein Cell Array kann mehrere Matlab-Felder enthalten, z.B:
cell (1,1)
1 2 34 5 67 8 9
cell (1,2)
’Hello world!’
cell (2,1)
[1.25 3.75 0.34]
cell (2,2)
25
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Aufbau eines Cell Arrays und Zugriff
Möglichkeit 1 – Cell Indexing:>> A(1,1) = {[1 2 3; 4 5 6; 7 8 9]};>> A(1,2) = {’Hello world!’};>> A(2,1) = {[1.25 3.75 0.34]};>> A(2,2) = {25};
Möglichkeit 2 – Content Indexing:>> A{1,1} = [1 2 3; 4 5 6; 7 8 9];>> A{1,2} = ’Hello world!’;>> A{2,1} = [1.25 3.75 0.34];>> A{2,2} = 25;
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Aufbau eines Cell Arrays und Zugriff
Beispiele für Zugriff:
>> A(2,2)ans = [25]
>> A(2,2)+5??? Error using ==> +Function ’+’ notdefined for variablesof class ’cell’.
>> A{2,2}ans = 25
>> A{2,2}+5ans = 30
>> A{1,2}ans =Hello world!
>> A{1,1}(1,1)ans = 1
>> A{:,1}ans =
1 2 34 5 67 8 9
ans =1.250 3.750 0.340
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Weitere Befehle zu Cell-Arrays
Zellen löschen mit eckigenKlammern, z.B.:>> A(2,2) = []>> A(:,2) = []
Dimensionen des Cell Arraysumformen:>> B = reshape(A,4,1);
Speicher für neues Cell Arrayreservieren:>> C = cell(5,3);
Struktur des Cell Arraysgraphisch anzeigen:>> cellplot(A,’legend’)
double
char
sparse
structure
other
Hello world!
25
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Weitere Befehle zu Cell-Arrays
Funktion Beschreibungcell2struct Cell Array in Struktur-Feld umwandelncelldisp gesamtes Cell-Array anzeigencellfun eine Funktion auf jede Zelle eines Cell Arrays anwendendeal Cell Array in mehrere Variablen ausleseniscell wahr (= 1) für ein Cell Array
Sonstigesgesamte Structures können in einer Zelle abgespeichert werdenCell Arrays können beliebig tief geschachtelt werden(Zugriff dann z.B. mit A{2,3}{1,2}{1,5})
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Inhalt
1 Organisation von DatenStrukturen (structures)Cell Arrays
2 Nützliche WerkzeugeProfilerMLINTDependency Report
3 Weitere nützliche Matlab-Befehle
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Profiler
Detaillierte Rechenzeitanalyse: Wieviel Zeit wurde für welche Zeileoder Funktion verbraucht?Auflistung geordnet nach RelevanzGut geeignet zum Auffinden von EffizienzproblemenFalls optimiert werden soll, wo wäre Optimierung sinnvoll?Vorgehen:
1 Profile Aufzeichnung starten mit profile on2 m-File aufrufen3 Profile report ansehen mit profile viewer.4 Optionen: Abspeichern von Berichten, Detail-Level setzen (z.B.
interne Funktionen in Laufzeitmessung einschließen), . . .
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Beispiel: Profiler, Zusammenfassung
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Beispiel: Profiler, Details
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
MLINT Code Checker
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Dependency Report
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Inhalt
1 Organisation von DatenStrukturen (structures)Cell Arrays
2 Nützliche WerkzeugeProfilerMLINTDependency Report
3 Weitere nützliche Matlab-Befehle
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Berechnung von EigenwerteDer Befehl eig berechnet die Eigenwerte einer Matrix.
lambda = eig(A): Eigenwerte von A im Spaltenvektor lambda.[V,Lambda] = eig(A): Eigenwerte und Eigenvektoren, mit LambdaDiagonalmatrix (A*V =V*D).[V,Lambda] = eig(A,B): verallgemeinerte Eigenwerte undEigenvektoren (A*V = B*V*D).
>> A = [2 0 0 ; 0 -3 0; 0 0 5];>> eig(A)
ans =
-325
>> [V,D] = eig(A)
V =
0 1 01 0 00 0 1
D =
-3 0 00 2 00 0 5
Hinweis: Siehe auch eigs.Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Fourier-Transformation
fft berechnet die schnelle Fourier-Transformation (Fast FourierTransform) einer Funktion.Inverse Fourier-Transformation mit ifft.
0 0.2 0.4 0.6 0.8 1
Zeit
-2
-1.5
-1
-0.5
0
0.5
1
1.5
2
Sig
na
l
-40 -30 -20 -10 0 10 20 30 40
Frequenz
0
0.1
0.2
0.3
0.4
0.5
0.6
Sp
ektr
um
g = @(t)sin(20*pi*t)+cos(10*pi*t);N=51;t = linspace(0,1,51);gvals = g(t);
G = fft(gvals);G = G/N;G = abs(G);
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Teil 4.2: Inhalt
1 Grundbegriffe objektorientierter ProgrammierungKlassen, Attribute und ObjekteAbstraktion und Schnittstellen
2 Objektorientierung in MatlabFunktionsumfangMatlab-Datentypen und KlassenhierarchieUnterschiede zu C++/JavaEntwerfen eigener KlassenBeispiel 1: eine Polynom-KlasseBeispiel 2: Aktienkurs-AnalyseVererbung
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Inhalt
1 Grundbegriffe objektorientierter ProgrammierungKlassen, Attribute und ObjekteAbstraktion und Schnittstellen
2 Objektorientierung in MatlabFunktionsumfangMatlab-Datentypen und KlassenhierarchieUnterschiede zu C++/JavaEntwerfen eigener KlassenBeispiel 1: eine Polynom-KlasseBeispiel 2: Aktienkurs-AnalyseVererbung
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Grundbegriffe objektorientierter Programmierung
Bei komplexen Problemen kann es sinnvoll sein objektorientierteProgrammierung (OOP) einzusetzen um die Komplexität einfacherbeherrschbar zu machen.
Grundideen:
System wird durch das Zusammenspiel von Objekten beschriebenObjekten sind Attribute (Eigenschaften) und Methoden zugeordnetJedes Objekt ist in der Lage mit anderen Objekten zu kommunizierenDas Konzept einer Klasse fasst Objekte aufgrund ähnlicherEigenschaften zusammen.Ein Objekt wird im Programmcode als Instanz einer Klasse definiert.
Die wohl bekanntesten objektorientierten Sprachen sind C++ und Java.Allerdings stellt auch MATLAB einige Konzepte der OOP bereit.
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Klassen, Attribute und Objekte
Um den Unterschied zwischen Klasse und Objekt zu verdeutlichennehmen wir als Beispiel ein einfaches Autoquartett.
Klasse: AutoAttribute:
Preis (EUR)Hubraum (ccm)Leistung (PS)Von 0 auf 100 (s)Geschwindigkeit (km/h)Verbrauch (l)
Objekt der Klasse Auto: Porsche GT 3Preis (EUR): 121.100Hubraum (ccm): 3600Leistung (PS): 381Von 0 auf 100 (s): 4,4Geschwindigkeit (km/h): 306Verbrauch (l): 9,8
Das Autoquartett ist nun, abstrakt vom Standpunkt der Daten-verarbeitung aus gesprochen, eine Menge von Objekten der Klasse Auto.
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Klassen und Methoden
Das Konzept der Klasse beinhaltet mehr als eine Struktur zur Verwaltungzusammengehöriger Daten. Vielmehr dient es der Abstraktion:
Wir haben eine gewisse Abstraktion bereits kennen gelernt:
BeispielWenn wir das Unterprogramm sin(x) aufrufen, dann erwarten wir, dasses uns den Sinus berechnet. Wie, das ist uns in der Regel egal.
Im Prinzip schafft die OOP lediglich eine weitere Abstraktionsebene:den Benutzer interessiert es nicht, wie die Daten abgelegt werden(z.B. ob die Leistung intern in PS oder kW gespeichert wird)Objekte kommunizieren über definierte Schnittstellen in Formbereitgestellter Methoden.Programme können mit Objekten arbeiten, ohne über die exakteinterne Realisierung Bescheid zu wissen!
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Inhalt
1 Grundbegriffe objektorientierter ProgrammierungKlassen, Attribute und ObjekteAbstraktion und Schnittstellen
2 Objektorientierung in MatlabFunktionsumfangMatlab-Datentypen und KlassenhierarchieUnterschiede zu C++/JavaEntwerfen eigener KlassenBeispiel 1: eine Polynom-KlasseBeispiel 2: Aktienkurs-AnalyseVererbung
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
OOP in MATLAB: Funktionsumfang
Überladen von Funktionen und OperatorenKapselung von Daten und Methoden:
Objekteigenschaften nicht sichtbar von KommandozeileObjektvariablen nur änderbar über Klassenfunktionen
Vererbung:Vererbung von Variablen und Funktioneneinfache oder mehrfache Vererbung möglicheine oder mehrere Generationen
Aggregation (Zusammenfassen von Objekten)
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Matlab-Datentypen und Klassenhierarchie
array
numeric char cell struct
double
sparse
int8 uint8
int16 uint16
int32 uint32
single
user class
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Unterschiede zu OOP in C++/Java
Die neuen Klassen werden während der Laufzeit erzeugt(Matlab ist ein Interpreter, kein Compiler)Es gibt keine Destruktoren in Matlab, stattdessen muss man dieclear-Funktion verwendenVererbung wird durch Aufruf der class-Funktion mit Parametern realisiertWeitere Einschränkungen gegenüber C++/Java:
Es gibt keine abstrakten Klassen, virtuelle Vererbung, o.ä.Es gibt keine Interfaces (Java)Es gibt keinen “scoping”-Operator (:: in C++)Es gibt keine Templates (C++)
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Entwerfen eigener Klassen
Klassenverzeichnis erzeugenName: @classnameenthält alle zu dieser Klasse gehörenden m-Files (Methoden)
Hilfsfunktionen und private Methodenm-Files, die nicht direkt aufgerufen werden sollen kommen in dasprivate-Verzeichnis: @classname/privateWenn das Klassenobjekt übergeben wird, spricht man von “privatemethods”, sonst von “helper functions”
Objekte erzeugendurch Aufruf des Konstruktors (gleicher Name wie die Klasse)Übergeben von Initialisierungsparametern möglichBeispiel: p = polynom([1 0 -2 -5])
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Entwerfen eigener Klassen
Aufruf einer zu einem Objekt gehörenden MethodeSyntax:[out1,out2,...] = methodname(object,arg1,arg2,...)Der erste Parameter muss das Objekt enthalten, dann folgen dieArgumente.Beispiel: d = evaluate(p,3);
Neues Klassenverzeichnis zum Matlab-Suchpfad hinzufügenz.B.: die Klasse polynom befindet sich in/my_classes/@polynom (unix)c:\my_classes\@polynom (windows)dann Hinzufügen zum Matlab-Suchpfad mit addpath:>> addpath /my_classes (unix)>> addpath c:\my_classes (windows)
Überprüfen mit>> path
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Methoden der Basis-Klasse
Ziel: Neue Klasse dem Standard-Verhalten von Matlab anpassen.
Methode BeschreibungKonstruktor der Klasse Erzeugt ein Objekt der Klasse
display
Wird von Matlab aufgerufen, wenn der In-halt eines Objekts angezeigt wird (z.B. beiEingabe eines Ausdrucks ohne abschließen-den Strichpunkt)
set und get Setzen/Auslesung von Attributen der Klassesubsref und subsasgn Ermöglicht Verwendung von Indizesend Unterstützung der end-Syntax bei Indizessubsindex Wird aufgerufen, falls Objekte zur Indizierung
verwendet werden; z.B. array(A) mit A Objekt
Konverter, z.B.double oder char
Konvertieren von Objekten in Matlab-Datentypen
Funktionen & Ope-ratoren
Jeder Operator hat zugehörige Funktion, dieüberladen werden kann (z.B. plus(a,b)).
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Beispiel 1: Die Polynom-Klasse
Designentscheidungen für die Klasse polynom:Daten:
lediglich einen Zeilenvektor c mit den Koeffizienten des PolynomsMethoden:
Der Konstruktor zum Erzeugen neuer PolynomeZwei Konverter: nach double und nach charDie display-Methode zum einfachen AnzeigenIndizes-Funktionalität (subsref) (hier nicht behandelt)überladene +, * Operatoren (weitere könnten leicht hinzugefügtwerden)überladene polyval- und diff- Funktionen (weitere könnten leichthinzugefügt werden)
Das folgende Code-Beispiel ist entnommen aus der Matlab-Anleitung.
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Konstruktor: @polynom/polynom.m
function p = polynom(a)%POLYNOM Polynomial class constructor.% p = POLYNOM(v) creates a polynomial object% from the vector v, containing the coefficients% of descending powers of x.
if nargin == 0p.c = [];p = class(p,’polynom’);
elseif isa(a,’polynom’)p = a;
elsep.c = a(:).’;p = class(p,’polynom’);
end
Der Konstruktor könnte gleichzeitig auch die Eingaben prüfen um dieIntegrität der Daten sicher zu stellen. Zum Beispiel könnte man hierverhindern, dass der Vektor a die Werte NaN oder inf enthält und eineentsprechende Fehlermeldung ausgeben.
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
double-Konverter: @polynom/double.m
function c = double(p)% POLYNOM/DOUBLE Convert polynom object to coefficient vector.% c = DOUBLE(p) converts a polynomial object to the vector c% containing the coefficients of descending powers of x.
c = p.c;
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
char-Konverter: @polynom/char.mfunction s = char(p)% POLYNOM/CHAR% CHAR(p) is the string representation of p.cif all(p.c == 0)
s = ’0’;else
d = length(p.c) - 1;s = [];for a = p.c;
if a ~= 0;if ~isempty(s)
if a > 0s = [s ’ + ’];
elses = [s ’ - ’]; a = -a;
endendif a ~= 1 | d == 0
s = [s num2str(a)];if d > 0
s = [s ’*’];end
end%...
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
char-Konverter: @polynom/char.m
%...if d >= 2
s = [s ’x^’ int2str(d)];elseif d == 1
s = [s ’x’];end
endd = d - 1;
endend
Beispiel:>> p = polynom([1 0 -2 -5]);>> char(p)ans = x^3 - 2*x - 5
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
dispay-Methode: @polynom/display.m
function display(p)% POLYNOM/DISPLAY Command window display of a polynom
disp(’ ’);disp([inputname(1),’ = ’])disp(’ ’);disp([’ ’ char(p)])disp(’ ’);
Beispiel:>> p = polynom([1 0 -2 -5]);>> pp =
x^3 - 2*x - 5
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
+ Operator: @polynom/plus.m
function r = plus(p,q)% POLYNOM/PLUS Implement p + q for polynoms.
% nach Polynom konvertieren falls nötigp = polynom(p);q = polynom(q);
% Laenge der Vektoren anpassenk = length(q.c) - length(p.c);r = polynom([zeros(1,k) p.c] + [zeros(1,-k) q.c]);
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
* Operator: @polynom/mtimes.m
function r = mtimes(p,q)% POLYNOM/MTIMES Implement p * q for polynoms.
p = polynom(p);q = polynom(q);r = polynom(conv(p.c,q.c));
Beispiele:>> p = polynom([1 0 -2 -5]);>> q = p+1q =
x^3 - 2*x - 4>> r = p*qr =
x^6 - 4*x^4 - 9*x^3 + 4*x^2 + 18*x + 20
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
polyval-Methode: @polynom/polyval.m
function y = polyval(p,x)% POLYNOM/POLYVAL POLYVAL(p,x) evaluates p at the points x.y = 0;for a = p.c
y = y.*x + a;end
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
diff-Methode: @polynom/diff.m
function q = diff(p)% POLYNOM/DIFF DIFF(p) is the derivative of the polynom p.c = p.c;d = length(c) - 1; % degreeq = polynom(p.c(1:d).*(d:-1:1));
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Beispiel 2: Aktienkursanalyse
Designentscheidungen für die Klasse stock:Daten: Name der Aktie und Struktur mit Daten:
’7/20/1999’’7/21/1999’’7/24/1999’’7/25/1999’...
14.4515.2115.6314.87...
stock
.name
.data
’Deutsche Telekom’
.open
.close
.hi
.lo
.volume
.date
Methoden:Der Konstruktor zum Erzeugen der stock-ObjekteMethode loaddata zum Laden von DatensätzenÜberladene display und plot-Funktionen
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Konstruktor: @stock/stock.m
function s = stock(name)% STOCK class construction% s = STOCK(name) creates a stock object of with% the specified name.s.data = struct([]);if nargin == 0
s.name = ’none’;else
s.name = name;ends = class(s,’stock’);
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
loaddata-Methode: @stock/loaddata.m
function s = loaddata(a, filename)% LOADDATA load stock data from specified filename% LOADDATA(stock, filename)% Example:% mystock = stock(’SellIt Inc.’);% loaddata(mystock, ’sellit.txt’);% Required data file format:% <date> <open> <hi> <lo> <close> <volume>% 02/14/2000 65.4 66.95 65.25 66.95 1914379% 02/15/2000 66.2 67.63 66.1 66.29 2164369% ...
a.data = struct(’date’,’’,’open’,0,’close’,0,’hi’,0,’lo’,0);[a.data.date, a.data.open, a.data.hi, ...
a.data.lo, a.data.close, a.data.volume] = ...textread(filename, ’%s %n %n %n %n %n’, ...
’commentstyle’, ’matlab’);s = a;
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Überladene display-Methode: @stock/display.m
function display(stock)% STOCK/DISPLAY Command window display of a stockif ~isempty(inputname(1))
disp(’ ’); disp([inputname(1),’ = ’]); disp(’ ’);enddisp([’ ’ stock.name ])disp([’ last quote from ’ cell2mat(stock.data.date(end)) ]);open = stock.data.open(end);close = stock.data.close(end);close_old = stock.data.close(end-1);disp([’ open: ’ num2str(open) ]);disp([’ close: ’ num2str(close) ]);disp([’ high: ’ num2str(stock.data.hi(end)) ]);disp([’ low: ’ num2str(stock.data.lo(end)) ]);disp([’ delta prev day (%): ’ num2str((close-close_old)/...
close_old*100,2) ’%’]);disp(’ ’);
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Überladene plot-Methode: @stock/plot.mfunction plot(s, startdate, enddate)% PLOT Draw a line graph of a stock% PLOT(stock, startdate, enddate) shows% the stock for the specified date range.% (startdate and enddate are optional)
if nargin < 2start_index = 1;
elsestart_index = min(find(datenum(s.data.date)>=datenum(startdate)));
endif nargin < 3
end_index = length(s.data.date);else
end_index = max(find(...datenum(s.data.date)<=datenum(enddate)));
endplot(datenum(s.data.date(start_index:end_index)),...
s.data.close(start_index:end_index),’r-’);title([s.name ’ from ’ ...
cell2mat(s.data.date(start_index)) ’ to ’ ...cell2mat(s.data.date(end_index))],’FontSize’,14);
datetick(’x’);ylabel(’Closing stock price’);grid;
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Beispiel für Verwendung der stock-Klasse:
>> s1 = stock(’Daimler-Chrysler’);>> s2 = stock(’Deutsche Telekom’);>> s1 = loaddata(s1,’data/daimler-chrysler.txt’);>> s2 = loaddata(s2,’data/telekom.txt’);>> s2ans =
Deutsche Telekomlast quote from 04/19/2002
open: 16.86close: 17.05high: 17.13low: 16.76
delta prev day (%): 0.83%>> subplot(2,1,1);>> plot(s1,’07/01/2000’,’09/30/2000’);>> subplot(2,1,2);>> plot(s2);
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Beispiel für Verwendung der stock-Klasse:
Jul Aug Sep Oct50
52
54
56
58
60
62
64
Daimler−Chrysler from 07/03/2000 to 09/29/2000
Clo
sin
g s
tock p
rice
1999 2000 2001 2002 20030
20
40
60
80
100
120
Deutsche Telekom from 02/02/1999 to 04/19/2002
Clo
sin
g s
tock p
rice
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Vererbung
Die Objektorientierung erlaubt ein hohes Maß an Wiederverwendbarkeit undWartbarkeit von Code. Einfaches Beispiel:
classdef Rectangle < handleproperties (SetAccess = private)
length;width;
endmethods
function obj = Rectangle(len, wid)obj.length = len;obj.width = wid;
endfunction a = diagonal(obj)
a = sqrt(obj.length^2 + obj.width^2);end%... many additional functions
endend
(Achtung: wir verwenden hier eine kompaktere Art der Klassendefinition!)
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Vererbung
Für Quadrate ist die Implementierung von diagonal effizienter machbar. Wirerben also von rectangle und überladen diese Methode:
classdef square < rectanglemethods
function obj=square(width)obj = obj@rectangle(width, width);
endfunction a = diagonal(obj)
a = 1.414213562373095*obj.length;end
endend
>> r = rectangle(2,2); s = square(2);>> r.diagonal - s.diagonal
ans =
4.4409e-16
(in diesem Fall sparen wir uns die Wurzel und brauchen dafür lediglich eineMethode neu zu implementieren anstelle der ganzen Klasse.)
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)
Vererbung
Abschließende Kommentare zur Vererbung:Wir erben die Implementierung und Schnittstellen der Basisklasse.Die abgeleitete Klasse ergänzt die Funktionalität der Basisklasse oderschränkt diese ein.Falls die Funktionalität der Basisklasse ergänzt wird, profitieren wir davonauch in der abgeleiteten Klasse.Richtig eingesetzt erlaubt die Vererbung ein besseres Verständnis desCodes für den Autor und Außenstehende und damit eine verbesserteWartbarkeit.Einfachere Codes sind zwar oft die besseren Codes, aber zwanghafterEinsatz von Vererbung macht Codes nicht unbedingt einfacher.
Sehr grobe Faustregel für sinnvolle Vererbung:prüfen Sie immer, ob eine ist ein-Beziehung vorliegt...
Gute Vererbung: stummfilm < film (ein Stummfilm ist ein Film)Schlechte Vererbung: film < videokassette (... enthält einen Film)
Numerische Mathematik M2 z.T. basierend auf Boris von Loesch Einführung in die Programmierung (MA8003)