________________________________________________________________________________
Inhalt....: Rechengenauigkeit
Kategorie.: Grundkurs
Mathematik: Numerik
MuPAD.....: 3.1.0
Datum.....: 2004-03-31
Autoren...: Kai Gehrs <acrowley@mupad.de>
Funktionen: |, for, from, to, print, float, DIGITS
________________________________________________________________________________
Rechengenauigkeit
Dieses Arbeitsblatt ist Bestandteil des MuPAD Grundkurses.
In der Einführung zu diesem Kurs haben wir in der Rubrik "Erste Schritte" bereits
gelernt, dass man mit MuPAD wie mit einem gewöhnlichen Taschenrechner rechnen
kann. Wesentlich ist jedoch, dass wir die Genauigkeit, mit der wir Näherungswerte
z.B. für Lösungen von Gleichungen bestimmen, beliebig beeinflußen können.
Gewöhnliche Taschenrechner bieten in der Regel die Möglichkeit, mit 8 signifikanten
Stellen zu rechnen. In MuPAD selbst wird standardmässig mit 10 signifikanten
Stellen gerechnet. Dieser Wert kann jedoch verändert werden. In der Variablen
DIGITS ist stets die Rechengenauigkeit (standardmäßig der Wert 10) gespeichert.
Wir könnten also durch die Zuweisung DIGITS:= 1000 fortan mit 1000-stelliger
Genauigkeit rechnen.
Nun kann man sich fragen, wozu eine so hohe Genauigkeit nutzen soll. Den Grund
kann man schon an einem ganz einfachen Beispiel erkennen: Wir betrachten die
quadratische Gleichung
x^2 + 2*x + 1/i = 0
![]()
für die Werte i = 1, 2, 3, ... , 12. Für jedes i besitzt die entsprechende Gleichung
genau zwei Lösungen. Aus Übersichtsgründen berechnen wir im folgenden nur
Näherungswerte für eine dieser beiden Lösungen:
for i from 1 to 12 do
print(Unquoted,"i = ".expr2text(i),
" x = ".expr2text(float( -1 - sqrt(1 - 1/(10^i)) )))
end_for:
i = 1, x = -1.948683298
i = 2, x = -1.994987437
i = 3, x = -1.999499875
i = 4, x = -1.999949999
i = 5, x = -1.999995
i = 6, x = -1.9999995
i = 7, x = -1.99999995
i = 8, x = -1.999999995
i = 9, x = -1.999999999
i = 10, x = -2.0
i = 11, x = -2.0
i = 12, x = -2.0
Die auf diese Weise berechneten Werte suggerieren, dass eine der beiden
Lösungen der Gleichung für alle i > 9 durch x = -2.0 gegeben ist. Die mathema-
tische Intuition sagt uns an dieser Stelle, dass dies auf keinen Fall korrekt sein
kann. Wir prüfen die letzten drei Ergebnisse für i = 10, i = 11, i = 12 nach, indem
wir den den Wert x = -2.0 in die entsprechende Gleichung einsetzen:
x^2 + 2*x + 1/(10^10) | x = -2;
x^2 + 2*x + 1/(10^11) | x = -2;
x^2 + 2*x + 1/(10^12) | x = -2
![]()
![]()
![]()
Wir haben also tatsächlich ein Problem, denn die linken Seiten der Gleichungen
denken gar nicht daran Null zu werden. Man nennt dieses Phänomen in der nu-
merischen Fachsprache "Auslöschung". In unserem Fall tritt Auslöschung auf,
weil wir einfach mit zu geringer Genauigkeit rechnen. Daher erhöhen wir die
Genauigkeit auf 20 signifikante Stellen und führen unsere obigen Berechnungen
erneut durch:
DIGITS:= 20:
for i from 1 to 12 do
print(Unquoted,"i = ".expr2text(i),
" x = ".expr2text(float( -1 - sqrt(1 - 1/(10^i)) )))
end_for:
i = 1, x = -1.9486832980505137996
i = 2, x = -1.9949874371066199547
i = 3, x = -1.9994998749374609101
i = 4, x = -1.9999499987499374961
i = 5, x = -1.9999949999874999375
i = 6, x = -1.9999994999998749999
i = 7, x = -1.99999994999999875
i = 8, x = -1.9999999949999999875
i = 9, x = -1.9999999994999999999
i = 10, x = -1.99999999995
i = 11, x = -1.999999999995
i = 12, x = -1.9999999999995
Wie man sieht, liegen die Lösungen für wachsendes i zwar sehr nahe bei x = -2.0,
aber sie unterscheiden sich dennoch minimal von diesem Wert.
________________________________________________________________________________
Anmerkungen:
1. Weitere Anregungen finden Sie in der Buchreihe Mathematik 1 x anders. In dieser Reihe
wird eine Vielzahl unterschiedlichster mathematischer Probleme mit MuPAD gelöst. Die
Bücher können unter www.schule.mupad.de/literatur kostenfrei kopiert werden.
________________________________________________________________________________