Universität Potsdam, Institut für Physik und Astronomie Ralf Tönjes, Udo Schwarz Sommersemester 2012 Scientific Computing, WS12/13 Blatt 2 : Kettenbrüche und Numerische Ableitung 1. Kettenbruchdarstellung von Zahlen (7+1 Punkte) (a) (2P) Schreiben Sie eine Funktion, welche aus Pn−2 , Qn−2 , Pn−1 , Qn−1 sowie an und bn den Zähler Pn und den Nenner Qn der n-ten Konvergente eines Kettenbruchs b mit den Kettenbruchtermen n berechnet. Das Argument bn soll optional sein an und bei Nichtangabe den Wert bn = 1 haben. (b) (4P) Schreiben Sie eine Funktion, welche aus einer gegebenen Zahl x die Kettenbruchdarstellung durch eine Ganze Zahl a0 , eine endliche Liste a sowie den Zähler Pn und Nenner Qn der rationalen Kettenbruch Approximation berechnet, wobei n die Länge der Liste a ist. Geben Sie auf eine sinnvolle Abbruchbedingung acht. (c) (+1 Zusatzpunkt) Schreiben Sie eine Funktion, welche aus dem Anfangswert a0 , sowie zwei Listen a und b den Zähler Pn und Qn der n-ten Konvergente berechnet, wobei n die Länge der Liste a sei. Ist b nicht gegeben, oder kürzer als a, so sollen die benötigten Elemente den Wert 1 haben. 2. Numerische Ableitung (3+1 Punkte) Es sei f = f (x) eine in einer Umgebung von x0 hinreichend oft differenzierbare Funktion. Die Funktionswerte f (x0 ± nh) seien bezeichnet durch f±n . (a) (4P) Plotten Sie für f (x) = exp(x) den Betrag der Abweichung des Differenzenquotienten (f+1 − f0 )/h bzw. der ”Zentraldifferenz” (f+1 − f−1 )/2h vom theoretischen Wert der ersten Ableitung bei x0 = 2 als Funktion von h im Bereich 2−52 ≤ h ≤ 1. Benutzen Sie doppelt logarithmische Achsen. Wie kann das Ergebnis interpretiert werden? (b) (+1 Zusatzpunkt) Wie muss man die Funktionswerte f±1 und f±2 addieren und durch h teilen, um eine noch bessere Approximation der 1. Ableitung zu erhalten? Plotten Sie den Absolutbetrag des Fehlers dieser numerischen Ableitung erneut doppelt logarithmisch gegen h. 1 Kettenbruch Regeln : cn = n Pn bl b b b = a0 + 1 + 2 + ... + n = a0 + a1 a2 an al Qn l=1 K Pn = an Pn−1 + bn Pn−2 , P−1 = 1, Qn = an Qn−1 + bn Qn−2 P 0 = a0 , Q−1 = 0, x = ⌊x⌋ + r0 = a0 + r0 = a0 + ⌊ an+1 1 = rn ⌋ Q0 = 1 ∞ 1 1 1 + + · · · = a0 + a1 a2 al l=1 = floor(1/rn ), K rn+1 = 1 − an+1 rn Doppelt Logarithmische Plots : import matplotlib.pyplot as plt # Stuetzpunkte mit exponentiell kleiner werdendem Abstand : h = [2**(-n) for n in range(53)] # berechne das Quadrat an den Stuetzpunkten : h_square = [x*x for x in h] # doppelt logarithmischer Plot (h vs. h_square) : plt.loglog(h,h_square,’bx’,basex=2,basey=2) plt.xlabel(’h’) # Achsenbezeichnung plt.ylabel(’h*h’) # Ausgabe des Plots; python wartet hier, bis das Plotfenster geschlossen wird : plt.show() # eine Funktion f(x) = A* x**alpha wird in doppelt logarithmischen Skalen # zu einer Geraden mit Anstieg alpha 2