Theorie 1.1: Inhalt -  · Inhalt 1 Einführung Motivation Grundlagen 2 VektorenundMatrizen...

Preview:

Citation preview

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)

Recommended