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
Vorausgesetzt ist, dass die Messpunkte sortiert sind, d.h.
für jedes
ist ein Polynom vom Grad auf dem Intervall ist auf -mal stetig differenzierbar
Beispiele:
: Polygonzug : kubische Polynomsplines (B-Splines)
Kubische Splines#
Die in der Praxis häufig eingesetzten kubischen Polynomsplines
ist zweimal stetig differenzierbar auf , also insbesondere an den Stützpunkten der Messpunkte
Die Koeffizienten
aus den
Messpunkten ergeben sich Intervalle, d.h. mit jeweils vier Koeffizienten sind es insgesamt KoeffizientenExakte Darstellung der Messpunkte (
Gleichungen), d.h.:Glattheitsbedingungen an den inneren Messpunkten (
), mit jeweils ( Gleichungen): $ $Damit sind es
Gleichungen für 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.: $
$periodische Splines: die Steigung und Krümung ist an beiden Rändern gleich $
$Hermite Splines: die Steigungen am Rand werden explizit vorgegeben (hier durch
und ) $ $
Anwendung#
Im Folgenden werden zwei Beispiele,
# Erzeugung von Messpunkten
n = 7
xi = np.linspace(0, np.pi, n)
yi = np.sin(xi)
Für die 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();

Die 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();
