Sie sind auf Seite 1von 5

Numerik Projekt 1 Aufgabe 2

Daniel Judas / Philip Dimitrov


29.10.2012

Auslo
schung

Unter Ausloschung versteht man in der Numerik den Verlust an Genauigkeit bei der Subtraktion fast gleich groer Gleitkommazahlen.

Rundungsfehlerschranke

Zunachst berechnen wir den relativen Rechenfehler f


ur x + 1 x:
p
p
f (x) =
(x(1 + 1 ) + 1)(1 + 2 )(1 + 3 ) x(1 + 1 )(1 + 4 ))(1 + 5 ) (1)
p

2
1
(x(1 + 1 ) + 1)(1 + )(1 + 3 ) x(1 + + 4 ))(1 + 5 )() (2)
=
2
2

1 2
1
=
x(1 + + + 3 + 5 ) x(1 + + 4 + 5 )
(3)
2
2
2
1 2

x) (x)
x( 2 + 2 + 3 + 5 ) x( 21 + 4 + 5 )
(

=
(4)

x+1 x
Im ung
unstigsten Fall erhalten wir:

eps(3 x + 1 + 2, 5 x)

> 5eps x( x + 1 + x) > 10eps x >> eps


=

x+1 x
Nun analog f
ur

1
:
x+1+ x

g(x) =
=
:=
:=
x) (x)
(

(5)

1 + 6

(6)
x(1 + + + 3 + 5 ) + x(1 + 21 + 4 + 5 )

1 2
1
( x(1 + + + 3 + 5 6 ) + x(1 + + 4 + 5 6 ))1(7)
2
2
2
1 2
1 + + + 3 + 5 6
(8)
2
2
1
(9)
1 + + 4 + 5 6
2

( x + x)1
( x + 1 + x)1


(10)

( x + 1 + x)1 ( x + 1 + x)1

1
2

2
2

( x + x)1 ( x + 1 x)1
=

1

( x + 1 + x)1 ( x + 1 x)1
1
p
p
=
(x + 1) (x2 + x) + (x2 + x x
1

=
1
x( ) + x2 + x( ) +
1

=
(x x2 + x)( ) +
1
1

1
1/2( ) +
1 + 11
eps
4
11
11
< 1 eps 1 eps
4
4

(11)
(12)
(13)
(14)
(15)
(16)

Kondition

Da die beiden oben genannten Funktionen algebraisch Aquivalent


sind, ist die Kondition
gleich und wird wie folgt berechnet:
|f 0 (x) x|
|f (x)|
r
1
x
=
2 x+1

Krel =

(17)

Krel

(18)

F
ur groe x geht die Kondition gegen 21 und f
ur kleine X gegen 0, was auf eine gute
Kondition schlieen lasst. Da bei f(x) der relative Rechenfehler bei groen x entsprechend
zunimmt ist die Funktion aufgrund ihrer Ausloschung instabil, was sich mit der intuitiven
Beurteilung deckt. g(x) hingegen hat einen eher geringen Rechenfehler und ist damit
stabil.

Andere Beispiele

In folgenden 0Beispielen wird zunachst auf Ausloschung u


uft, danach die Kondition
berpr
berechnet
und
dann
falls
gute
Kondition
besteht
eine neue, aquivalente
mit Krel = |f|f(x)x|
(x)|
Funktion gesucht.
p

1 + x (1 x), x positiv und klein


Krel =

2
2(x2 +sqrt(1x2 )1

Ist klein, folglich auch gut konditioniert.


Stabile
Auswertungsvariante:
p
p
(1 + x) (1 x) = 1+x+1 1x
2

sin(x + c) sin(x), x 2 , c klein


Nach dem Additionstheorem folgt:
sin(x + c) sin(x) = 2 cos(x + 2c ) sin( 2c )
Krel =

2sin(x+ 2c )sin( 2c x)
2cos(x+ 2c )sin( 2c )

sin(x+ 2c )
cos(x+ 2c )

F
ur kleine c folgt, dass cos(x + c/2) gegen 0 geht, also wird die Konditionszahl gro,
was auf schlechte Kondtion schlieen lasst, weshalb es keine stabile Variante gibt.
arctan(a + 1) arctana, a klein

1+3x

12x
,
1+x

x gro

1cosx
,x
x
Bei diesen Fallen liegt keine Ausloschung vor.
1
coshxsinhx
, x positiv und gro

Krel = x
Da wir im Bereich f
ur groe x sind, ist die Kondition schlecht.
1
coshxsinhx
x negativ und gro
x e x

x gro

Auch bei diesen beiden Fallen liegt keine Ausloschung vor.


1

p
(1 2n ), n N

Setzen x = 2 n
x
Krel = 2(x+sqrt(1x)1)
Hier liegt erneut eine gute Kondition vor, weshalb wieder eine stabile Auswertungsvariantep
gesucht werden muss.
1 (1 2n ) = 1+x1x

p
|tan2 x cos2 x|, x klein

Und auch in diesem Fall ergibt sich keine Ausloschung.

Experimentelle Auswertung

Beim ersten Beispiel, kann man mit einem immer groer werdendem x sehen, dass f(x)
schneller sich zu 0 als g*(x) annahert, was die schwachere Stabilitat zeigt.
Die andere Auswertung loscht sich bei immer kleiner werdendem c selbst aus, was ein
Indizes f
ur Instabilitat ist. Man sieht sofort, dass z*(x), die stabile Variante, Vorteile hat
und erhalten bleibt.
Die folgenden Berechnung wurden mit 20 Stellen getatigt.

Anhang

Maple-Code:
gx := 1/(sqrt(x+1)+sqrt(x));
fx := sqrt(x+1)-sqrt(x);
for j to 20 do
for i from 10j by 10(j+1) to 10(j+1) do
fxx := eval(fx, x = i);
gxx := eval(gx, x = i);
xN := evalf(gxx)
print(evalf(fxx))
print(evalf(gxx))
print(abs((evalf(fxx)-evalf(gxx))/evalf(gxx)))
end do;
end do;

yx := sin(-(1/2)*Pi+c)-sin(-(1/2)*Pi);
zx := sin(-(1/2)*Pi+(1/2)*c)/cos(-(1/2)*Pi+(1/2)*c);
for k by -1 to -20 do

evalf(eval(yx, c = 10k));

evalf(eval(zx, c = 10k));

print(abs((evalf(eval(yx, c = 10k))-evalf(eval(zx,
c = 10k)))/evalf(eval(zx,
c = 10k))))
end do;