Wie genau kann der Differenzenquotient für Δx → 0 berechnet werden? 0,10 0,08 DQ (x0,Δx) Beispiel: f(x)=x3 x0=0.1 f’(x0)=0.03 DQ 0,06 0,04 0,02 0,00 0,00 DQ( x0 , Δx ) = 0,05 f ( x0 + Δx ) − f ( x0 ) Δx 0,10 0,15 Δx Scheint auf den ersten Blick ganz gut zu funktionieren … Wie genau kann der Differenzenquotient für Δx → 0 berechnet werden? … aber genauer betrachtet sieht es nicht mehr so gut aus: -6 |f'(x)-DQ(x0,Δx)| 10 -8 10 -10 10 -12 10 f ′( x0 ) − DQ( x0 , Δx ) -14 10 -17 10 -15 10 -13 10 -11 10 Δx Woran liegt das? -9 10 -7 10 Darstellung von Zahlen im Computer Positive ganze Zahlen Beispiel: 8 Bit Genauigkeit (unsigned char) 00000000 =0 01010001 = 26 + 24 +20 = 81 11111111 = 255 Allgemein: b7 b6 b5 b4 b3 b2 b1 b0 = b7.27+b6.26+b5.25+b4.24+b3.23+b2.22+b1.21+b0.20 mit biє{0,1} Datentypen im Visual Studio unsigned char unsigned short int unsigned short unsigned int unsigned long int unsigned long 8 Bit 16 Bit 32 Bit 32 Bit Darstellung von Zahlen im Computer Ganze Zahlen Beispiel: 2-Komplement Darstellung mit 8 Bit Genauigkeit – Das erste Bit ist das Vorzeichenbit (0: positiv, 1: negativ) – Bei positiven Zahlen ergeben die nächsten 7 Bits den Zahlenwert – Bei negativer Zahl x: Binärdarstellung von |x| → invertieren der Bits → anschließend Addition von 1 00000000 =0 00000001 =1 11111111 = -1 00000010 =2 11111110 = -2 01111111 = 127 10000001 = -127 10000000 = -128 short int / short int long int / long Darstellung von Zahlen im Computer Gleitkommazahlen x = (− 1) × M × B e − E s s Exponent s: M: B: e: E: Vorzeichenbit Mantisse Basis (Bei Computern 2) Exponent Exponent Bias Mantisse Normierung Der Exponent wird so gewählt, dass 1<= Mantisse < B. Für die Basis 2 ist dann das erste Bit der Mantisse ist dann immer = 1 und muss nicht gespeichert werden („Hidden Bit“). → Spezielle Darstellung des Wertes Null erforderlich. Darstellung von Zahlen im Computer Gleitkommazahlen Beispiel: Datentyp float (32 Bit), Exponent Bias E = 127 = 01111111 4,5 = (− 1) ×100,1× 20 0 = (− 1) ×1,001× 210 0 = (− 1) × 1,001× 2 0 10000001 − 01111111 1 Erstes Bit der Mantisse ist bei Normierung des Exponenten redundant (=1) und wird i.A. nicht gespeichert 01000000100100000000000000000000 Die Genauigkeit (Anzahl der Nachkommastellen) wird durch die Anzahl der Bits der Mantisse bestimmt Darstellung von Zahlen im Computer Gleitkommazahlen Gleitkommazahlen nach IEEE 754 Datentyp Mantisse Exponent Kleinste positive Zahl Größte positive Zahl Genauigkeit Dezimalstellen float 23 Bit 8 Bit 1,18.10-38 3,4.1038 6 double 52 Bit 11 Bit 2,23.10-308 1,79.10308 15 Andere Formate (z.B. long double) sind Compiler-spezifisch Wichtige Maschinenkonstanten definiert in <float.h> Datentyp double DBL_MAX_10_EXP DBL_MIN_10_EXP DBL_MIN DBL_MAX DBL_EPSILON DBL_DIG Größter zulässiger Exponent Kleinster zulässiger Exponent Kleinste positive Zahl Größter Wert für den Typ double Maschinengenauigkeit Anzahl an Dezimalstellen 308 -307 2,22e-16 15 Ganze Zahlen (definiert in <limits.h>) INT_MAX INT_MIN Größte int Zahl Kleinste int Zahl 2147483647 -2147483647-1 Maschinengenauigkeit εm Beim Rechnen (z.B. Addition) treten Rundungsfehler auf, weil nur eine begrenzte Anzahl von Ziffern gespeichert wird: Beispiel: Addition mit 4 Dezimalstellen Genauigkeit 1.234 .100 + 2.332 .10-2 = 1.257 (32) .100 1.234 .100 + 2.332 .10-5 = 1.234 (02332) .100 Maschinengenauigkeit εm: Kleinste positive Gleitkommazahl, deren Summe mit 1.0 ein von 1.0 unterscheidbares Ergebnis liefert. εm != DBL_MIN Rundungsfehler Die endliche Maschinengenauigkeit εm verursacht Rundungsfehler. Insbesondere in langen Rechnungen setzten sich Rundungsfehler fort. Werden N Rechenschritte hintereinander durchgeführt, so liegt der Rundungsfehler in der Größenordnung εm.N. Unter Umständen kann sich der Fehler jedoch auch exponentiell fortsetzen Beispiel: Für die Berechnung der Potenzen des „goldenen Schnitts“ Φ=(sqrt(5)-1)/2 gilt die Rekursionsformel: Φn+1 = Φn-1 – Φn Bei der Berechnung der Potenzen von Φ mit dieser Rekursionsformel pflanzen sich die Rundungsfehler jedoch exponentiell fort, so dass bereits für n=16 völlig falsche Ergebnisse beobachtet werden Differenzenquotient Berechnung der Ableitung mit Taylor-Reihe f ( x + Δx ) = f ( x ) + f ′( x ) ⋅ Δx + 12 f ′′( x ) ⋅ Δx 2 + K ⇒ f ′( x ) = f ( x + Δx ) − f ( x ) 1 − 2 f ′′( x ) ⋅ Δx + K Δx f ′( x ) ≈ In erster Ordnung gilt also: Rundungsfehler er: er ≈ ε f Abbruchfehler et: Optimaler Wert: f (x ) Δx f ( x + Δx ) − f ( x ) Δx εf: Relative Genauigkeit, mit der f berechnet werden kann Im Beispiel εf ~ εm et ≈ Δx ⋅ f ′′( x ) ⎛ er + et ⎞ ′′ f (x ) ⎟ ≈ ε f ⋅ f ⋅ f2 ≈ ε f Δx ≈ ε f ⋅ ⇒ ⎜⎜ f ′′( x ) ⎝ f ′( x ) ⎟⎠ f′ Differenzenquotient Bessere Approximation für die erste Ableitung: f ( x + Δx ) − f (x − Δx ) 2Δx f ′( x ) ≈ Rundungsfehler er: er ≈ ε f Abbruchfehler et: f (x ) Δx wie oben et ≈ Δx 2 ⋅ f ′′′( x ) ⎛ er + et ⎞ ⎛ f (x ) ⎞ ⎟ ≈ ε 2f / 3 ⋅ f 2 / 3 ⋅ ( f ′′′)1/ 3 ≈ ε 1f / 3 Optimaler Wert: Δx ≈ ⎜⎜ ε f ⋅ ⎟⎟ ⇒ ⎜ ⎜ f ′( x ) ⎟ f ′′′( x ) ⎠ ⎝ ⎝ ⎠ 13 Ergänzung: Zweite Ableitung f ′( x + Δx ) − f ′( x − Δx ) 2 Δx f ( x + 2Δx ) − f ′( x ) f ( x ) − f ( x − 2Δx ) − 2 Δ x 2 Δx ≈ 2 Δx f ( x + 2Δx ) − 2 f ( x ) + f ( x − 2Δx ) = (2Δx )2 f ′′(x ) ≈ Formatierte Ein- und Ausgabe in C++ float x; cin >> x; // Eingabe der Fließkommazahl x // Ausgabe von x im Fließkommaformat cout << "Die eingegebene Zahl lautet : " << x << endl; cout.width(20); cout.precision(4); // Ausgabefeld ist 20 Zeichen breit // es werden 4 Nachkommastellen ausgegeben cout << x; cout << endl; // Standardformat für die Ausgabe wiederherstellen cout.width(0); cout.precision(6); InOutCPP Formatierte Ein- und Ausgabe in C float x; scanf ("%f",&x); // Eingabe der Fließkommazahl x // Ausgabe von x im Fließkommaformat printf ("Die Eingegebene Zahl lautet : %f\n",x); printf ("%20.4f",x); // Ausgabefeld ist 20 Zeichen breit, // es werden 4 Nachkommastellen ausgegeben printf ("\n"); InOutC Die Ein- und Ausgabe mit den Funktionen printf und scanf wird mit Formatstrings gesteuert Zeichenketten (Strings) Zeichenketten können in C/C++ als Array von Buchstaben gespeichert werden. Beispiel: char text [30]; // Deklaration von text als char-Array strcpy (text, “Das ist mein Computer”); // Wertzuweisung cout << text; // Das ist mein Computer text [8] = ‘d’; // Neunter Buchstabe wird verändert cout << text; // Das ist dein Computer text [7] = ‚0‘; // Ende der Zeichenkette cout << text; // Das ist cin >> text; // Eingabe von Text über die Tastatur cout << text Zeichenkette Wert D a s i s t m e i n C o m p u t e r \0 Index 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 D a s i s t d e i n C o m p u t e r \0 D a s i s t \0 m e i n C o m p u t e r \0 Formatierte Ein- und Ausgabe in C++ char c [20]; cout << "Bitte eine Zeichenkette eintippen" << endl; cin >> c; cout << "Es wurde " << c << " eingegeben"; Formatierte Ein- und Ausgabe in C char c [20]; printf ("Bitte eine Zeichenkette eintippen \n"); scanf ("%s",c); printf ("Es wurde %s eingegeben", c); InOutC Wichtige Formatstrings %f %d Fließkommazahl, Ganze Zahl, %s %c Zeichenkette Einzelnes Zeichen %x %o Ganze Zahl im hexadezimal-System Ganze Zahl im oktal-System Funktionen des Debuggers Mit dem Debugger kann das Programm schrittweise ausgeführt und Fehler im Programm gefunden werden Schrittweise Ausführung des Programms: → Debuggen → Einzelschritt (F11): Die nächste Anweisung wird ausgeführt → Debuggen → Prozedurschritt (F10): Wie oben, jedoch wird bei einem Funktionsaufruf die gesamte Funktion in einem Schritt ausgeführt → Debuggen → Ausführen bis Rücksprung (Umsch + F11): Die aktuelle Funktion wird bis zum Ende ausgeführt Funktionen des Debuggers Setzen von Breakpoints (Klick vor die jeweilige Zeile): Die Programmausführung wird am Breakpoint unterbrochen, weiter mit → Debuggen → Weiter (F5) Beenden: → Debuggen → Debuggen beenden: Programm und Debugger werden beendet Anzeigen und ändern der Werte von Variablen: Stehen lassen des Cursors über der Variablen im Quelltext: Zeigt des Wert der Variablen an Fenster am unteren Bildschirmrand: Auto, Lokal und Überwachen: Anzeigen und Ändern des Wertes einer Variablen → Debuggen → Schnellüberwachung Berechnung einer Ableitung mit Ridders Regel • Berechnung des Differenzenquotienten DQ(x0,Δxi) für eine Folge Δxi mit Δxi→0 • Extrapolation der Rechnung für Δx = 0 0,10 0,08 DQ(x0,Δx) Beispiel: f(x)=x3 x0=0.1 f´(x0)=0.03 Δxi=2-i i є {0..9} DQ(0.1,Δx→0)=0.03 f´-DQ = -1.38778e17 0,06 0,04 0,02 DQ(x0,Δx) Polynom 9. Grades 0,00 0,00 0,05 0,10 Δx 0,15 Extrapolation Gegeben: N Punkte Pi(xi|yi) Gesucht: Polynom N-1 ten Grades F(x), dass durch die N Punkte verläuft 5 Berechnung eines Polynoms F(x) 4. Grades durch 5 Punkte mit der Lagrange-Formel 4 F(x) 3 2 P0(0,5|1) P1(1|1,1) p2(2|2.2) P3(3|3.5) P4(4|3) 1 0 0 1 2 3 x 4 Extrapolation Lagrange-Formel zur Berechnung eines Polynoms N-1 ten Grades durch eine Menge von N Punkten: (x − x1 ) ⋅ (x − x2 )L (x − xN −1 ) ⋅ y (x0 − x1 ) ⋅ (x0 − x2 )L (x0 − xN −1 ) 0 (x − x0 ) ⋅ (x − x2 )L (x − xN −1 ) ⋅ y + (x1 − x0 ) ⋅ (x1 − x2 )L (x1 − xN −1 ) 1 F (x ) = +L + (x − x0 ) ⋅ (x − x1 )L (x − xN −2 ) ⋅ y (xN −1 − x0 ) ⋅ (xN −1 − x1 )L (xN −1 − xN −2 ) N −1