Universität zu Köln SS 009 Mathematisches Institut Prof. Dr. C. Tischendorf Dr. M. Selva, mselva@math.uni-oeln.de Numeri I Musterlösung 1. Übungsblatt, Python Aufgaben und Lösungen 1. (4 Punte Die Stichprobenvarianz s n der n Zahlen x 1, x,..., x n ist, wie folgt, definiert s n := 1 (x i x, mit x = 1 x i. (1 n (a (1 Punt Zeigen Sie, dass (1 auch durch die Formel ( s n = 1 x i 1 x i ( n berechnet werden ann. (b (1 Punt Seien M := 1 x i, Q := (x i M Dann gilt, s n = Q n. Zeigen Sie, dass man M n und Q n reursiv, wie folgt, bestimmen ann M 1 = x 1, M = M 1 + x M 1, =, 3,..., n (3a Q 1 = 0, Q = Q 1 + ( 1 (x M 1, =, 3,..., n (3b (c Schreiben Sie die folgenden Python-Funtionen: i. Funtion varianz_berechnen: Eingangsparameter: Vetor x. Diese Funtion soll die Varianz der Zahlen in x mit Hilfe der drei oben erwähnten Formeln bestimmen. 1
ii. Funtion varianz_test: Eingangsparameter: natürliche Zahl N. Diese Funtion soll für i = 1,,..., N den Vetor x mit den drei Komponenten x 1 = 10 i, x = 10 i + 1, x 3 = 10 i + erzeugen und die Varianz dieses Vetors berechnen. (d ( Punte Rufen Sie varianz_test mit N = 1 auf. Was beobachten Sie? Liefern die drei Formeln immer die gleichen Ergebnisse? Welche Formel liefert unterschiedliche Ergebnisse? Für welchen Vetor x? Lösung: (a s n = 1 = 1 = 1 (x i x = 1 ( x i x i x + x ( ( x i n x + n x = 1 x i n x ( x i 1 x i n (b M = 1 x i = 1 ( 1 x i + x = 1 (( 1M 1 + x = M 1 + x M 1
Q = = (x i M = x i M ( x i x i M + M x i + M = x i M 1 = x i ( 1M 1 + ( 1M 1 + x M = Q 1 + ( 1M 1 + x M ( = Q 1 + ( 1M 1 + x M 1 + 1 (x M 1 = Q 1 + M 1 + x x M 1 1 (x M 1 ( = Q 1 + (x M 1 1 1 = Q 1 + 1 (x M 1 (c Die Funtionen varianz_berechnen und varianz_test sind in der Datei blatt1_ss09.py. (d Die Stichprobevarianz der drei Zahlen ist immer (für alle i = 1,,..., 1 1.0, wenn man sie mit der 1. oder der 3. Formel berechnet. Wenn man die. Formel benutzt, erhält man die folgenden Werte: für i 6 ist die Sitchprobevarianz 1.0. Für i = 7 und i = 8 ist die Stichprobevarianz 0, für i = 9 ist sie 3768.0 und für i = 10 und 11 ist sie sogar negativ ( 09715.0 und 68435456.0. Bemerungen: (a Obwohl die drei Formeln theoretisch äquivalent sind, erhält man nicht mit denen die gleiche Stichprobevarianz für alle Zahlenmengen. Die Ursache für dieses Problem ist Auslöschung (siehe Lösung der 3. Aufgabe. Mit der. Formel wird die Stichprobevarianz als Differenz von positive Zahlen, die fast gleich sein önnen. Wenn diese Zahlen mit Fehler verhaftet sind (wie hier der Fall ist für große x i -Werte, werden diese Fehler dann bei der Subtration verstärt. (b Die Formel 1 liefert richtige Ergebnisse, aber hat folgenden Nachteil: Nehmen wir an, wir haben die Stichprobevarianz der Zahlen x 1, x,..., x n mit Hilfe der 1. Formel berechnet und möchten nun die Stichprobevarianz der Zahlen x 1, x,..., x n, x n+1 bestimmen. Man müsste dann alle Terme der Summe neu berechnen, man ann nicht den Wert von s n benutzen, um s n+1 effizient zu bestimmen. 3
(c Den Nachteil der 1. Formel önnte man mit der. beheben, sie liefert aber falsche Ergebnisse für einige Zahlenmengen. (d Die 3. Formel hat dann die Vorteile der beiden ersten.. ( Punte Schreiben Sie eine Python-Funtion, die folgende Additionen durchführt summe1 = ( ((( 10 1 + x 1 + x + x3 + + x1000, summe = ( ( ((x 1 + x + x 3 + + x 1000 + 10 1, wobei die Zahlen x 1, x,..., x 1000 zufällige Zahlen zwischen 0 und 10 5 sein sollen. Sind beide Summen gleich? Hinweis: Die zufälligen Zahlen önnen Sie mit Hilfe des Befehls rand generieren. Lösung: Nein, die Summen sind nicht gleich, obwohl sie theoretisch äquivalent sind. Die Differenz zwischen beiden Summen ist 0.005. Die Funtion, die diese zwei Summen durchführt (summen finden Sie in der Datei blatt1_ss09.py. 3. ( Punte Sei f(x = 1 cos(x x, x 0 (a (1 Punt Zeigen Sie, dass 0 f(x 1, x 0. (b (1 Punt Benutzen Sie Python, um den Wert dieser Funtion in den Punten x = 0.188 10 7, 0.189 10 7, 0.19 10 7 zu bestimmen. Welche Werte erhalten Sie? Können sie richtig sein? Lösung: (a Es ist lar, dass f(x 0, da 1 cos(x 0 und x 0. f(x 1 1 cos(x x 1 x + cos(x 0 für alle x R Sei g(x = x + cos(x, dann gilt g(0 = 0, g (x = x sin(x, g (0 = 0, g (x = cos(x = (1 cos(x 0 g (x ist monoton wachsend g (x 0, x 0 und g (x 0, x 0 g(x g(0, x 0 und g(x g(0, x 0, d.h. g(x 0, x R. 4
(b Diese Funtion wird in der Funtion evalf in blatt1_ss09.py ausgewertet. Man erhält f(0.188 10 7 = 0.68384705, f(0.189 10 7 = 0.6160803148 und f(0.19 10 7 = 0.61508008103. Da 0 f(x 0.5, sind diese Werte offenbar falsch. Auslöschung ist in diesem Fall die Ursache für die falschen Ergebnisse in der Auswertung dieser Funtion. Auslöschung tritt ein, wenn man zwei fast gleiche Zahlen gleicher Vorzeichnen auf dem Rechner subtrahiert. Auslöschung ist aber nur schädlich, wenn diese zwei Zahlen schon mit Fehler verhaftet sind, denn dann werden diese Fehler verstärt. In diesem Fall sind 1 und cos(x fast gleich für leine x-werte. Der Fehler, der bei der Auswertung von cos(x auftritt, wird dann bei der Subtration verstärt. 4. (4 Punte Die Nullstellen einer Funtion f : R R ann man mit Hilfe einer Fixpuntiteration approximieren. Dafür schreibt man die Gleichung f(x = 0 in der Form x = ϕ(x und rechnet x +1 = ϕ(x, = 0, 1,,... für einen gegebenen Startwert x 0. Wir betrachten nun die Gleichung f(x := x tan x, x [0.5, 1.4] (4 (a (1 Punt Plotten Sie die Funtionen g(x = x und h(x = tan x für x [ 1, 1.4]. Machen Sie eine Sizze des Bildes, das Sie erhalten. Aus dem Bild erennt man, dass die Funtion f(x eine Nullstelle x mit 1.1 < x < 1. besitzt. (b (3 Punte Gleichung (4 ann man, wie folgt, umschreiben x = 1 tan x =: ϕ 1(x, x = arctan(x =: ϕ (x Schreiben Sie eine Python-Funtion, die überprüft, welche von den Folgen x +1 = ϕ 1 (x oder x +1 = ϕ (x mit x 0 = 1. die folgende Eigenschaft erfüllt Lösung: Es existiert n [1, 30] so, dass x n x n 1 x n 10 9. (a Siehe Bild 1. (b Die zwei Folgen x = ϕ 1 (x 1 und x = ϕ (x 1 werden in den Funtionen phi1 und phi in der Datei blatt1_ss09.py erzeugt. Die Funtion numonvergenz überprüft, ob die Folgen die obere Eigenschaft erfüllen. Nur die. Folge erfüllt sie. 5
Abbildung 1: Funtionen g(x = x und h(x = tan x 5. (3 Punte Wir betrachten die Gleichungssysteme Hx = b, wobei H die n n-matrix mit den Einträgen H ij = 1 i + j 1 i, j = 1,,..., n ist und b so ist, dass b i = 1, i = 1,,..., n. Die Matrizen H mit diesen Einträgen werden Hilbert-Matrizen gennant. Die Inverse der Hilbert Matrizen ist so, dass ( ( ( n + i 1 n + j 1 i + j H 1 ij = ( 1 i+j (i + j 1 n j n i i 1 Füllen Sie die Tabelle 1 auf der nächsten Seite aus. Was betrachten Sie? Erhalten Sie mit dem Befehl solve immer (für alle n-werte in der Tabelle eine gute Approximation zur exaten Lösung des Gleichungssystems? Lösung: Siehe die Werte in der Tabelle 1. Hinweise: (a Die Datei pyblatt1.py enthält die Funtionen hilb( und invhilb(. Um die 5 5 Hilbert Matriz zu onstruieren, rufen Sie hilb auf (H = hilb(5. Um die Inverse dieser Matrix exat zu berechnen, rufen Sie invhilb auf (IH = invhilb(5. (b Sie sollen für n = 5, 10, 15, 0, 5, 30 die Gleichungssysteme Hx = b exat und numerisch lösen. Wenn x die exate Lösung des Gleichungssystems Hx = b bezeichnet (x = H 1 b und y eine Approximation zu x, önnen Sie x und y z.b. für n = 5, wie folgt, bestimmen # Hilbert-Matrix und ihre Inverse erzeugen H = hilb(5 6
IH = invhilb(5 # rechte Seite onstruieren b = ones((5,1 # exate Loesung berechnen, x = H^{-1}*b x = dot(ih,b # Approximation zu x berechnen mit Hilfe des Befehls solve y = solve(h,b (c Der absolute Fehler in der Lösung (abserror und der relative Fehler in der Lösung (relerror sind dann abserror = x y, relerror = x y x. (d Sehen Sie das Beispiel hilbertaufgabe in pyblatt1.py. n Rel. Fehler Abs. Fehler in der Lösung in der Lösung 5 4.9144653734e-13 6.1633076791e-10 10 0.00014450943383 1400.5661643 15 1.00301991414 8348714745.0 0 0.99999848541 6.00157866315e+14 5 1.00000000007 6.0034467719e+19 30 1.0 1.556439513e+7 Tabelle 1: Lösung von Gleichungssystemen mit Hilbert-Matrizen Bemerungen: (a Sowohl der absolute als auch der relative Fehler in der Lösung werden größer, je größer die Dimension der entsprechenden Hilbert-Matrix ist. 7