• Keine Ergebnisse gefunden

Programmiervorkurs für die Numerik Teil 4/4 (Juhu!)

N/A
N/A
Protected

Academic year: 2022

Aktie "Programmiervorkurs für die Numerik Teil 4/4 (Juhu!)"

Copied!
34
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

0.5 0.0

0.5 0.5

0.0 0.5 1.00 5 10

15

Programmiervorkurs für die Numerik

20

Teil 4/4 (Juhu!)

Christian Power

Mathematisches Institut Universität Tübingen

06.10.2016

(2)

In diesem Kurs haben wir gelernt

I mit Kontrollstrukturen zu programmieren (ifund for),

I Funktionen zu benutzen um unsere Programme zu organisieren,

I mit Matrizen und Vektoren um zu gehen,

I errechnete Daten mit Plots zu visualisieren.

(3)

Gliederung

Lösungsvorschläge

Performance messen

Fehler im Code

Debuggen und Testen

Allgemeines zum Übungsbetrieb

3 / 34

(4)

Aufgabe 1:

1 f u n c t i o n [ V , O ] = k u g e l ( r )

2 % B e r e c h n e V o l u m e n V und O b e r f l a e c h e r 3 % f u e r R a d i u s r

4 a s s e r t ( r >0) 5 V = 4 / 3 *pi* r ^3;

6 O = 4*pi* r ^2;

7 a s s e r t ( V >0 & O >0) 8 end

(5)

Lösungen für die Aufgaben des 3. Übungsblattes

Aufgabe 2 (Hilfsfunktion):

1 f u n c t i o n [ y ] = g e o _ R ( z , n )

2 % G e o m e t r i s c h e R e i h e bis n mit z 3 y = 0;

4 for i = 0: n

5 y = y + z ^ i ;

6 end 7 end

Lösungsvorschläge 5 / 34

(6)

Aufgabe 2 (Skript):

1 % B l a t t 3 Auf . 2 2 c l e a r all

3 z = . 2 5 ;

4 for n = [5 10 50 1 0 0 ] 5 g e o _ R ( z , n )

6 end

(7)

Lösungen für die Aufgaben des 3. Übungsblattes

Aufgabe 3:

1 f u n c t i o n [ C ] = m a t m u l t ( A , B ) 2 % M a t r i z e n M u l t i p l i k a t i o n 3 n = s i z e( A , 1 ) ;

4 m = s i z e( A , 2 ) ; 5 k = s i z e( B , 2 ) ;

6 a s s e r t ( m == s i z e( B , 1 ) ) 7

8 C = z e r o s( n , k );

9 for i =1: n

Lösungsvorschläge 7 / 34

(8)

Aufgabe 3 (Fortsetzung):

1 C = z e r o s( n , k );

2 for i =1: n

3 for j =1: k

4 S = 0;

5 for l =1: m

6 S = S + A ( i , l )* B ( l , j );

7 end

8 C ( i , j ) = S ;

9 end

10 end 11 end

(9)

Lösungen für die Aufgaben des 3. Übungsblattes

Aufgabe 4 (Hilfsfunktion):

1 f u n c t i o n [ y ] = p l o t T h i s ( x ) 2 x l e n = l e n g t h( x );

3 y = z e r o s( x l e n );

4 for i =1: x l e n 5 if x ( i ) < 0

6 y ( i ) = - x ( i )* x ( i );

7 e l s e i f x ( i ) >= 0 & x ( i ) <= 1

8 y ( i ) = x ( i );

9 e l s e % x ( i ) > 1

10 y ( i ) = x ( i ) * x ( i ) + 1;

11 end

12 end 13 end

Lösungsvorschläge 9 / 34

(10)

Aufgabe 4 (Skript):

1 % B l a t t 3 A u f g . 4 2 x = - 2 : . 1 : 2 ;

3 p l o t( x , p l o t T h i s ( x ))

4 t i t l e(’ B l a t t 3 A u f g . 4 ’) 5 x l a b e l(’ -2\ leq x \ leq 2 ’) 6 y l a b e l(’ p l o t T h i s () ’)

7 g r i d on

(11)

Lösungen für die Aufgaben des 3. Übungsblattes

Aufgabe 5 (Hilfsfunktion):

1 f u n c t i o n [ y ] = f s c h a r ( b , x ) 2 % f s c h a r ( x ) = bx ^2

3 % P r e c o n d i t i o n : b ist ein S k a l a r 4 y = b * x .* x ;

5 end

Lösungsvorschläge 11 / 34

(12)

Aufgabe 5 (Skript):

1 % B l a t t 4 A u f g . 5 2 x = - 2 : . 1 : 2 ;

3 b = [.5 1 1.5 2];

4 y = z e r o s(l e n g t h( b ) , l e n g t h( x ));

5 for i = 1:l e n g t h( b )

6 y ( i ,:) = f s c h a r ( b ( i ) , x );

7 end

8 p l o t( x , y )

9 t i t l e(’ B l a t t 4 A u f g . 5 ’) 10 x l a b e l(’ -2\ leq x \ leq 2 ’) 11 y l a b e l(’ bx ^2 ’)

12 l e g e n d(’ b =.5 ’, ’ b =1 ’, ’ b = 1 . 5 ’, ’ b =2 ’)

(13)

Gliederung

Lösungsvorschläge

Performance messen

Fehler im Code

Debuggen und Testen

Allgemeines zum Übungsbetrieb

Performance messen 13 / 34

(14)

I Performance ist das Zeitverhalten eines Programms.

I Performance ist wichtig, wenn der Anwender oder der Programmiertutor es ausdrücklich verlangt.

I In allen anderen Fällen sollte Performance erst am Schluss optimiert werden; wenn überhaupt.

I Donald Knuth, den Erfinder von TEX, stammt das Zitat

„Premature optimization is the root of all evil“. Gemeint ist damit, dass wenn man die Performance optimiert, bevor das Programm überhaupt fertig ist, sich selbst ein Bein stellt.

I Performance wird in MATLAB mit tic,toc und in Julia mit tic(),toc() gemessen.

(15)

Zeit messen

in Julia

1 " " "

2 b 3 a 4 f u n ( x ) : R - > R mit d r e i 3 D e f i n i t i o n s b e r e i c h e .

4 F ü r x < 0 g i l t f ( x )= - x ^2 , 5 f ü r 0 ≤ x ≤ 1 g i l t f ( x ) = x

6 und f ü r 1 < x g i l t f ( x ) = x ^2 + 1 7 " " "

8 f u n c t i o n b 3 a 4 f u n ( x :: R e a l )

Performance messen 15 / 34

(16)

1 f u n c t i o n b 3 a 4 f u n ( x :: R e a l )

2 rv

3 if x < 0

4 rv = - x ^2

5 e l s e i f x <= 1 # x >= 0 g i l t a u t o m .

6 rv = x

7 e l s e # x > 1

8 rv = x ^2 + 1

9 end

10 end # f u n c t i o n

(17)

Zeit messen

in Julia

1 f u n c t i o n b 3 a 4 f u n ( x :: A r r a y { Float64 , 1 } ) 2 rv = z e r o s ( l e n g t h ( x ))

3 i n d _ s e t = x . < 0

4 rv [ i n d _ s e t ] = - x [ i n d _ s e t ] . ^ 2 5 i n d _ s e t = 0 . <= x . <= 1

6 rv [ i n d _ s e t ] = x [ i n d _ s e t ] 7 i n d _ s e t = x . > 1

8 rv [ i n d _ s e t ] = x [ i n d _ s e t ] . ^ 2 + 1

9 r e t u r n rv

10 end # f u n c t i o n

Performance messen 17 / 34

(18)

1 x = [ a for a = - 2 : . 0 0 0 1 : 2 ] # 4 0 0 0 1 e l e m 2 tic ()

3 b 3 a 4 f u n ( x [ : ] ) 4 toc ()

5 tic ()

6 for e l e m in x 7 b 3 a 4 f u n ( e l e m ) 8 end

9 toc ()

(19)

Gliederung

Lösungsvorschläge

Performance messen

Fehler im Code

Debuggen und Testen

Allgemeines zum Übungsbetrieb

Fehler im Code 19 / 34

(20)

I Im Schnitt besteht Programmieren darin, dass man (im Besten Fall) 90% der Zeit nach seinen eigenen Fehlern sucht.

I Programmierfehler werden als Bugsbezeichnet.

I Debuggen ist der Vorgang absichtlichBugs zu finden und zu beheben.

I Alle Bugs können i.A. nicht vollständig eliminiert werden. Der letzte Bug ist unter Programmierern als ironischer Scherz zu verstehen.

I Es gibt aber Techniken mit denen man Bugs finden kann oder, noch besser, vorbeugen kann.

(21)

Arten von Bugs

I Im Allgemeinen unterscheidet man zwischen drei verschiedenen Fehlern:

1. Fehler vom Compiler.

2. Fehler zur Laufzeit.

3. Logische Fehler.

I Mit Compiler-Fehler schlagen sich typischerweise Studenten am Anfang viel herum. Diese Fehler sind aber die dankbarsten, denn der Computer sagt euch, dass etwas falsch ist. Als Beispiel seien Syntax-Fehler genannt wie z.B.A = * A.

I Wenn das Programm vom Computer akzeptiert wird, kann es immer noch zur Laufzeit abbrechen. Als Beispiel sei ein Abbruch durchassert()genannt.

I Logische Fehler sind mit Abstand am schwierigsten aus zu machen. In diesen Fall ist das Programm aus Sicht des

Computers fehlerfrei, aber das Ergebnis ist trotzdem falsch. Als Beispiel sei die naive Lösung der Aufgabe 4 von Blatt 3 genannt.

Fehler im Code 21 / 34

(22)

I Schwammige Vorgabenvon Programmteilen, z.B. eine Funktion erledigt zu viele Aufgaben.

I Unvollständiges Programm während des Programmieren, z.B.

wir haben uns noch nicht Gedanken über negative oder komplexe Zahlen gemacht.

I Unerwartete Argumente für Funktionen, z.B.matmultmit Vektoren.

I Unerwarteter Zustand von Daten, z.B. eine andere Funktion überschreibt aus versehen die Matrix A.

I Logische Fehler.

(23)

Gliederung

Lösungsvorschläge

Performance messen

Fehler im Code

Debuggen und Testen

Allgemeines zum Übungsbetrieb

Debuggen und Testen 23 / 34

(24)

I Debuggen funktioniert ungefähr so:

1. Sorge dazu, dass das Programm vom Compiler akzeptiert wird.

2. Sorge dazu, dass es keine Fehler zur Laufzeit gibt.

3. Sorge dazu, dass das Programm das tut, was es tun soll.

I Dieser Algorithmus wird so lange wiederholt, bis man mit dem Ergebnis zufrieden ist.

(25)

Debuggen

I Vorsicht: So funktioniert Debuggen nicht!

whileDas Programm funktioniert nicht

Schaue zufällig in meinen Code und ändere es, so dass es besser aussieht.

end

I Offensichtlich ist das ein schlechter Algorithmus. Er wird aber von vielen Studenten praktiziert, wenn sie sich verloren fühlen oder ohne Anhaltspunkt nach Fehlern in ihren Programm suchen.

I Die entscheidende Frage beim Debuggen lautet:

Woran könnte ich festmachen, dass mein Programm das Richtige ausrechnet?

Solang man diese Frage nicht beantworten kann, findet man sich im oben genannten schlechten Algorithmus wieder.

Debuggen und Testen 25 / 34

(26)

I Mit kryptische Fehler Meldungen vom Compiler kann man so umgehen: Kommentiere ca. die Hälfte des Codes aus. Wenn der Fehler noch da ist, wiederhole den Prozess. Wenn der Fehler weg ist kommentiere die Hälfte des aus kommentierten Codes wieder ein und wiederhole den Prozess.

I Logische Fehler können in Laufzeit-Fehler verschoben werden indem man assert()benutzt.

I Darüber hinaus können in Julia Typen wie z.B.Number,Real, Bool,ComplexRealoderArrayReal, 2 benutzt werden Anforderungen an Argumente zu formulieren. Die Funktion function myfun(x::Real)akzeptiert z.B. kein Matrizen.

Dafür muss eine zusätzliche Funktion function myfun(x::Array{Real, 2}) bereit gestellt werden.

(27)

Praktische Typs für das Debuggen

I Kommentiere euren Code sinnvoll, z.B. muss jede Funktion ein Kommentar besitzen, was seine Funktion im Programm beschreibt.

I Teile deinen Code (sinnvoll) mit mehr Funktionen auf („Teile und herrsche“). Man kann nur Fehler beheben die man auch sehen kann, was nicht der Fall ist, wenn die Funktionen zu lang sind.

I Benutze Tab-Einrückungen um deinen Code (logisch) zu strukturieren.

Debuggen und Testen 27 / 34

(28)

I Testen ist die systematische Suche nach Fehlern im Code.

I Der Unterschied zu Debuggen liegt darin, dass man beim Testen absichtlich versucht seinen Code zum Absturz zu bringen.

I Es gibt viele verschiedene Arten von Tests wie z.B.

Blackbox-Tests, Whitebox Tests, Regressions-Tests oder Mocking, die hier nicht behandelt werden können.

(29)

Ein einfacher Test

Eine einfache aber bereits sinnvolle Art von Testen funktioniert wie folgt:

I Man legt für das jeweilige Numerik Projekt eine Datei namens progA1_testan.

I Bevor man sich die Details einer Funktion für das Projekt überlegt, denkt man sich zunächst einfach nur den Namen und einen genauen Kommentar, was die Funktion überhaupt machen soll.

I Anschließend schreibt man mehrereassert(), die die obige (noch nicht fertig geschriebene) Funktion erfüllen soll in progA1_test. Es ist gut, wenn man systematisch mitfor und/ oder rand() verschiedene Werte testet (falls möglich).

Debuggen und Testen 29 / 34

(30)

I Nachdem man sich die Tests überlegt hat, schreibt man die Funktion, die man später benutzen möchte.

I progA1_testmuss danach ohne Fehler laufen.

I Wichtig:Niemals einen Test löschen. Das hat den folgenden Grund: Wenn man die Funktion im später ändern möchte, dann muss sie alle bereits bestanden Tests wieder bestehen.

(31)

Gliederung

Lösungsvorschläge

Performance messen

Fehler im Code

Debuggen und Testen

Allgemeines zum Übungsbetrieb

Allgemeines zum Übungsbetrieb 31 / 34

(32)

In Numerik praktizieren wir das Kreuz-System.

I Am Anfang der Übungsgruppe wird gekreuzt, welche Aufgaben bearbeitet wurden.

I Der Tutor entscheidet nach eigenem Ermessen, wer die Aufgabe vorrechnen soll.

I Wenn es beim Vorrechnen schwere Verständigungsprobleme zwischen Tutor und Student gibt, wird das ganze Blatt aberkannt.

I Wiederholt sich das mehrmals, werden alle Kreuze aberkannt.

I 50% der Kreuze sind notwendig um zur Klausur zugelassen werden.

(33)

Programmieraufgaben

I Es gibt jedes zweite Blatt mindestens ein Programmieraufgabe.

I Es dürfen Aufgaben zu Dritt abgegeben werden. Das muss aber auf jeder Datei oben klar kenntlich gemacht werden.

I Die Abgabe muss als zip-Datei nach dem Muster ProgA1_name1_name2_name3.zip

abgegeben werden. Es ist nicht notwendig alle Dateien in ein extra Ordner zu packen.

I Es wird ausdrücklich gefordert, dass alle Plots in der zip-Datei dabei sein müssen.

Allgemeines zum Übungsbetrieb 33 / 34

(34)

Referenzen

ÄHNLICHE DOKUMENTE

Falls die zu plottende Funktion nicht schon als Punktmenge vorliegt, muss sie in eine überführt werden.. Dazu legt man die gewünschten Intervallgrenzen [a, b] fest und wertet

Erwartet die Funktion keine Argumente, bleibt die runde Klammer hinter dem Funktionsnamen leer ... Gibt die Funktion keine Arugment zurück bleibt die eckige Klammer hinter function

Schreiben Sie ein MATLAB–Programm, das zu einem gegebenen Startwert das Newtonverfahren zur Bestimmung eines Eigenwerts und eines zugeh¨ origen Eigenvektors einer

If an additional DSU (30) is added to each AMP, the corresponding 14% (triple vs dual) improve- ment will yield 0.7 additional transactions per second per AMP or 171

Herrscht im Dorf der Schülerinnen und Schüler gerade eine öffentliche Diskussion über einen gegenwärtig vorherrschenden Nutzungskonflikt zwischen Landwirtschaft und

– Krankenhäuser der ersten und zweiten Stufe: Planung durch Landkreis und kreisfreie Städte. ein

Krankenhauses werden durch tagesgleiche Pflegesätze verrechnet.. Bundesweiter Sonderentgelt-Katalog für Krankenhäuser, Sonderentgelte bei Versorgung durch Hauptabteilungen. Son-

Zuschlag für bedarfsnotwendige Krankenhäuser im ländlichen Raum. • Krankenhäuser in dünn