Gegeben seien z.B. Messwerte (Stützpunkte). Diese sollen durch eine Funktion (Interpolante, Interpolierende, inter = zwischen, polire = glätten, schleifen) abgebildet werden.
Zu diesem Zweck gibt es eine Reihe von Methoden. Einige davon sollen nun besprochen werden.
Existenz und Eindeutigkeit: Seinen paarweise verschiedene Stützpunkte gegeben. Dann gibt es genau ein Polynom vom Grad maximal , das die Gleichungen erfüllt. Dieses Polynom existiert und ist eindeutig bestimmt.
n=1: linare Interpolation
n=2: quadratische Interpolation
n=3: kubische Interpolation
etc.
seien die unbekannten Koeffizienten des Interpolationspolynoms, die Stützstellen und die Stützwerte.
Die Matrix in obiger Formel wird auch Vandermonde-Matrix genannt.
Das Problem mittels linearem Gleichungssystem lösen zu wollen. wäre aber unnötig aufwendig (das Problem ist auch schlecht konditioniert). Es gibt effizientere Verfahren, denen wir uns nun widmen wollen.
Vorerst wollen wir aber noch ein einfaches Beispiel durchexerzieren. Gegeben seien zwei Stützpunkte. Damit ist
das Interpolationspolynom vom Grad 1 (linear, eine Gerade).
Die Gleichungssystem mit der Vandermonde-Matrix ist
Dieses lineare Gleichungssystem lässt sich einfach lösen (z.B. mit dem Gauß-Algorithmus, der cramerschen Regel).
Es ergibt sich
und .
.
Das Problem lässt sich aber auch einfach geometrisch lösen.
Aus der Ähnlichkeit der Dreiecke ergibt sich:
.
Und damit wieder die mit der Vandermonde-Matrix hergeleitete Formel: .
Diese Methode ist deutlich effizienter als die Verwendung der lagrangeschen Interpolationsformel. Auch die SciPy-Bibliothek stellt eine entsprechende Funktion barycentric_interpolate zur Verfügung. Mit dieser ist folgender Python-Code erstellt:
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import barycentric_interpolate
x_mess = (1., 2., 3., 4., 5.)
y_mess = (1., 1., 1., 1., 2.)
x = np.linspace(min(x_mess), max(x_mess), num=100)
y = barycentric_interpolate(x_mess, y_mess, x)
plt.plot(x, y, label="baryzentrische Interpolation")
plt.plot(x_mess, y_mess, "x", label="Messwerte")
plt.legend()
plt.show()
Es werden nun die dividierten Differenzen berechnet. Diese lassen sich mit einem Dreiecksschema (Neville-Schema) übersichtlich darstellen:
Mit .
Beispiel: Es soll wieder das Interpolationspolynom durch die 3 Stützpunkte gelegt werden.
Mit der Newton-Interpolationsformel ergibt sich wiederum
Mit dem Horner-Schema lässt sich das Interpolationspolynom auswerten (siehe Horner-Schema).
Python-Code zum Horner-Schema:
import numpy as np
def horner(a, x0):
f = 0
n = np.size(a)
for i in np.arange(0, n):
f = f*x0 + a[i]
return f
a = np.array([1/2, -3/2, 2])
h = horner(a, 2.5)
print(h)
Oft interessiert das Interpolationspolynom selbst nicht. Man will nur den Interpolationswert an einer bestimmten Stelle bestimmen.
Das kann mit dem Neville-Aitken-Schema effizient gemacht werden.
Hier soll das Verfahren von Neville-Aitken an Hand eines rudimentären Python-Programms dargestellt werden:
import numpy as np
x = (1., 2., 3.) # Stützstellen
y = (1., 1., 2.) # Stützwerte
xinter = 2.5 # Auswertung an der Stelle xinter
n = 3
p = np.zeros((n,n))
for i in np.arange(0, n):
p[i,0] = y[i]
for k in np.arange(1, n):
for i in np.arange(0, n-k):
p[i,k] = p[i+1,k-1] + (x[i+k]-xinter) / (x[i+k]-x[i]) * (p[i,k-1] - p[i+1,k-1])
print("f(", xinter, ") = ", p[0,n-1])
Interpolationspolynome höherer Ordnung können deutliche Überschwinger aufweisen. Knorrenschild zeigt auf Seite: 88f seines Buches diese Problematik anhand eines Beispiel auf. Aus diesem Grunde ist auch die Extrapolation außerhalb des Stützstellenintervalls kaum möglich. Genaueres siehe auch Polynominterpolation#Runges_Phänomen.
Isaac Jacob Schoenberg (rumänisch-amerikanischer Mathematiker, 1903-1990)]]
Carl-Wilhelm Reinhold de Boor (deutsch-amerikanischer Mathematiker, geb. 1937)
Spline mit 8 Knoten
Der Name Spline leitet sich vom englischen Begriff "Spline" für Straklatte ab und kommt aus dem Schiffbau.
Nunmehr wird nicht mehr nur ein Interpolationspolynom durch die Stützpunkte gelegt, sondern es wird das Stützintervall in mehrere Teilintervalle aufgeteilt. In jeweils einem Teilintervall lassen sich dann Interpolationspolynome niedrigeren Grades verwenden (typischerweise kubische Polynome).
Für weitere Details siehe auch Spline, Spline-Interpolation, Hanke-Bourgeois: Seite 355ff, Burg, Haf, Wille, Meister: Seite 410ff, Knorrenschild: Seite 89ff.