Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

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ösennumerisches Lösen
exakte AusdrückeKommazahlen
exakte Zahlenendlich viele Ziffern (Nachkommastellen!)
Grenzübergängeendlich viele Rechenschritte
komplexe OperationGrundrechenarten

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

Typische Aufgabenstellungen sind zum Beispiel:

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:

1+x20x20=1,1+x^{20}-x^{20}=1,

z.B. x=10.5x=10.5.

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 1+(x20x20)1+(x^{20}-x^{20}) liefern alle 1.

Wir sehen hier Absorption und fehlende Assoziativität der Computeraddition.

1.3.2Integral

Wollen für großes nNn\in\bbN (z.B. n=20n=20) das Integral

In:=01xnexdI_n:=\int\limits_0^1x^n\,\rme^x\diff

berechnen. Das geht z.B. mittels partieller Integration, welche auf die Rekursionsformel

In=enIn1,I0=e1,I_n=\rme-n\,I_{n-1},\quad I_0=\rme-1,

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:

  1. Ein Fehler im Produktionsprozess von Pentium-Prozessoren führt zu nur selten auftretenden und sehr kleinen Rechenfehlern bei gewissen Grundrechenoperationen.

  2. Ein iteratives Verfahren zur Division von Zahlen verstärkt den Fehler soweit, dass er relevant wird (fünfte Kommastelle falsch).

  3. Intel merkt es, sagt aber nichts.

  4. Jemand anderes merkt es und macht das Problem öffentlich.

  5. 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:

  1. 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).

  2. Gelegentlich werden Raketen aus ungeklärten Gründen nicht abgefangen.

  3. Jemand schaut mal nach, wo es klemmt.

  4. 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.

  5. Anweisung an die Nutzer: täglich rebooten.

  6. Software-Update wird am 16. Februar 1991 verfügbar, impliziert aber 2 Stunden Down-Time. Probleme beim Verteilen usw.

  7. Am 25. Februar 1991 sterben 28 US-Soldaten durch eine Scud-Rakete.

  8. Jemand spielt das Update ein am 26. Februar 1991.

Details zum Rundungsfehler: IDVID 170.

Person schaut aus etwas Entfernung auf Tafel mit Formeln und denkt "Amazing watching a physicist at work, exploring universes in a symphony of numbers. If only I had studied math, I could appreciate the beauty on display here.". Person an der Tafel denkt "Oh no. This has two unknowns. That's gonna be really hard. Ughhhhhhh. Think. There's gotta be a way to avoid doing all that work...".

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