Kettenbrüche und Numerische Ableitung 1. Kettenbruchdarstellung

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