Wie genau kann der Differenzenquotient für Δx → 0 berechnet

Werbung
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
Herunterladen