Zu berechnen sind die Integrale .
- Zeigen Sie
- Zeigen Sie, dass die Integrale
der linearen Rekursion
genügen
- Wir gehen im Folgenden von exakter Gleitpunktarithmetik aus. Der Startwert
lässt sich im Rechner nicht exakt darstellen. Stattdessen wird ein gerundeter Wert
verwendet. Wie pflanzt sich der Fehler
fort? Welchen absoluten Fehler
hat der berechnete Wert
?
- Zu berechnen seien
. Wäre
für ein gewisses
bekannt, könnte man die Rückwärtsrekursion
verwenden. Wie pflanzt sich der Startfehler
fort? Wie groß muss
sein, um die Integrale
bis
in Matlab mit voller Genauigkeit zu berechnen, wenn man als Startwert
wählt?
- Schreiben Sie zwei Matlab-Funktionen zur Berechnung der Vorwärts- und Rückwärtsrekursion. Berechnen Sie die Werte für
bis
mit beiden Funktionen und geben Sie das Ergebnis in Form einer Matrix mit den drei Spalten
, vorwaerts, rueckwaerts aus. Vergleichen Sie anschließend mit den exakten Werten.
Lösung
a )
Da in dem Integral ist, schätzen wir nach unten bzw. oben ab mit
bzw.
.
b )
c )
Allgemein:
Beweis mit vollständiger Induktion:
Einsetzen der Induktionsannahme:
d )
Der Fehler bei der Rückwärtsrekursion ist:
Mit Induktion folgt:
starke Dämpfung des Fehlers
Es sollen die ersten 10 Werte berechnet werden, wobei der Fehler bei noch am größten ist:
Dabei ist der Fehler des Startwertes höchstens halb so groß wie das Intervall, in dem der Startwert liegt. Wir schätzen daher nach oben ab:
Dieser Fehler darf für den Wert nicht zu groß sein:
Dieser Wert soll nun kleiner als sein. Es ergibt sich:
e )
vorwaerts.m
function int = vorwaerts(I0, n) % int: vector I1, ..., I10 % I0: start value I0 % n: index of last integral int = zeros(1, n); % pre-allocating for speed int(1) = 1 - 20 * I0; for i = 2 : n int(i) = (1 / i) - 20 * int(i - 1); end
rueckwaerts.m
function int = rueckwaerts(Ink, n, k) % int: vector I1, ..., Ik % Ink: start value I(n + k) % n : index of last integral % k : number of precalculated integrals intAll = zeros(1, n + k); intAll(n + k) = Ink; for i = n + k - 1 : -1 : 1 intAll(i) = 1 / 20 * (1 / (i + 1) - intAll(i + 1)); end int = zeros(1, n); for i = 1 : n int(i) = intAll(i); end
Aufruf in u14.m
format long % exact values: I = zeros(1, 10); I(1) = 0.024196716611359938; I(2) = 0.016065667772801226; I(3) = 0.012019977877308810; I(4) = 0.0096004424538237932; I(5) = 0.0079911509235241352; I(6) = 0.0068436481961839618; I(7) = 0.0059841789334636197; I(8) = 0.0053164213307276052; I(9) = 0.0047826844965590059; I(10) = 0.0043463100688198801; % calculate forward integrals: n = 10; intFw1 = vorwaerts(log(21) - log(20), n); intFw2 = vorwaerts(log(21/20), n); % calculate backward integrals: k = 10; startValue = 1 / (20.5 * (11 + k)); intBw1 = rueckwaerts(startValue, n, k); k = 0; startValue = 1 / (20.5 * (11 + k)); intBw2 = rueckwaerts(startValue, n, k); % calculating forward errors: devFw1 = I - intFw1; devFw2 = I - intFw2; % calculating backward errors: devBw1 = I - intBw1; devBw2 = I - intBw2; % gathering results: result1 = zeros(n, 3); result1(:, 1) = 1 : n; result1(:, 2) = intFw2; result1(:, 3) = intBw2; result1
Ausgabe:
n | fw log(20)-log(21) | deviation | fw log(21/20) | deviation |
---|---|---|---|---|
1 | 0.024196716611357 | 0.000000000000003 | 0.024196716611359 | 0.000000000000001 |
2 | 0.016065667772864 | -0.000000000000063 | 0.016065667772819 | -0.000000000000018 |
3 | 0.012019977876056 | 0.000000000001253 | 0.012019977876944 | 0.000000000000365 |
4 | 0.009600442478890 | -0.000000000025066 | 0.009600442461126 | -0.000000000007302 |
5 | 0.007991150422208 | 0.000000000501316 | 0.007991150777480 | 0.000000000146044 |
6 | 0.006843658222499 | -0.000000010026315 | 0.006843651117072 | -0.000000002920888 |
7 | 0.005983978407162 | 0.000000200526301 | 0.005984120515710 | 0.000000058417754 |
8 | 0.005320431856752 | -0.000004010526024 | 0.005317589685809 | -0.000001168355081 |
9 | 0.004702473976077 | 0.000080210520482 | 0.004759317394938 | 0.000023367101621 |
10 | 0.005950520478451 | -0.001604210409632 | 0.004813652101235 | -0.000467342032415 |
n | bw k = 10 | dev | bw k = 0 | deviation |
---|---|---|---|---|
1 | 0.024196716611360 | 0 | 0.024196716611360 | 0.000000000000000 |
2 | 0.016065667772801 | 0 | 0.016065667772805 | -0.000000000000003 |
3 | 0.012019977877309 | 0 | 0.012019977877240 | 0.000000000000069 |
4 | 0.009600442453824 | 0 | 0.009600442455203 | -0.000000000001379 |
5 | 0.007991150923524 | 0 | 0.007991150895937 | 0.000000000027587 |
6 | 0.006843648196184 | 0 | 0.006843648747932 | -0.000000000551748 |
7 | 0.005984178933464 | 0 | 0.005984167898497 | 0.000000011034966 |
8 | 0.005316421330728 | 0 | 0.005316642030057 | -0.000000220699329 |
9 | 0.004782684496559 | 0 | 0.004778270509978 | 0.000004413986581 |
10 | 0.004346310068820 | 0 | 0.004434589800443 | -0.000088279731624 |
Wie erwartet wird der Fehler bei der Vorwärtsrekursion größer, bei der Rückwärtsrekursion liegt er wie berechnet für k=10 unterhalb der Maschinengenauigkeit. Selbst für k = 0 ergeben sich bessere Werte als mit der Vorwärtsrekursion.