Die numerische Mathematik („Numerik“) befasst sich mit Entwicklung und Analyse von Algorithmen für das zahlenmäßige Lösen von in der Sprache der Mathematik formulierten Aufgabenstellungen.
Früher: Algorithmen per Hand/Zettel/Stift ausführen (oder in Lehm geritzt).
Heute: Computer.
1.1Analytisches vs. numerisches Lösen¶
| analytisches Lösen | numerisches Lösen |
|---|---|
| exakte Ausdrücke | Kommazahlen |
| exakte Zahlen | endlich viele Ziffern (Nachkommastellen!) |
| Grenzübergänge | endlich viele Rechenschritte |
| komplexe Operation | Grundrechenarten |
Nicht Thema hier: Computeralgebrasysteme (CAS). Diese können automatisiert mit exakten Ausdrücken rechnen, teils auch Grenzübergänge ausführen usw. Jedoch liefern sie nur Lösungen, wenn die Aufgabenstellung überhaupt analytisch bestimmbare Lösungen besitzt, exakte Eingangsdaten vorliegen und die Aufgabe nicht zu kompliziert ist! Rechenzeiten sind deutlich höher als beim numerischen Lösen.
1.2Themen in der Numerik¶
Besondere Aufmerksamkeit gilt
den technischen Gegebenheiten, z.B.
Genauigkeit der Zahlendarstellung,
verfügbarer Speicherplatz,
Möglichkeit der parallelen Ausführung,
verfügbare Rechenzeit,
dem Unterschied zwischen exakter Lösung und algorithmisch berechneter Lösung,
der Auswirkung von Datenfehlern, insbesondere des Rundens von Eingangswerten und Zwischenergebnissen, auf das Endergebnis,
der Anzahl der benötigten Rechenschritte.
Typische Aufgabenstellungen sind zum Beispiel:
lineare Gleichungssysteme lösen,
nichtlineare Gleichungen Lösen,
Funktionsauswertung (Interpolation, Ausgleichsprobleme),
Integrale berechnen,
Eigenwerte und -vektoren von Matrizen berechnen,
Differentialgleichungen lösen
Optimierungsprobleme lösen
Je nach Komplexität der konkreten Aufgabenstellung führen insbesondere die letzen beiden Punkte zum wissenschaftlichen Rechnen. Ein klare Abgrenzung zur Numerik ist nicht möglich. Die Numerik liefert die Werkzeuge. Das wissenschaftliche Rechnen kombiniert sie zur Lösung komplexer Aufgaben aus der Praxis.
1.3Beispiele¶
Was kann da schon schiefgehen?
1.3.1Groß plus Klein¶
Klar:
z.B. .
Taschenrechner, Python, C, JavaScript,...: 0.
print(1 + 10.5 ** 20 - 10.5 ** 20)
# Ausgabe: "0.0"Python-Code zum Testen
#include <stdio.h>
#include <math.h>
int main() {
printf("%f\n", 1 + pow(10.5, 20) - pow(10.5, 20));
return 0;
}
// Ausgabe: "0.000000"C-Code zum Testen
console.log(1 + 10.5 ** 20 - 10.5 ** 20);
# Ausgabe: "0"JavaScript-Code zum Testen
Bei liefern alle 1.
Wir sehen hier Absorption und fehlende Assoziativität der Computeraddition.
1.3.2Integral¶
Wollen für großes (z.B. ) das Integral
berechnen. Das geht z.B. mittels partieller Integration, welche auf die Rekursionsformel
führt (IDVID 140). Alternativ: numerische Integration, welche später im Semester behandelt wird.
from math import exp
from sympy import N, E
n_max = 20
num_e = exp(1)
cas_e = E
num_i = num_e - 1
cas_i = cas_e - 1
for n in range(0, n_max + 1):
if n > 0:
num_i = num_e - n * num_i
cas_i = cas_e - n * cas_i
print(f'n = {n}, exakt: {cas_i}')
print(f' {num_i:.20f} (numerisch)')
print(f' {N(cas_i, 20):.20f} (CAS)')n = 0, exakt: -1 + E
1.71828182845904509080 (numerisch)
1.71828182845904523540 (CAS)
n = 1, exakt: 1
1.00000000000000000000 (numerisch)
1.00000000000000000000 (CAS)
n = 2, exakt: -2 + E
0.71828182845904509080 (numerisch)
0.71828182845904523536 (CAS)
n = 3, exakt: 6 - 2*E
0.56343634308190981841 (numerisch)
0.56343634308190952928 (CAS)
n = 4, exakt: -24 + 9*E
0.46453645613140581716 (numerisch)
0.46453645613140711824 (CAS)
n = 5, exakt: 120 - 44*E
0.39559954780201600499 (numerisch)
0.39559954780200964415 (CAS)
n = 6, exakt: -720 + 265*E
0.34468454164694906083 (numerisch)
0.34468454164698737048 (CAS)
n = 7, exakt: 5040 - 1854*E
0.30549003693040166496 (numerisch)
0.30549003693013364203 (CAS)
n = 8, exakt: -40320 + 14833*E
0.27436153301583177111 (numerisch)
0.27436153301797609914 (CAS)
n = 9, exakt: 362880 - 133496*E
0.24902803131655915081 (numerisch)
0.24902803129726034306 (CAS)
n = 10, exakt: -3628800 + 1334961*E
0.22800151529345358270 (numerisch)
0.22800151548644180472 (CAS)
n = 11, exakt: 39916800 - 14684570*E
0.21026516023105568109 (numerisch)
0.21026515810818538341 (CAS)
n = 12, exakt: -479001600 + 176214841*E
0.19509990568637691766 (numerisch)
0.19509993116082063448 (CAS)
n = 13, exakt: 6227020800 - 2290792932*E
0.18198305453614516125 (numerisch)
0.18198272336837698714 (CAS)
n = 14, exakt: -87178291200 + 32071101049*E
0.17051906495301283329 (numerisch)
0.17052370130176741544 (CAS)
n = 15, exakt: 1307674368000 - 481066515734*E
0.16049585416385259151 (numerisch)
0.16042630893253400376 (CAS)
n = 16, exakt: -20922789888000 + 7697064251745*E
0.15034816183740362661 (numerisch)
0.15146088553850117518 (CAS)
n = 17, exakt: 355687428096000 - 130850092279664*E
0.16236307722318343849 (numerisch)
0.14344677430452525731 (CAS)
n = 18, exakt: -6402373705728000 + 2355301661033953*E
-0.20425356155825680204 (numerisch)
0.13623989097759060374 (CAS)
n = 19, exakt: 121645100408832000 - 44750731559645106*E
6.59909949806592432964 (numerisch)
0.12972389988482376433 (CAS)
n = 20, exakt: -2432902008176640000 + 895014631192902121*E
-129.26370813285942062976 (numerisch)
0.12380383076256994869 (CAS)
Sehen hier ein instabiles Verfahren zur Berechnung des Integrals.
1.3.3Pentium-FDIV-Bug¶
Siehe Pentium FIDV bug.
Kurzfassung:
Ein Fehler im Produktionsprozess von Pentium-Prozessoren führt zu nur selten auftretenden und sehr kleinen Rechenfehlern bei gewissen Grundrechenoperationen.
Ein iteratives Verfahren zur Division von Zahlen verstärkt den Fehler soweit, dass er relevant wird (fünfte Kommastelle falsch).
Intel merkt es, sagt aber nichts.
Jemand anderes merkt es und macht das Problem öffentlich.
PR-Disaster, Rückrufaktion, einige 100 Million Dollar Unkosten für Intel.
1.3.4Patriot-Raketenabwehr¶
Siehe GAO/IMTEC-92-26 Patriot Missile Software Problem.
Kurzfassung:
Zweiter Golfkrieg (“Operation Desert Storm”). US-Amerikanische Militätbasis in Dharan (Saudi-Arabien) wird durch Patriot-Raketenabwehrsystem vor Scud-Raketen aus dem Irak geschützt. Vorher für dieses Szenario nicht wirklich getestet (70er-Jahre Legacy-Code).
Gelegentlich werden Raketen aus ungeklärten Gründen nicht abgefangen.
Jemand schaut mal nach, wo es klemmt.
Fehler gefunden: Rundungsfehler verstärkt sich im Laufe der Zeit durch ungeschickte Implementierung einer Multiplikation mit 0.1, sodass nach hinreichend langer Up-Time das System nicht mehr präzise genug arbeitet.
Anweisung an die Nutzer: täglich rebooten.
Software-Update wird am 16. Februar 1991 verfügbar, impliziert aber 2 Stunden Down-Time. Probleme beim Verteilen usw.
Am 25. Februar 1991 sterben 28 US-Soldaten durch eine Scud-Rakete.
Jemand spielt das Update ein am 26. Februar 1991.
Details zum Rundungsfehler: IDVID 170.

I could type this into a solver, which MIGHT help, but would also mean I have to get a lot of parentheses right... Quelle: Randall Munroe, xkcd.com/2207