Algorithmik kontinuierlicher Systeme

Ähnliche Dokumente
Iterative Verfahren, Splittingmethoden

Beginn der Vorlesung zur Numerik I (Wintersemester 2010/2011)

5.3 Iterative Lösungsverfahren für lineare Gleichungssysteme

Iterative Lösung Linearer Gleichungssysteme

Matrizenoperationen mit FORTRAN

Optimierung. Optimierung. Vorlesung 2 Optimierung ohne Nebenbedingungen Gradientenverfahren Thomas Brox, Fabian Kuhn

2 Lineare Gleichungssysteme

Der CG-Algorithmus (Zusammenfassung)

bekannt: Eliminationsverfahren von Gauß Verfahren führt zu einer Zerlegung der Koeffizientenmatrix: A = LR A = LR

Kurs über Lineare Gleichungssysteme. PD Dr. Karin Halupczok

Matrizen, Gaußscher Algorithmus 1 Bestimmung der inversen Matrix

Numerische Mathematik für Ingenieure und Physiker

3 Matrizenrechnung. 3. November

1 Singulärwertzerlegung und Pseudoinverse

37 Gauß-Algorithmus und lineare Gleichungssysteme

2.2 Lineare Gleichungssysteme (LGS)

Gliederung. Links-Rechts-Zerlegung Elimination faktorisiert A = L R. Determinante Inverse. Kleinste Quadrate. Lösung durch. Links-Rechts- Zerlegung

Lineare Gleichungssysteme Hierarchische Matrizen

1 Matrizenrechnung zweiter Teil

Nichtlineare Gleichungssysteme

Überbestimmte Gleichungssysteme

Kevin Caldwell. 18.April 2012

6 Lineare Gleichungssysteme

18.4 Das Newton-Verfahren

Numerische Lineare Algebra

Inexakte Newton Verfahren

3 Lineare Differentialgleichungen

Spezialfall: Die Gleichung ax = b mit einer Unbekannten x kann mit Hilfe des Kehrwerts 1 a = a 1 gelöst werden:

Übungspaket 23 Mehrdimensionale Arrays

Lineare Algebra. Mathematik II für Chemiker. Daniel Gerth

Lineare Gleichungssysteme und Matrizen

Übungspaket 23 Mehrdimensionale Arrays

Mathematik II für Studierende der Informatik. Wirtschaftsinformatik (Analysis und lineare Algebra) im Sommersemester 2016

1 Stückweise konstante Funktionen (ca =10 Punkte)

Modellieren in der Angewandten Geologie II. Sebastian Bauer

Newton-Verfahren für ein Skalarfunktion

( ) Lineare Gleichungssysteme

8.2 Invertierbare Matrizen

Lineare Ausgleichsprobleme. Jetzt: Lösung überbestimmter linearer GS, d.h. mehr Gleichungen als Unbekannte

9 Lösung linearer Gleichungssysteme III: Iterative Methoden

Parallele und verteilte Programmierung

Serie 10: Inverse Matrix und Determinante

Ausgewählte Lösungen zu den Übungsblättern 4-5

Nichtlineare Gleichungssysteme

Entwurf eines FPGA-Cores zur Simulationsbeschleunigung zeitkontinuierlicher Modelle im HiL Kontext

7.1 Matrizen und Vektore

Das CG-Verfahren. Sven Wetterauer

Der Kern einer Matrix

[Nächste Frage: wie wissen wir, ob Spaltenvektoren eine Basis bilden? Siehe L6.1] , enthält eine Basis v. V, nämlich und somit das ganze V.

Lösungen zum 5. Aufgabenblatt

18.2 Implizit definierte Funktionen

Matrizen und Determinanten, Aufgaben

Newton-Verfahren zur gleichungsbeschränkten Optimierung. 1 Gleichungsbeschränkte Optimierungsprobleme

Lineare Gleichungssysteme

Skalarprodukte (Teschl/Teschl Kap. 13)

Nichtlineare Gleichungen, mehrere Unbekannte

Kapitel 1. Vektoren und Matrizen. 1.1 Vektoren

Matrizen, Determinanten, lineare Gleichungssysteme

Jacobi- und Gauß-Seidel-Verfahren, Jacobi-Relaxationsverfahren

6 Iterationsverfahren für lineare und nichtlineare Gleichungssysteme

Das inhomogene System. A x = b

Kapitel 5. LU Zerlegung. 5.1 L- und U-Matrizen

Lineare Gleichungssysteme - Grundlagen

A2.3 Lineare Gleichungssysteme

$Id: linabb.tex,v /01/09 13:27:34 hk Exp hk $

2. Dezember Lineare Algebra II. Christian Ebert & Fritz Hamm. Skalarprodukt, Norm, Metrik. Matrizen. Lineare Abbildungen

2.2 Lineare Gleichungssysteme

Lineare Gleichungssysteme

2. Geben Sie für das Jacobi-Verfahren eine scharfe a-priori Abschätzung für den Fehler. x (10) x p

3 Elementare Umformung von linearen Gleichungssystemen und Matrizen

Lösung Semesterendprüfung (Nachprüfung)

Lineare Gleichungssysteme

Mathematik IT 2 (Lineare Algebra)

Inhalt Kapitel I: Nichtlineare Gleichungssysteme

Vorlesung, 26. Mai 2011, Inhalt. Eigenwerte und Eigenvektoren. Gewöhnliche Differentialgleichungen

Methode der kleinsten Quadrate

Serie 8: Fakultativer Online-Test

4.5 Überbestimmte Gleichungssysteme, Gauß sche Ausgleichrechnung

Systeme von Differentialgleichungen. Beispiel 1: Chemische Reaktionssysteme. Beispiel 2. System aus n Differentialgleichungen 1. Ordnung: y 1.

20 Kapitel 2: Eigenwertprobleme

Lineare Gleichungssysteme

Dreiecksysteme und LR-Faktorzerlegung

9.2 Invertierbare Matrizen

Das Lösen linearer Gleichungssysteme

Zugriff auf Matrizen. Anhängen von Elementen. Punktweise Operatoren. Vektoren und Matrizen in MATLAB II

1.Übung Mathematik I

WiMa-Praktikum 1. Woche 8

Funktionen mehrerer Variabler

mit "Skalarprodukt" aus i-tem "Zeilenvektor" und j-tem "Spaltenvektor"

Eigenwerte. Ein Eigenwert einer quadratischen n n Matrix A ist ein Skalar λ C (eine komplexe Zahl) mit der Eigenschaft Ax = λx (1)

Lineare Algebra und Numerische Mathematik für D-BAUG. Serie 6

5 Interpolation und Approximation

Aufgabensammlung aus Mathematik 2 UMIT, SS 2010, Version vom 7. Mai 2010

Lösung (die Geraden laufen parallel) oder unendlich viele Lösungen.

3.4 Der Gaußsche Algorithmus

Elemente der Analysis II

Kurze Geschichte der linearen Algebra

Transkript:

Algorithmik kontinuierlicher Systeme Iterative Verfahren (2/2)

Ziel dieser Vorlesung Wie schnell können wir Gleichungssysteme lösen? O(n 3 ) LR- oder QR-Zerlegung: Immer anwendbar Komplexität im Allgemeinen optimal Aber: n kann sehr groß werden Können wir wichtige Spezialfälle schneller lösen? Iterative Verfahren! 2

Wieso lineare Gleichungssysteme? Das einfachste sinnvolle Modell Können effizient ausgewertet werden Nichtlineare Probleme können linear approximiert werden 3

Motivation Mit linearen Gleichungssystemen können wir vor Tsunamis und Hurricanes warnen Auswirkungen globaler Erwärmung abschätzen Krebs frühzeitig diagnostizieren Autos, Flugzeuge etc. sicherer machen 4

Briefwechsel Am 26. Dezember 1823 schreibt C.F. Gauss an seinen Schüler Christian Gerling [ ] 5

[ ] 6

7

Iterative Verfahren Der Brief von Gauss im Jahre 1823 beschreibt das erste iterative Lösungsverfahren Das Verfahren wurde erst 1874 von Ludwig Seidel publiziert Varianten vom Gauss-Seidel-Verfahren sind das Jacobi- Verfahren und das SOR-Verfahren Vorteile: Schneller als Gauss-Elimination weniger anfällig gegen Rechenfehler 8

Fragestellungen der Algorithmik Algorithmik: Was ist der zugrundeliegende Algorithmus? Wann ist der Algorithmus anwendbar? Wie schnell ist der Algorithmus? Können wir weitere Verbesserungen vornehmen? Diese Fragen sind gleichzeitig der Fahrplan dieser Vorlesung 9

Kurzer Werbeblock Junior Consulting Team e.v. gemeinnütziger Verein von Studenten professionelle Unternehmensberatung Studenten der FAU und TH Nürnberg Website: jct.de Meinungsumfrage unter https://limesurvey.akqui.se/limesurvey/index.php/861268? lang=de 10

Übersicht Was ist der zugrundeliegende Algorithmus? Wann ist der Algorithmus anwendbar? Wie schnell ist der Algorithmus? Können wir weitere Verbesserungen vornehmen? 11

Von 1823 nach 2017 Die Matrixnotation wurde erst 1850 eingeführt! Heute würde man schreiben 2 +67 13 28 26 6 4 13 +69 50 6 28 50 +156 78 26 6 78 +110 3 7 5 2 3 a 6b 7 4c5 = d 2 6 4 6 +7558 +14604 22156 3 7 5 12

Von 1823 nach 2017 Startwert: x 0 = 0 0 0 0 T Koeffizient d optimieren: x 1 = 0 0 0 201 T Residuum berechnen: b Ax 1 = 5232 +6352 1074 46 T nächster Koeffizient, Residuum weiter verkleinern 13

Das Residuum Definition: r = b A x Das Residuum ist ein Maß für den absoluten Fehler, denn A( x e) =b A x Ae = b Ae = b A x {z } r Je nach Gestalt von A wird der Fehler mehr oder weniger gut durch das Residuum beschrieben In jedem Fall gilt aber r =0, e =0 14

Von 1823 nach 2017 Tabelle mit Residuen In jedem Schritt wir das Residuum kleiner Gauss wählt stets den Koeffizienten mit dem größten Residuum 15

Von 1823 nach 2017 Am Ende werden alle Korrekturen aufsummiert Nach 7 Schritten ist das Verfahren konvergiert 16

Der Gauss-Seidel-Algorithmus Gauss-Seidel in Python: x = np.zeros((n,1)) while np.linalg.norm(b - A @ x) > eps: for k in range(n): left = sum(a[k,0:k] * x[0:k,0]) right = sum(a[k,k+1:] * x[k+1:,0]) x[k] = (b[k] - left - right) / a[k,k] return x Im Wesentlichen wird pro Zeile a[k,k] so gesetzt, dass in dieser Zeile das Residuum gleich 0 ist Anders als bei Gauss werden die Zeilen einfach zyklisch durchlaufen 17

Problem des Gauss-Seidel Verfahrens Problem: inhärent sequentiell x = np.zeros((n,1)) while np.linalg.norm(b - A @ x) > eps: for k in range(n): left = sum(a[k,0:k] * x[0:k,0]) right = sum(a[k,k+1:] * x[k+1:,0]) x[k] = (b[k] - left - right) / a[k,k] return x Immer wenn a[k,k-j] 0 hängt x[k] von x[k-j] ab! Im allgemeinen nicht parallel ausführbar 18

Jacobi-Verfahren Besser parallelisierbar: Jacobi-Verfahren x = np.zeros((n,1)) while np.linalg.norm(b - A @ x) > eps: x_new = np.zeros((n,1)) for k in range(n): left = sum(a[k,0:k] * x[0:k,0]) right = sum(a[k,k+1:] * x[k+1:,0]) x_new[k] = (b[k] - left - right)/a[k,k] return x_new Nachteil: Neue, bessere Werte x[k-j] werden ignoriert 19

Relaxation Konvergenzbeschleunigung durch Relaxation: Ersetze x i+1 durch! x i+1 +(1!) x i! > 1 : Überrelaxation 0 <! < 1 : Unterrelaxation x i+1 x i+1 tmp x i+1 x i+1 tmp x i SOR = Successive Over Relaxation 1 <! < 2 Gauss-Seidel! =1 20

SOR-Verfahren Schnellere Konvergenz durch Überrelaxation x = np.zeros((n,1)) while np.linalg.norm(b - A @ x) > eps: for k in range(n): left = sum(a[k,0:k] * x[0:k,0]) right = sum(a[k,k+1:] * x[k+1:,0]) x_tmp = (b[k] - left - right)/a[k,k] x[k] = (1 - w) * x[k] + x_tmp * w return x 21

Übersicht Was ist der zugrundeliegende Algorithmus? Wann ist der Algorithmus anwendbar? Wie schnell ist der Algorithmus? Können wir weitere Verbesserungen vornehmen? 22

Mathematische Analyse Wir splitten die Matrix A = L + D + R strikte untere Dreiecksmatrix L Diagonale D strikte obere Dreiecksmatrix R D = 2 3 a 11 0 0 0 a 22 0 6 4..... 7. 5, L = 0 0 a nn 2 3 0 0 0 a 21 0 0 6 4..... 7. 5, R = a n1 a n2 0 2 3 0 a 12 a 1n 0 0 a 2n 6 4..... 7. 5 0 0 0 und schreiben Gauss-Seidel: Jacobi: (L + D) x i+1 + Rx i = b Dx i+1 +(L + R) x i = b 23

Gauss-Seidel-Iterationsschritt Gauss-Seidel (L + D) x i+1 + Rx i = b x i+1 =(L + D) 1 (b Rx i ) for k in range(n): left = sum(a[k,0:k] * x[0:k,0]) right = sum(a[k,k+1:] * x[k+1:,0]) x[k] = (b[k] - left - right) / a[k,k] Wichtig: (L + D) wird nicht wirklich invertiert! Stattdessen: Vorwärtssubstitution 24

Jacobi-Iterationsschritt Jacobi Dx i+1 +(L + R) x i = b x i+1 = D 1 (b (L + R) x i ) for k in range(n): x_new = np.zeros((n,1)) left = sum(a[k,0:k] * x[0:k,0]) right = sum(a[k,k+1:] * x[k+1:,0]) x_new[k] = (b[k] - left - right) / a[k,k] Keine Datenabhängigkeiten, es wird jeweils einfach durch das Diagonalelement geteilt 25

SOR-Iterationsschritt SOR ( 1! D + L)xi+1 +((1 1! )D + R) xi = b x i+1 =(D +!L) 1 (!b (!R +(! 1)D) x i ) for k in range(n): left = sum(a[k,0:k] * x[0:k,0]) right = sum(a[k,k+1:] * x[k+1:,0]) x_tmp = (b[k] - left - right)/a[k,k] x[k] = (1-w)*x[k] + x_tmp*w Fazit: Iterative Verfahren können elegant mathematisch modelliert werden 26

Allgemeine Splitting-Verfahren Allgemein Splitte A =  + E einfach invertierbare Matrix  Restmatrix E Iteration x i+1 =  1 (b Ex i ) Resultat: Fixpunkt-Iteration für für affine Abbildungen: (x) =Vx+ d wobei und V =  1 E d =  1 b 27

Fixpunkt-Iteration für affine Abbildungen: (x) =Vx+ d Dabei ist V eine n n Matrix und d ein n - Vektor Fragen: Wann konvergiert diese Folge? Gegen welchen Wert konvergiert sie? Wie schnell konvergiert sie? 28

Allgemeine Konvergenzanalyse Wann konvergiert die Folge x i+1 = Vx i + d? hinreichende Bedingung: V < 1 für irgendeine Operatornorm. ebenfalls hinreichende Bedingung: < 1 für alle Eigenwerte von V bzw. Spektralradius (V ) < 1 Konvergenz-Geschwindigkeit: linear (Banachscher Fixpunktsatz) x i x 0 = C (V ) i In der Praxis: Konvergenzgeschwindigkeit ist problemabhängig Nur für einfache Beispiele lässt sich der Spektralradius abschätzen 29

Konvergenzanalyse - Theorie Ob Jacobi-, Gauss-Seidel oder SOR-Verfahren konvergieren hängt somit vom Spektralradius der jeweiligen Iterationsmatrizen ab: Im Einzelnen mit A = L + D + R (V J ): V J = D 1 (L + R) (V GS ): V GS = (L + D) 1 R (V SOR ): V SOR = ( 1! D + L) 1 ((! 1)/!D + R) 30

Praktische Konvergenzkriterien Ist A strikt diagonaldominant, d.h. nx a i,i > a i,j 8i 2 1,...,n j=1 j6=i Dann konvergieren Gauss-Seidel, Jacobi und SOR- Verfahren (für 0 <! < 2 ) Ist A positiv definit (alle Eigenwerte positiv), dann konvergiert das SOR-Verfahren für 0 <! < 2 und damit auch das Gauss-Seidel Verfahren Ist sowohl A, als auch D 2A positiv definit, dann konvergiert auch das Jacobi-Verfahren 31

Konvergenzanalyse SOR-Verfahren Ist (!) der Spektralradius der Iterationsmatrix V SOR (!) des SOR-Verfahrens, so ist ein typischer Verlauf des Spektralradius ρ(ω) 1 ρ GS ρ opt 0 1 ω opt 2 ω 32

Diagonaldominanz und Unzerlegbarkeit Eine Matrix heißt schwach-diagonaldominant, wenn nx a i,i a i,j 8i 2 1,...,n Beispiele: 3 4 2 5 j=1 j6=i 3 1 1 1 5 2 1 2 4 Eine Matrix heißt unzerlegbar, wenn der Graph von A (Kanten für alle von Null verschiedenen Einträge) stark zusammenhängend ist, d.h. es gibt zwischen beliebigen Knoten einen durchgehenden Pfad. 2 1 0 0 1 2 1 0 0 1 2 1 0 0 1 2 33

Wichtiges praktisches Konvergenzkriterium Wichtigstes praktisches Resultat: Ist A unzerlegbar und schwach-diagonaldominant, dann konvergieren Gauss-Seidel-, Jacobi- und SOR-Verfahren Schwache Diagonaldominanz ist typisch bei Modellen mit Erhaltungsgrößen (z.b. Energie, Masse, Impuls) Die wirkliche Welt ist unzerlegbar 34

Weitere Hinweise zur Konvergenz Bei SOR und Gauss-Seidel hängt das Ergebnis auch von der Reihenfolge der Unbekannten ab, bei Jacobi nicht Erfahrungsgemäß konvergiert das Gauss-Seidel-Verfahren etwa doppelt so schnell wie das Jacobi-Verfahren Splitting-Verfahren konvergieren nicht in jedem Fall, sondern nur für bestimmte Problemklassen Oft hängt der Spektralradius auch von der Größe des Gleichungssystems ab, d.h. je größer das Problem desto schlechter konvergieren diese Verfahren 35

Übersicht Was ist der zugrundeliegende Algorithmus? Wann ist der Algorithmus anwendbar? Wie schnell ist der Algorithmus? Können wir weitere Verbesserungen vornehmen? 36

Effizienz von iterativen Verfahren Beispiel: Diskretisierung der Poisson-Gleichung Kontinuierlich: u =0 Diskret: 4u i,j u i+1,j u i 1,j u i,j+1 u i,j 1 =0 u i,j+1 u i-1,j u i,j u i+1,j y j u i,j-1 x i 37

Modellproblem: Temperaturverteilung 4Das -1 resultierende -1-1 Gleichungssystem -1-1 -14 4-1 -1-1 -1 -(ui+1,j + ui,j+1 + ui-1,j + ui,j-1 - u4ui,j)= 1,1 0 u 1,n u 2,1 0 0 0-1 -1 4 u 2,n = 0-1 -1-1 4-1 -1-1 -1-14 u n,n 4u i,j u i+1,j u i 1,j u i,j+1 u i,j 1 =0 0 38

Modellproblem: Temperaturverteilung Achtung: Das (N + 1) (N + 1) Gitter U ist nicht Koeffizienten-Matrix! Die Werte im Innern des Gitters sind die Unbekannten! Matrix des Gleichungssystems hat Größe (N 1) 4! Rechte Seite enthält vorgegebene Randwerte und Temperaturquellen an den Gitterpunkten (dies ist eine Verallgemeinerung des Problems). Aufstellen der Matrix in geeignetem Sparse-Matrix-Format Alternativ (besser): Direkte (Matrix-freie) Implementierung eines iterativen Verfahrens 39

Modellproblem Matrixfreie Implementierung des SOR-Verfahrens def SOR(U, F, h, omega): for iy in range(1, m-1): for ix in range(1, n-1): U_tmp = (2*h*h * F[iy, ix] + U[iy-1, ix] + U[iy+1, ix] + U[iy, ix-1] + U[iy, ix+1]) * 0.25 U[iy, ix] = U[iy, ix]*(1-omega) + omega*u_tmp return U 40

Experimente zur Konvergenzgeschwindigkeit Gauss-Seidel vs. Jacobi Konvergenz in Abhängigkeit von h Relaxationsparameter U(x, y) = cos(2 x) cos(2 y) 41

Erkenntnisse Das Gauss-Seidel-Verfahren ist in etwa doppelt so schnell wie das Jacobi-Verfahren Beide benötigen etwa O(n) Iterationen Das SOR-Verfahren benötigt bei optimalem Relaxationsparameter nur O( p n) Iterationen Der optimale Relaxationsparameter wächst mit der Systemgröße Diese Aussagen gelten nicht generell, aber für viele ähnliche Probleme 42

Iterationen abschätzen In der Praxis ist es typisch, dass der Spektralradius von Iterationsmatrizen nahe 1 ist. Die Tendenz ist GS/J 1 n SOR 1 p n Fazit: Vorsicht bei sehr großen Gleichungssystemen! 43

Übersicht Was ist der zugrundeliegende Algorithmus? Wann ist der Algorithmus anwendbar? Wie schnell ist der Algorithmus? Können wir weitere Verbesserungen vornehmen? 44

Verbesserungen Unmittelbar anwendbare Techniken Durchlaufreihenfolge geschickt wählen Matrixfreie Implementierung Dynamische Anpassung des Relaxationsparameters Fortgeschrittene Techniken Mehrere Iterationen speichern und sinnvoll ausnutzen, führt zu Krylov-Unterraum-Verfahren, z.b. CG, GMRES Hierarchische Gleichungssysteme konstruieren um unterschiedliche Frequenzen jeweils Optimal zu behandeln -> Mehrgitterverfahren Kombinationen aus verschiedenen Verfahren, z.b. Systeme vorkonditionieren 45

Zusammenfassung Umformung von Ax = b über A = Â + E zu einem iterativen Verfahren x i+1 = Â 1 (b Ex i ) Allgemeine Form: (x) =Vx+ d Entscheidend für die lineare Konvergenz ist (V ) < 1 Faustregeln Gauss-Seidel konvergiert doppelt so schnell wie Jacobi Gauss-Seidel und Jacobi benötigen O(n) Iterationsschritte, SOR nur O( p n) (im Idealfall) Nur Jacobi ist einfach parallelisierbar 46

LGS : direkte Verfahren vs. iterative Verfahren In der Theorie: exakte Lösung vs. Näherungslösung Rundungsfehler vs. Iterationsfehler DV: Rundungsfehler pflanzen sich fort u.u. mit Verstärkung IV: Iterations- und Rundungsfehler werden abgeschwächt IV : schnell eine (grobe) Näherung, kann ggf. abbrechen. DV : erst am Ende kennt man die Lösung Oftmals genügt eine Näherungslösung Aufwand: voll besetzt : O(n 3 ) vs. O(n 3 ) bzw. O(n 2.5 ) dünn besetzt: O(n 2 ) vs. O(n 2 ) bzw. O(n 1.5 ) je größer die Matrix und je dünner sie besetzt ist, desto interessanter werden iterative Verfahren 47

48

Besser Python programmieren Die meisten Teilnehmer haben die Übungen sehr gut gemeistert Wir freuen uns auf Feedback -> Evaluation Dennoch gibt es einige kleine Tricks, wie man sich das Leben einfacher machen kann PS: Manche dieser Dinge sind sogar Prüfungsrelevant 49

Arrays und Listen Listen eindimensional (können aber verschachtelt werden) primitiver Python Datentyp, besondere Syntax keine Mathematische Bedeutung NumPy Arrays "Nur" eine Bibliothek Beliebig viele Dimensionen Automatisches Broadcasting mathematischer Operatoren Können als Matrix verwendet werden Effiziente Implementierung Müssen explizit angelegt werden 50

Arrays und Listen Bitte weniger solchen Code: res = [] for i in range(n): res.append(de_casteljau(p, P0)) P0 += d return np.array(res) Besser: res = np.zeros(n) for i in range(n): res[i] = de_casteljau(p, P0 + i * d) 51

Matrixmultiplikation Der @ Operator erlaubt es, Matrizen zu multiplizieren b - A @ x A == P @ L @ R Genauer: Der @ Operator multipliziert zweidimensionale NumPy Arrays, als wären sie Matrizen 52

Indexnotation In Python können nicht nur einzelne Elemente eines Arrays, sondern auch ganze Zeilen, Spalten oder generelle Slices ausgewählt werden Diese Notation spart typischerweise mindestens eine for- Schleife und macht den Code damit lesbarer for k in range(n): left = sum(a[k,0:k] * x[k, 0:k]) right = sum(a[k,k+1:] * x[k,k+1:]) x[k] = (b[k] - left - right) / a[k,k] 53

Indexnotation (2) Mehrere eindimensionale Indices: A[5][6][7] Mehrdimensionale Indizierung: A[5,6,7] Vorteile letzterer Syntax: Performance Lesbarkeit geringere Fehleranfälligkeit Wichtige Features von Indizes: Start, (exklusives) Ende, Schrittweite Negative Indices greifen auf das Ende zu 54

Beispiel zur Indexnotation moire.py: Wählen Sie von einem gegebenen Bild nur die N-te Zeile und Spalte aus return image[::n, ::N] Außerdem: Man kann eine Jacobi-Iteration auf einem Rechteck in nur einer einzigen Zeile schreiben 55

Tupel, Listen, Arrays & Funktionsaufrufe Runde Klammern Funktionsaufruf: foo(x,y) Konstruieren Tupel: (5, 6, y) Klammern von Ausdrücken (5 + 6) (5) ist kein Tupel, (5,) schon Eckige Klammern Array, Tupel oder Listenindex: foo[x] Konstruieren Listen: [1, 2, 3, 4] Nicht verwirren lassen, z.b. bei ((2,3,4))[2] 56

Referenzsemantik In Python wird nie implizit kopiert Insbesondere NumPy Slices zeigen immer auf die ursprünglichen Daten Im Zweifel eine Kopie anlegen >>> A = np.array([2,3,4]) >>> B = A[:] >>> C = B[1:2] >>> C[0] = 5 >>> print(a) array([2,5,4]) 57

Krone für den langsamsten Code 2017 Berechnung von Primzahlen über Wilson's Theorem def is_prime(n): if n == 0 or n == 1: return False return (factorial(n-1)+1) % n == 0 Leider: Der Aufruf is_prime(9002682) terminiert nicht, oder ist SEHR ineffizient 58

Betrugsversuche Öffentliche Tests Unsere Tests Wir prüfen auf init, code u.ä. Wir haben zusätzliche Testfälle Wir prüfen verdächtige Funktionsaufrufe Unser Testsystem ist sehr gut gesichert Bleibt anständig! Wir erstellen die Übungen, um euch auf das Leben vorzubereiten, nicht um euch zu quälen. Wenn ihr mit einer Aufgabe unzufrieden seid, nutzt die Evaluation! 59