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.

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

a0+a1x+a2x2++an1xn1+anxna_0+a_1\,x+a_2\,x^2+\cdots+a_{n-1}\,x^{n-1}+a_n\,x^n

oder sogenannte trigonometrische Polynome (werden hier nicht behandelt). Gründe:

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 (x1,y1),,(xn,yn)R2(x_1,y_1),\ldots,(x_n,y_n)\in\bbR^2. Finde ein Polynom p:[a,b]Rp:[a,b]\to\bbR (oder einen Spline), sodass

p(xk)=ykfu¨k=1,,np(x_k)=y_k\quad\text{für }k=1,\ldots,n

gilt, wobei die Intervallgrenzen aa und bb so sein sollen, dass xk[a,b]x_k\in[a,b] für k=1,,nk=1,\ldots,n.

Die Zahlen x1,,xnx_1,\ldots,x_n werden Stützstellen genannt. Im Folgenden nehmen wir stets an, dass alle Stützstellen verschieden sind, also xkxlx_k\neq x_l für klk\neq l gilt.

8.2Polynominterpolation

8.2.1Direkter Ansatz

Sind nn zu interpolierende Punkte gegeben, so erscheint ein Polynom (n1)(n-1)-ten Grades als Interpolante zweckmäßig, da dieses genau nn frei wählbare Parameter enthält. Setzt man die einzelnen Punkte in die Interpolationsbedingung (1) ein, so erhält man das lineare Gleichungssystem

[1x1x12x1n11xnxn2xnn1][a0an1]=[y1yn]{\begin{bmatrix} 1&x_1&x_1^2&\cdots&x_1^{n-1}\\ \vdots&\vdots&\vdots&&\vdots\\ 1&x_n&x_n^2&\cdots&x_n^{n-1} \end{bmatrix} \begin{bmatrix}a_0\\\vdots\\a_{n-1}\end{bmatrix} =\begin{bmatrix}y_1\\\vdots\\y_n\end{bmatrix}}

Die Systemmatrix heißt Vandermonde-Matrix und ist stets invertierbar (wenn alle xkx_k verschieden sind). Das Lösen des Gleichungssystems benötigt etwa n3n^3 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 n1n-1 zu den Stützstellen x1,,xnx_1,\ldots,x_n:

Ln1,k(x):=lkxxlxkxl,k=1,,n.L_{n-1,k}(x):=\prod_{l\neq k}\frac{x-x_l}{x_k-x_l},\quad k=1,\ldots,n.

Offensichtlich gilt

Ln1,k(xl)={1,wenn l=k,0,wenn lk.L_{n-1,k}(x_l)=\begin{cases}1,&\text{wenn }l=k,\\0,&\text{wenn }l\neq k.\end{cases}
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()
<Figure size 640x480 with 1 Axes>

Somit ist

y1Ln1,1(x)++ynLn1,n(x)y_1\,L_{n-1,1}(x)+\cdots+y_n\,L_{n-1,n}(x)

das gesuchte Interpolationspolynom. In dieser Darstellung wird das Interpolationspolynom als Langrange’sches Interpolationspolynom bezeichnet.

Damit ist die Existenz eines interpolierenden Polynoms vom Grad n1n-1 gezeigt. Die Eindeutigkeit folgt leicht aus der Tatsache, dass ein Polynom vom Grad n1n-1 höchstens nn 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:

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 x1,,xnx_1,\ldots,x_n nicht oder nur geringfügig mit Fehlern behaftet. Das die zugehörigen y1,,yny_1,\ldots,y_n jedoch meist aus Messungen entstehen, ist hier mit relevanten Fehlern zu rechnen. Für die praktische Arbeit stehen uns als statt der Punkte (x1,y1),,(xn,yn)(x_1,y_1),\ldots,(x_n,y_n) nur die fehlerbehafteten Punkte (x1,y1~),,(xn,yn~)(x_1,\tilde{y_1}),\ldots,(x_n,\tilde{y_n}) zur Verfügung. Daraus ergeben sich das exakte Interpolationspolynom pp und das auf fehlerhaften Eingaben beruhende Interpolationspolynom p~\tilde{p}.

8.2.4.1Fehlermaße

Als Fehlermaß für die Eingaben wählen wir den relativen Fehler bzgl. der \infty-Norm der Vektoren yy bzw y~\tilde{y}, also

yy~y,\frac{\|y-\tilde{y}\|_\infty}{\|y\|_\infty},

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 f:[a,b]Rf:[a,b]\to\bbR setzen wir

f:=maxx[a,b]f(x)\|f\|_\infty:=\max_{x\in[a,b]}|f(x)|

und drücken den Ausgabefehler mittels

pp~p.\frac{\|p-\tilde{p}\|_\infty}{\|p\|_\infty}.

aus.

8.2.4.2Fehlerabschätzung

Stellen wir pp und p~\tilde{p} als Lagrange’sches Interpolationspolynom dar, also

p(x)=y1Ln1,1(x)++ynLn1,n(x)p(x)=y_1\,L_{n-1,1}(x)+\cdots+y_n\,L_{n-1,n}(x)

und

p~(x)=y~1Ln1,1(x)++y~nLn1,n(x),\tilde{p}(x)=\tilde{y}_1\,L_{n-1,1}(x)+\cdots+\tilde{y}_n\,L_{n-1,n}(x),

so erhalten wir

pp~pκyy~y\frac{\|p-\tilde{p}\|_\infty}{\|p\|_\infty}\leq\kappa\,\frac{\|y-\tilde{y}\|_\infty}{\|y\|_\infty}

mit

κ:=maxx[a,b]k=1nLn1,k(x)\kappa:=\max_{x\in[a,b]}\sum_{k=1}^n|L_{n-1,k}(x)|

(IDVID 620).

Aus der Definition der Langrange’schen Basispolynome Ln1,kL_{n-1,k} sieht man leicht (schauen wir uns hier aber nicht an), dass κ\kappa bei festem nn nicht von der Lage des Intervalls [a,b][a,b] abhängt, sondern nur von der Verteilung der Stützstellen innerhalb des Intervalls. Auch die Werte y1,,yny_1,\ldots,y_n gehen nicht in κ\kappa 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. n3n^3 Rechenopertationen (Gauss-Algorithmus). Auch hat die Vandermonde-Matrix oft schon bei niedrigem zweistelligem nn 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 nn Additionen, liegt also in der Größenordnung von n2n^2 Grundoperationen.

Liegt das Polynom in der Form

p(x)=a0+a1x+a2x2++an2xn2+an1xn1p(x)=a_0+a_1\,x+a_2\,x^2+\cdots+a_{n-2}\,x^{n-2}+a_{n-1}\,x^{n-1}

vor, so kann man die Auswertung an einer Stelle noch beschleunigen, denn offensichtlich gilt

p(x)=a0+x(a1+x(a2++x(an2+xan1)))p(x)=a_0+x\,(a_1+x\,(a_2+\cdots+x\,(a_{n-2}+x\,a_{n-1})\cdots))

Der daraus abgeleitete Algorithmus zur Polynomauswertung heißt Horner-Schema und benötigt nur n1n-1 Multiplikationen und n1n-1 Additionen, liegt also in der Größenordnung nn:

  1. Setze y:=an1y:=a_{n-1}.

  2. Wiederhole für k=n2,,0k=n-2,\ldots,0:

    1. Setze y:=ak+xyy:=a_k+x\,y.

Bei gegebenen a0,,an1a_0,\ldots,a_{n-1} und xx liefert dieser Algorithmus y=p(x)y=p(x).

Das Horner-Schema ist für nicht zu große nn stabil wie man mittels Rückwärtsanalyse zeigen kann (tun wir hier nicht). Insbesondere sind sie Zwischenergebnisse kleiner als beim direkten Auswerten (Potenzen von xx!), 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 pp den Wert p(x)p(x) für ein Stelle xx zu bekommen, verwenden wir den folgenden Zusammenhang zwischen den Interpolationspolynom vom Grad n1n-1 und zwei Interpolationspolynomen vom Grad n2n-2 zu unterschiedlichen Stützpunkten:

Bezeichnen wir mit Pl,kP_{l,k} den Wert des Interpolationspolynoms vom Grad l1l-1 zu den Punkten xk,,xk+l1x_k,\ldots,x_{k+l-1} an einer festen Stelle xx, so erhalten wir den als Aitken-Neville-Schema bekannten Zusammenhang

Pl,k=xk+l1xxk+l1xkPl1,k+xxkxk+l1xkPl1,k+1.P_{l,k}=\frac{x_{k+l-1}-x}{x_{k+l-1}-x_k}\,P_{l-1,k}+\frac{x-x_k}{x_{k+l-1}-x_k}\,P_{l-1,k+1}.

Ausgehend von

P1,k=yk,k=1,,nP_{1,k}=y_k,\quad k=1,\ldots,n

erhalten wir daraus Schritt für Schritt den gesuchten Wert

Pn,1=p(x)P_{n,1}=p(x)

(IDVID 635). Das Aitken-Neville-Schema benötigt etwa n2n^2 Rechenoperationen und lässt sich mit nn Speicherplätzen umsetzen, wenn man nich mehr benötigte Zwischenergebnisse wieder überschreibt:

  1. Setze p1:=y1p_1:=y_1.

  2. Wiederhole für i=2,,ni=2,\ldots,n:

    1. Setze pi:=yip_i:=y_i.

    2. Wiederhole für j=i1,,1j=i-1,\ldots,1:

      1. Setze

        pj:=(xix)pj+(xxj)pj+1xixj.p_j:=\frac{(x_i-x)\,p_j+(x-x_j)\,p_{j+1}}{x_i-x_j}.
  3. Liefere p1p_1 als Ergebnis.

Kann man die Eingaben y1,,yny_1,\ldots,y_n ü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 0,1,,n10,1,\ldots,n-1 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()
<Figure size 640x480 with 1 Axes>

Die Berechnung der Koeffizienten b1,1,,bn,1b_{1,1},\ldots,b_{n,1} benötigt ca. n2n^2 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 xx kann ähnlich zum Horner-Schema in ca. nn Operationen erfolgen, denn es gilt

p(x)=b1,1+(xx1)(b2,1++(xxn2)(bn1,1+(xxn1)bn,1)).p(x)=b_{1,1}+(x-x_1)\,(b_{2,1}+\cdots+(x-x_{n-2})\,(b_{n-1,1}+(x-x_{n-1})\,b_{n,1})\cdots).

Algorithmus zum Auswerten:

  1. Setze P:=bn,1.P:=b_{n,1}.

  2. Wiederhole für l=n1,,1l=n-1,\ldots,1:

    1. Setze P:=bl,1+(xxl)PP:=b_{l,1}+(x-x_l)\,P.

Am Ende des Algorithmus gilt P=p(x)P=p(x).

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 fp\|f-p\|_\infty des Interpolationspolynoms pp zur ursprünglichen Funktion ff 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:

Daraus lassen sich folgende Grundsätze für die Polynominterpolation ableiten:

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:

Aus diesem Ansatz ergeben sich

also insgesamt (m+1)(n1)(m+1)\,(n-1) Bedingungen. Die Anzahl der zu bestimmenden Koeffizienten bei n1n-1 Polynomen vom Grad mm ist ebenfalls (m+1)(n1)(m+1)\,(n-1). 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

f(x)=11+x2f(x)=\frac{1}{1+x^2}

auf dem Intervall [5,5][-5,5] durch einen kubischen Spline approximieren. Wählen die Stützstellen {5,2,0,2,5}\{-5,-2,0,2,5\}, also 4 Teilintervalle. An den äußeren Intervallgrenzen soll die erste Ableitung des Splines der ersten Ableitung der Funktion gleichen.

Die vier Polynome s1s_1, s2s_2, s3s_3, s4s_4, 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()
<Figure size 640x480 with 1 Axes>

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 [a,b][a,b] nach R2\bbR^2 oder R3\bbR^3 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.