3.3.3. Splines#

import numpy as np
np.set_printoptions(precision=2, linewidth=65)

import matplotlib.pyplot as plt
plt.rc('figure', dpi=150)

import seaborn as sns
sns.set()
sns.set_style('ticks')
sns.set_context("notebook", font_scale=1.2, rc={"lines.linewidth": 1.2})

Polynominterpolation versucht eine globale Modellfunktion zu finden. Jedoch eignen sich Polynome mit hohen Graden im Allgemeinen nicht für eine Interpolation vieler Punkte. Einen anderen Ansatz verfolgen Splines. Diese sind Polynomzüge, welche die einzelnen Messpunkte verbinden und deren Grad klein – typischerweise zwischen eins und drei – ist.

Definition#

Für n+1 Messpunkte (xi,yi) kann eine Splinefunktion sk, hier ein Polynomspline, wie folgt definiert werden.

  • Vorausgesetzt ist, dass die Messpunkte sortiert sind, d.h. x0<x1<<xn

  • für jedes i=0n1 ist sk ein Polynom vom Grad k auf dem Intervall [xi,xi+1]

  • sk ist auf [x0,xn] (k1)-mal stetig differenzierbar

Beispiele:

  • k=1: Polygonzug

  • k=3: kubische Polynomsplines (B-Splines)

Kubische Splines#

Die in der Praxis häufig eingesetzten kubischen Polynomsplines s3 (k=3) haben folgende Eigenschaften:

  • s3|[xi,xi+1]=β0+β1x+β2x2+β3x3

  • s3 ist zweimal stetig differenzierbar auf [x0,xn], also insbesondere an den Stützpunkten xi der Messpunkte

Die Koeffizienten βi werden wie folgt bestimmt

  • aus den n+1 Messpunkten ergeben sich n Intervalle, d.h. mit jeweils vier Koeffizienten sind es insgesamt 4n Koeffizienten

  • Exakte Darstellung der Messpunkte (n+1 Gleichungen), d.h.: s3(xi)=yi

  • Glattheitsbedingungen an den inneren Messpunkten (i=1n1), mit jeweils (n1 Gleichungen): $s3(xi)=s3(xi)+s3(xi)=s3(xi)+s3(xi)=s3(xi)+$

  • Damit sind es 4n2 Gleichungen für 4n Koeffizienten

Um die beiden fehlenden Gleichungen zu finden bzw. zu bestimmen werden Randbedingungen oder Abschlussbedingungen benötigt. Die gängigsten Bedingungen sind:

  • natürliche Splines: die Krümung am Rand verschwindet, d.h.: $s3(x0)=s3(xn)=0$

  • periodische Splines: die Steigung und Krümung ist an beiden Rändern gleich $s3(x0)=s3(xn)s3(x0)=s3(xn)$

  • Hermite Splines: die Steigungen am Rand werden explizit vorgegeben (hier durch u und v) $s3(x0)=us3(xn)=v$

Anwendung#

Im Folgenden werden zwei Beispiele, s1 und s3, für die Erstellung von Splines mit Python vorgestellt.

# Erzeugung von Messpunkten
n = 7
xi = np.linspace(0, np.pi, n)
yi = np.sin(xi)

Für die s1 Splines, kann die Funktion np.interp verwendet werden. Sie führt eine lineare Interpolation zwischen gegebenen Wertepaaren durch.

# Wertebereich für die Visualisierung der Interpolation
x = np.linspace(0, np.pi, n*6)
y = np.sin(x)
# Interpolation
y_s1 = np.interp(x, xi, yi)
plt.plot(x,y, alpha=0.3, color='C2', lw=5, 
         label='Generierende Funktion')
plt.plot(x, y_s1, color='C0', label='Interpolation')
plt.scatter(x, y_s1, s=3, zorder=3, color='C0')
plt.scatter(xi, yi, color='C1', label='Messpunkte')

plt.xlabel('x')
plt.ylabel('y')
plt.legend();
../../../_images/983f821d787c14ddd68bf60661985b5791c34456e6370b43b6a56fb74d27698b.png

Die s3 Splines können mit Funktionen aus dem scipy-Modul berechnet werden. Dazu werden zunächst die Koeffizienten bestimmt (scipy.interpolate.splrep) und diese ermöglichen die gewünschte Auswertung, welche mit der Funktion scipy.interpolate.splev vorgenommen werden kann.

import scipy.interpolate as si
s3 = si.splrep(xi, yi)
y_s3 = si.splev(x, s3)
plt.plot(x,y, alpha=0.3, color='C2', lw=5, 
         label='Generierende Funktion')
plt.plot(x, y_s3, color='C0', label='Interpolation')
plt.scatter(x, y_s3, s=3, zorder=3, color='C0')
plt.scatter(xi, yi, color='C1', label='Messpunkte')

plt.xlabel('x')
plt.ylabel('y')
plt.legend();
../../../_images/f09fb6561370311cf65676f71cf48344752958c5878ebe1c8dfefa927d01b056.png