Vor der flächendeckenden Einführung des Computers mussten Ableitungen per Hand berechnet werden. Entsprechend umfangreich und weit entwickelt sind die Verfahren dazu. Wir werden hier nur einen Überblick über das prinzipielle Vorgehen geben und, da heute deutlich relevanter, das Differenzieren mit dem Computer betrachten.
6.2.1Manuelles Differenzieren¶
Der Weg über die Definition der Ableitung einer Funktion als Grenzwert ist recht mühsam für den praktischen Einsatz. Analog zur Berechnung von Grenzwerten bei Zahlenfolgen und Funktionen entnimmt man deshalb die Ableitungen einiger Grundfunktionen aus Tabellen und kombiniert diese dann anhand verschiedener Ableitungsregeln zu Ableitungen komplexerer Funktionen. Zunächst die Ableitungen einiger immer wieder auftretender Funktionen (gültig für alle , für die und sinnvolle Werte liefern):
Beachte, dass die Exponentialfunktion beim Ableiten unverändert bleibt! Dinge, die trotz des Anwendens irgendwelcher Operationen unverändert bleiben, spielen stets eine besondere Rolle. So taucht die Exponentialfunktion beispielsweise sehr oft in den Lösungen von Differentialgleichungen auf, spielt aber auch in der Wahrscheinlichkeitsrechnung eine wichtige Rolle.
Mittels folgender Ableitungsregeln, deren Gültigkeit wir hier nicht nachweisen, können Ableitungen komplexerer Funktionen auf Ableitungen einfacher Funktionen zurückgeführt werden.
Ist an einer Stelle differenzierbar und ist eine Zahl, so ist auch bei differenzierbar und es gilt
Sind und an einer Stelle differenzierbar, so ist auch die Summe dort differenzierbar und es gilt
(Summenregel).
Sind und an einer Stelle differenzierbar, so ist auch das Produkt dort differenzierbar und es gilt
(Produktregel).
Sind und an einer Stelle differenzierbar und gilt , so ist auch der Quotient bei differenzierbar und es gilt
(Quotientenregel).
Ist an einer Stelle differenzierbar und ist an der Stelle differenzierbar, so ist auch die Hintereinanderausführung bei differenzierbar und es gilt
(Kettenregel).
6.2.2Ableitungen mit SymPy¶
Das Bilden von Ableitungen mit SymPy ist denkbar einfach:
import sympy
x, c = sympy.symbols('x c')
sympy.diff((x + c) ** 2 * sympy.sin(x), x)6.2.3Numerische Differentiation¶
Das numerische Differenzieren erfolgt direkt über die Definition der Ableitung:
Da man Grenzübergänge mit dem Computer nicht exakt umsetzen kann, wählt man nah bei und betrachtet den zugehörigen Differenzenquotient als Näherung für die Ableitung. Für mit einem fest (also unabhängig von ) gewähltem, kleinen erhält man also
Diese Form der numerischen Differentiation bezeichnet man als Vorwärtsdifferenz. Da auch kleiner als sein kann, ist
eine völlig gleichberechtigte, alternative Näherungsformel für die Ableitung (Rückwärtsdifferenz). Gibt es keinen Grund eine von beiden Varianten zu bevorzugen, so nutzt man gern deren Mittelwert:
(zentrale Differenz).
Auf den ersten Blick wird die Näherung für besser, je kleiner gewählt wird. Jedoch zeigt sich in der Praxis, dass zu kleines zu starken Oszillationen in der berechneten Näherung für führen kann. Ursache ist, dass kleine Fehler in den (oft aus Messungen stammenden) Werten für durch das numerische Differenzieren verstärkt werden. Die Details dazu sind Thema der numerischen Mathematik und führen hier zu weit. Merke jedoch: Numerisches Differenzieren ist nur mit großer Vorsicht zu benutzen!
Source
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, np.pi, 300) # Stützstellen
f = x ** 2 * np.sin(x) # Funktion, die abgeleitet werden soll
h = x[1] - x[0] # Abstand der Stützstellen
f1 = (f[2:] - f[:-2]) / (2 * h) # zentrale Differenzen bei exakten Funktionswerten
rng = np.random.default_rng(0) # Zufallszahlengenerator für Rauschen
f_noisy = f + 0.01 * rng.normal(0, 1, f.shape) # zufälliges Rauschen addieren
f1_noisy = (f_noisy[2:] - f_noisy[:-2]) / (2 * h) # zentrale Differenzen
fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True, figsize=(8, 8))
ax1.plot(x, f, '-b', label='exakte Funktionswerte')
ax1.plot(x, f_noisy, '-r', lw=1, label='verrauschte Funktionswerte')
ax2.plot(x[1:-1], f1, '-b', label='Ableitung bei exakten Funktionswerten')
ax2.plot(x[1:-1], f1_noisy, '-r', lw=1, label='Ableitung bei verrauschten Funktionswerten')
ax1.set_xlabel('x')
ax1.set_xlabel('f(x)')
ax2.set_xlabel('f\'(x)')
ax1.legend()
ax2.legend()
plt.show()
Im Bild sehen wir: Obwohl die verrauschten Funktionswerte kaum von den exakten Funktionswerten unterscheidbar sind, weichen die numerisch berechneten Ableitungen deutlich voneinander ab. Zum selbst ausprobieren: Erhöht man die Anzahl der Stützstellen, so wird die Abweichung der Ableitungen immer größer.