Für die Umwandlung von Punktfolgen in Funktionen haben wir bisher nur die Ausgleichsrechnung kennengelernt. Liegen nur wenige und kaum fehlerbehaftete Punkte vor, so ist neben der Approximation der Punkte durch eine Funktion auch die Interpolation möglich, also das Finden einer Funktion, die exakt durch alle gegebenen Punkte verläuft.
Um Funktionen mit dem Computer beschreiben zu können, müssen diese durch endlich viele Werte vollständig festlebar sein. Bei der Ausgleichsrechnung hatten wir deshalb auf gewisse Funktionenklassen beschränkt, in denen jede Funktion durch endlich viele Parameter beschrieben war. Bei der Interpolation beschränkt man sich praktisch immer auf Polynome
oder sogenannte trigonometrische Polynome (werden hier nicht behandelt). Gründe:
Auswertung eines Polynoms an einer Stelle erfordert nur wenige Grundoperationen (Multiplikationen, Additionen).
Polynome sind bei theoretischen Betrachtungen sehr gut handhabbar.
Polynome sind beliebig oft differenzierbar, also in vielfältigen Szenarien einsetzbar (Optimierung!).
Polynome sind leicht integrierbar (Flächenberechnungen!).
Beschäftigen uns zunächst mit der klassischen Polynominterpolation (ein Polynom auf dem gesamte Definitionsbereich) und geben dann einen Überblick über Splines (stückweise polynomiale Funktionen).
8.1Formale Problemstellung¶
Gegen ist eine Folge von Punkten . Finde ein Polynom (oder einen Spline), sodass
gilt, wobei die Intervallgrenzen und so sein sollen, dass für .
Die Zahlen werden Stützstellen genannt. Im Folgenden nehmen wir stets an, dass alle Stützstellen verschieden sind, also für gilt.
8.2Polynominterpolation¶
8.2.1Direkter Ansatz¶
Sind zu interpolierende Punkte gegeben, so erscheint ein Polynom -ten Grades als Interpolante zweckmäßig, da dieses genau frei wählbare Parameter enthält. Setzt man die einzelnen Punkte in die Interpolationsbedingung (1) ein, so erhält man das lineare Gleichungssystem
Die Systemmatrix heißt Vandermonde-Matrix und ist stets invertierbar (wenn alle verschieden sind). Das Lösen des Gleichungssystems benötigt etwa Rechenoperationen und ist damit deutlich aufwendiger als weiter unten behandelte Verfahren zur Polynominterpolation.
8.2.2Lagrange-Interpolation¶
Statt das obige Gleichungssystemzu lösen, können wir für das gesuchte Interpolationspolynom auch direkt eine Formel angeben. Benötigen dazu die sogenannten Langrange’schen Basispolynome vom Grad zu den Stützstellen :
Offensichtlich gilt
Source
import numpy as np
import matplotlib.pyplot as plt
colors = ['tab:blue', 'tab:orange', 'tab:green', 'tab:red']
nodes = [0.2, 0.5, 0.7, 0.9]
n = len(nodes)
x = np.linspace(0.1, 1, 100)
fig, ax = plt.subplots()
for k in range(n):
y = np.ones_like(x)
for l in range(n):
if l != k:
y *= (x - nodes[l]) / (nodes[k] - nodes[l])
ax.plot(x, y, '-', label=f'$L_{{{n-1},{k+1}}}(x)$', color=colors[k])
ax.plot(nodes[k], 1, 'o', color=colors[k])
ax.plot(nodes, np.zeros(n), 'ok')
ax.set_xticks(nodes)
ax.set_xticklabels([f'$x_{{{k}}}$' for k in range(n)])
ax.set_xlabel('x')
ax.set_xlim(x.min(), x.max())
ax.grid()
ax.legend()
plt.show()
Somit ist
das gesuchte Interpolationspolynom. In dieser Darstellung wird das Interpolationspolynom als Langrange’sches Interpolationspolynom bezeichnet.
Damit ist die Existenz eines interpolierenden Polynoms vom Grad gezeigt. Die Eindeutigkeit folgt leicht aus der Tatsache, dass ein Polynom vom Grad höchstens Nullstellen hat (IDVID 810).
Beachte: Durch die zu interpolierenden Punkte ist das Interpolationspolynom eindeutig bestimmt. Ja nach Darstellung dieses Polynoms als Formel gibt man ihm aber verschiedenen Namen, z.B. Langrange’sches Interpolationspolynom und weiter unten dann Newton’sches Interpolationspolynom. Das durch die jeweilige Formel beschriebene Polynom ist stets das selbe.
Das Lagrange’sche Interpolationspolynom ist für den praktischen Einsatz kaum von Bedeutung, leistet aber bei theoretischen Überlegungen (Existenz, Eindeutigkeit, Kondition) sehr gute Dienste.
8.2.3Anwendungsfälle¶
Polynominterpolation ist Baustein in zahlreichen numerischen Verfahren. Grundsätzlich sind zwei Anwendungsfälle zu unterscheiden:
Das Interpolationspolynom soll nur an wenigen Stellen ausgewertet werden (z.B. Interpolation von 6-stündlichen Temperaturmessungen um 0 Uhr, 6 Uhr, 12 Uhr, 18 Uhr zum Erhalt einer Temperatur um 8 Uhr).
Das Interpolationspolynom selbst ist von Interesse oder soll an sehr vielen Stellen ausgewertet werden (z.B. Ersatz einer komplizierten Funktion wie durch ein Polynom).
Im ersteren Fall lohnt sich das Aufstellen des Polynoms nicht. Man setzt hier üblicherweise das Aitken-Neville-Verfahren (siehe unten) zur effizienten Auswertung des (nicht explizit aufgestellten) Interpolationspolynoms an einer Stelle ein.
Im zweiten Fall ist man bestrebt, das Interpolationspolynom in einer Form aufzustellen, die einerseits effizient zu bekommen ist und andererseits die effiziente Auswertung des Polynoms ermöglicht (siehe unten).
8.2.4Kondition¶
Üblicherweise sind die Stützstellen nicht oder nur geringfügig mit Fehlern behaftet. Das die zugehörigen jedoch meist aus Messungen entstehen, ist hier mit relevanten Fehlern zu rechnen. Für die praktische Arbeit stehen uns als statt der Punkte nur die fehlerbehafteten Punkte zur Verfügung. Daraus ergeben sich das exakte Interpolationspolynom und das auf fehlerhaften Eingaben beruhende Interpolationspolynom .
8.2.4.1Fehlermaße¶
Als Fehlermaß für die Eingaben wählen wir den relativen Fehler bzgl. der -Norm der Vektoren bzw , also
da wir für den Abstand zweier Polynome mangels Kenntnis anderer Abstandsmaße zwischen Funktionen ebenfalls den maximalen punktweisen Abstand wählen müssen. Für eine stetige Funktion setzen wir
und drücken den Ausgabefehler mittels
aus.
8.2.4.2Fehlerabschätzung¶
Stellen wir und als Lagrange’sches Interpolationspolynom dar, also
und
so erhalten wir
mit
(IDVID 620).
Aus der Definition der Langrange’schen Basispolynome sieht man leicht (schauen wir uns hier aber nicht an), dass bei festem nicht von der Lage des Intervalls abhängt, sondern nur von der Verteilung der Stützstellen innerhalb des Intervalls. Auch die Werte gehen nicht in ein. Die Frage nach der Kondition ist also ausschließlich eine Frage der Stützstellenverteilung.
8.2.5Algorithmen¶
8.2.5.1Direkter Ansatz und Horner-Schema¶
Das Aufstellen des Interpolationspolynoms mittels Vandermonde-Matrix benötigt ca. Rechenopertationen (Gauss-Algorithmus). Auch hat die Vandermonde-Matrix oft schon bei niedrigem zweistelligem eine zu hohe Konditionszahl, sodass dieser Ansatz in der Praxis keine Rolle spielt.
Das anschließende Auswerten des Polynoms an einer Stelle erfordert \frac{n,(n+1)}{2} Multiplikationen und Additionen, liegt also in der Größenordnung von Grundoperationen.
Liegt das Polynom in der Form
vor, so kann man die Auswertung an einer Stelle noch beschleunigen, denn offensichtlich gilt
Der daraus abgeleitete Algorithmus zur Polynomauswertung heißt Horner-Schema und benötigt nur Multiplikationen und Additionen, liegt also in der Größenordnung :
Setze .
Wiederhole für :
Setze .
Bei gegebenen und liefert dieser Algorithmus .
Das Horner-Schema ist für nicht zu große stabil wie man mittels Rückwärtsanalyse zeigen kann (tun wir hier nicht). Insbesondere sind sie Zwischenergebnisse kleiner als beim direkten Auswerten (Potenzen von !), sodass die Gefahr von Exponentenüberläufen geringer ist.
8.2.5.2Aitken-Neville-Schema¶
Soll das Interpolationspolynom nur an wenigen Stellen ausgewertet werden, so muss das Polynom gar nicht explizit aufgestellt werden. Um auch ohne Kenntnis des Polynoms den Wert für ein Stelle zu bekommen, verwenden wir den folgenden Zusammenhang zwischen den Interpolationspolynom vom Grad und zwei Interpolationspolynomen vom Grad zu unterschiedlichen Stützpunkten:
Bezeichnen wir mit den Wert des Interpolationspolynoms vom Grad zu den Punkten an einer festen Stelle , so erhalten wir den als Aitken-Neville-Schema bekannten Zusammenhang
Ausgehend von
erhalten wir daraus Schritt für Schritt den gesuchten Wert
(IDVID 635). Das Aitken-Neville-Schema benötigt etwa Rechenoperationen und lässt sich mit Speicherplätzen umsetzen, wenn man nich mehr benötigte Zwischenergebnisse wieder überschreibt:
Setze .
Wiederhole für :
Setze .
Wiederhole für :
Setze
Liefere als Ergebnis.
Kann man die Eingaben überschreiben, so wird kein zusätzlicher Speicher benötigt.
Die Rekursionsvorschrift in Schritt 2.2.1 des Algorithmus ist als stabil anzusehen. Auslöschungseffekte sind im Allgemeinen nicht zu erwarten.
8.2.5.3Newton-Interpolation¶
Ist das Interpolationspolynom explizit gesucht, z.B. um es an vielen verschiedenen Stellen auswerten zu können, kann man ähnlich zum Aitken-Neville-Schema ebenfalls eine rekursive Vorschrift finden, die Schritt für Schritt Interpolationspolynome der Ordnungen zu stets um einen Punkt erweiterten Punktmengen liefert.
Herleitung der obigen Formeln: IDVID 650.
Source
import numpy as np
import matplotlib.pyplot as plt
nodes = [0.2, 0.5, 0.7, 0.9]
n = len(nodes)
x = np.linspace(0.1, 1, 100)
fig, ax = plt.subplots()
y = np.ones_like(x)
for k in range(n):
ax.plot(x, y, '-', label=f'$N_{{{k}}}(x)$')
y *= (x - nodes[k])
ax.plot(nodes, np.zeros(n), 'ok')
ax.set_xticks(nodes)
ax.set_xticklabels([f'$x_{{{k}}}$' for k in range(n)])
ax.set_xlabel('x')
ax.set_xlim(x.min(), x.max())
ax.grid()
ax.legend()
plt.show()
Die Berechnung der Koeffizienten benötigt ca. Operationen, ist also deutlich schneller möglich als über das Lösen eines Gleichungssystems. Der Algorithmus dafür ist völlig analog zum Aitken-Neville-Schema.
Das Auswerten des des Newton’schen Interpolationspolynoms an einer Stelle kann ähnlich zum Horner-Schema in ca. Operationen erfolgen, denn es gilt
Algorithmus zum Auswerten:
Setze
Wiederhole für :
Setze .
Am Ende des Algorithmus gilt .
8.2.6Approximationsfehler¶
Nutzt man durch Interpolation erhaltene Polynome als einfach handhabbaren Ersatz für kompliziertere Funktionen, so stellt sich die Frage nach dem Abstand des Interpolationspolynoms zur ursprünglichen Funktion zwischen den Stützstellen. Diese Frage ist eine andere als die nach der Kondition, da hier Fehler in den Eingaben gar keine Rolle spielen.
Man kann folgendes Resultat zeigen (tun wir hier aber nicht):
Einige Bemerkungen zur Interpretation:
Der Faktor wird umso kleiner je mehr Stützstellen genutzt werden.
Der Faktor ist unabhängig von der Lage der Stützstellen und wird meistens kleiner je größer ist. Nur Polynome erfüllen für alle hinreichend großen . Grob formuliert: Je schneller gegen Null geht für große , desto polynomähnlicher ist die Funktion .
Der Faktor hängt nicht von ab und auch nicht vom Intervall (Verschiebung des Intervall ändert den Wert nicht), sondern nur von der Verteilung der Stützstellen innerhalb des Intervalls. Für äquidistante Stützstellen wird dieser Faktor groß sein, für die Tschebyscheff-Stützstellen hingegen klein (vgl. Betrachtungen zur Kondition).
Bei festem wird umso kleiner je kleiner das Intervall ist.
Daraus lassen sich folgende Grundsätze für die Polynominterpolation ableiten:
Nur auf kleinen Intervallen interpolieren. Falls nötig, mehrer Interpolationspolynome “zusammenstückeln” (siehe Splines unten).
Falls kleine Intervalle nicht möglich, dann Stützstellen günstig wählen, z.B. Tschebyscheff-Stützstellen.
Das folgende Beispiel zeigt, dass eine Erhöhung der Stützstellenzahl nicht automatisch den Approximationsfehler verbessert.
8.3Splines¶
8.3.1Idee¶
Hatten festgestellt, dass der Approximationsfehler bei Interpolation auf kleinen Intervallen geringer ist als auf großen Intervallen. Auch führt ein hoher Polynomgrad (also viele Stützstellen) nicht automatisch zu besserer Ergebnissen. Aus diesen Beobachtungen sind die so genannten Splines (Englisch für Straklatte) als Ersatz für Interpolationspolynome entstanden:
Zu gegebenen Stützstellen finde für jedes Intervall ein separates Interpolationspolynom vom Grad (meist klein, z.B. ).
An den Intervallenden sollen die Ableitungen der benachbarten Polynome bis zur Ordnung übereinstimmen, damit die Verbindungsstellen “glatt” sind.
Bei und können in Summe Ableitungen frei gewählt werden.
Aus diesem Ansatz ergeben sich
Bedingungen für die intervallweise Interpolation,
Bedingungen für die Ableitungen an den inneren Intervallgrenzen,
Bedingungen für die Ableitungen an den äußeren Intervallgrenzen,
also insgesamt Bedingungen. Die Anzahl der zu bestimmenden Koeffizienten bei Polynomen vom Grad ist ebenfalls . Alle Bedingungen liefern lineare Gleichungen, sodass die Spline-Koeffizienten als Lösung eines linearen Gleichungssystems berechnet werden können.
Für Splines existiert analog zur Polynominterpolation eine vollständige, ausgereifte Theorie und auch eine umfangreich Software-Unterstützung.
8.3.2Beispiel¶
Wollen die Funktion
auf dem Intervall durch einen kubischen Spline approximieren. Wählen die Stützstellen , also 4 Teilintervalle. An den äußeren Intervallgrenzen soll die erste Ableitung des Splines der ersten Ableitung der Funktion gleichen.
Die vier Polynome , , , , die zusammen den Spline ergeben, sind in der Abbildung dargestellt (IDVID 680):
Source
import numpy as np
import matplotlib.pyplot as plt
a1, b1, c1, d1, a2, b2, c2, d2 = np.linalg.solve(
np.array([
[-125, 25, -5, 1, 0, 0, 0, 0],
[-8, 4, -2, 1, 0, 0, 0, 0],
[0, 0, 0, 0, -8, 4, -2, 1],
[0, 0, 0, 0, 0, 0, 0, 1],
[12, -4, 1, 0, -12, 4, -1, 0],
[-12, 2, 0, 0, 12, -2, 0, 0],
[75, -10, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 1, 0]
]),
np.array([1/26, 1/5, 1/5, 1, 0, 0, 5/338, 0])
)
s1 = lambda x: a1 * x ** 3 + b1 * x ** 2 + c1 * x + d1
s2 = lambda x: a2 * x ** 3 + b2 * x ** 2 + c2 * x + d2
f = lambda x: 1 / (1 + x ** 2)
nodes = np.array([-5, -2, 0, 2, 5])
x = np.linspace(-5, 5, 300)
x1 = x[np.logical_and(-5 <= x, x <= -2)]
x2 = x[np.logical_and(-2 <= x, x <= 0)]
fig, ax = plt.subplots()
ax.plot(x, f(x), '-k', label='$f(x)$')
ax.plot(x1, s1(x1), label='$s_1(x)$')
ax.plot(x2, s2(x2), label='$s_2(x)$')
ax.plot(-x1, s1(x1), label='$s_3(x)$')
ax.plot(-x2, s2(x2), label='$s_4(x)$')
ax.plot(nodes, f(nodes), 'ok')
ax.set_xlabel('x')
ax.set_xlim(x.min(), x.max())
ax.set_ylim(-0.1, 1.1)
ax.grid()
ax.legend()
plt.show()
8.3.3Kondition und Algorithmen¶
Die Kondition für das Berechnen der Spline-Koeffizienten ist sehr gut (ohne Beweis).
Für die Berechnung der Koeffizienten muss analog zu den Interpolationspolynomen kein Gleichungssystem gelöst werden. Stattdessen kann man spezielle Basis-Splines einführen, die dann das effiziente und stabile Aufstellen des gesuchten Splines ermöglichen (vgl. auch Langrange’sche und Newton’sche Basispolynome). Mit dieser speziellen Basis dargestellte Splines heißen auch B-Splines (kurz für Basis-Splines).
8.3.4Kurven und Flächen¶
Kurven in der Ebene oder im Raum sind Funktionen, die ein Intervall nach oder abbilden. Ist jede Koordinatenfunktion ein Spline, so erhält man leicht zu handhabende Kurven für die grafische Modellierung. Die Koeffizienten bzgl. der B-Spline-Basis können in Grafiksoftware üblicherweise über sogenannte Kontrollpunkte verändert werden.
Ein alternative Basis zur B-Spline-Basis sind die Bernstein-Polynome, die dann sogenannte Bézier-Kurven liefern. Diese können ebenfalls über Kontrollpunkte leicht und intuitiv angepasst werden.
NURBS (Non-Uniform Rational B-Splines) sind eine Verallgemeinerung der Splines, welche auch Quotienten von Polynomen zulassen. Neben Kurven können NURBS auch nahezu beliebige Flächen beschreiben, sodass sie heute das Standardwerkzeug für die Freiformmodellierung sind.