CubicSpline#
- class scipy.interpolate.CubicSpline(x, y, axis=0, bc_type='not-a-knot', extrapolate=None)[Quelle]#
Stückweiser kubischer Interpolator zur Anpassung von Werten (C2-glatt).
Interpoliert Daten mit einem stückweisen kubischen Polynom, das zweimal stetig differenzierbar ist [1]. Das Ergebnis wird als eine
PPoly-Instanz mit Knotenpunkten dargestellt, die den gegebenen Daten entsprechen.- Parameter:
- xarray_like, Form (n,)
1-D-Array mit den Werten der unabhängigen Variable. Werte müssen reell, endlich und in streng aufsteigender Reihenfolge sein.
- yarray_like
Array mit den Werten der abhängigen Variable. Es kann beliebig viele Dimensionen haben, aber die Länge entlang der
axis(siehe unten) muss der Länge vonxentsprechen. Werte müssen endlich sein.- axisint, optional
Achse, entlang der y als variierend angenommen wird. Das bedeutet, dass für
x[i]die entsprechenden Wertenp.take(y, i, axis=axis)sind. Standard ist 0.- bc_typeString oder 2-Tupel, optional
Typ der Randbedingung. Zwei zusätzliche Gleichungen, gegeben durch die Randbedingungen, sind erforderlich, um alle Koeffizienten der Polynome auf jedem Segment zu bestimmen [2].
Wenn bc_type ein String ist, dann wird die angegebene Bedingung an beiden Enden einer Spline angewendet. Verfügbare Bedingungen sind:
‘not-a-knot’ (Standard): Das erste und zweite Segment an einem Kurvenende sind dasselbe Polynom. Dies ist eine gute Standardeinstellung, wenn keine Informationen über Randbedingungen vorliegen.
‘periodic’: Die interpolierte Funktion wird als periodisch mit der Periode
x[-1] - x[0]angenommen. Der erste und letzte Wert von y müssen identisch sein:y[0] == y[-1]. Diese Randbedingung führt zuy'[0] == y'[-1]undy''[0] == y''[-1].‘clamped’: Die erste Ableitung an den Kurvenenden ist Null. Bei einem 1-D y ist
bc_type=((1, 0.0), (1, 0.0))dieselbe Bedingung.‘natural’: Die zweite Ableitung an den Kurvenenden ist Null. Bei einem 1-D y ist
bc_type=((2, 0.0), (2, 0.0))dieselbe Bedingung.
Wenn bc_type ein 2-Tupel ist, werden der erste und der zweite Wert am Anfang bzw. Ende der Kurve angewendet. Die Tupelwerte können einer der zuvor genannten Strings sein (außer ‘periodic’) oder ein Tupel
(order, deriv_values), das die Angabe beliebiger Ableitungen an den Kurvenenden ermöglicht.order: die Ordnung der Ableitung, 1 oder 2.
deriv_value: Array-ähnlich mit den Ableitungswerten, die Form muss dieselbe sein wie bei y, die Achsendimension ausgenommen. Wenn y beispielsweise 1-D ist, muss deriv_value ein Skalar sein. Wenn y 3-D mit der Form (n0, n1, n2) und axis=2 ist, muss deriv_value 2-D sein und die Form (n0, n1) haben.
- extrapolate{bool, ‘periodic’, None}, optional
Wenn bool, bestimmt, ob für Punkte außerhalb des Bereichs basierend auf dem ersten und letzten Intervall extrapoliert wird oder NaNs zurückgegeben werden. Wenn ‘periodic’, wird periodische Extrapolation verwendet. Wenn None (Standard), wird
extrapolatefürbc_type='periodic'auf ‘periodic’ und andernfalls auf True gesetzt.
- Attribute:
- xndarray, Form (n,)
Knotenpunkte. Dieselben
x, die an den Konstruktor übergeben wurden.- cndarray, Form (4, n-1, …)
Koeffizienten der Polynome auf jedem Segment. Die nachgestellten Dimensionen entsprechen den Dimensionen von y, die Achse ausgenommen. Wenn beispielsweise y 1-D ist, ist
c[k, i]ein Koeffizient für(x-x[i])**(3-k)auf dem Segment zwischenx[i]undx[i+1].- axisint
Interpolationsachse. Dieselbe Achse, die an den Konstruktor übergeben wurde.
Methoden
__call__(x[, nu, extrapolate])Evaluiere das stückweise definierte Polynom oder seine Ableitung.
derivative([nu])Erstelle ein neues stückweise definiertes Polynom, das die Ableitung darstellt.
antiderivative([nu])Erstelle ein neues stückweise definiertes Polynom, das die Stammfunktion darstellt.
integrate(a, b[, extrapolate])Berechne ein bestimmtes Integral über ein stückweise definiertes Polynom.
solve([y, discontinuity, extrapolate])Findet reelle Lösungen der Gleichung
pp(x) == y.roots([discontinuity, extrapolate])Reelle Wurzeln des stückweisen Polynoms finden.
Siehe auch
Akima1DInterpolatorAkima 1D-Interpolator.
PchipInterpolatorPCHIP 1D monotoiner kubischer Interpolator.
PPolyStückweises Polynom in Bezug auf Koeffizienten und Knotenpunkte.
Hinweise
Die Parameter bc_type und
extrapolatearbeiten unabhängig voneinander, d.h. ersteres steuert nur den Aufbau einer Spline und letzteres nur die Auswertung.Wenn eine Randbedingung ‘not-a-knot’ ist und n = 2, wird sie durch die Bedingung ersetzt, dass die erste Ableitung gleich der Steigung des linearen Interpolanten ist. Wenn beide Randbedingungen ‘not-a-knot’ und n = 3 sind, wird die Lösung als eine Parabel gesucht, die durch die gegebenen Punkte verläuft.
Wenn die Randbedingung ‘not-a-knot’ an beiden Enden angewendet wird, ist die resultierende Spline dieselbe wie die von
splrep(mits=0) undInterpolatedUnivariateSplinezurückgegebene, aber diese beiden Methoden verwenden eine Darstellung in der B-Spline-Basis.Hinzugefügt in Version 0.18.0.
Referenzen
[1]Kubische Spline-Interpolation auf Wikiversity.
[2]Carl de Boor, „A Practical Guide to Splines“, Springer-Verlag, 1978.
Beispiele
In diesem Beispiel wird die kubische Spline zur Interpolation einer abgetasteten Sinusoidale verwendet. Sie können sehen, dass die Stetigkeitseigenschaft der Spline für die erste und zweite Ableitung gilt und nur für die dritte Ableitung verletzt wird.
>>> import numpy as np >>> from scipy.interpolate import CubicSpline >>> import matplotlib.pyplot as plt >>> x = np.arange(10) >>> y = np.sin(x) >>> cs = CubicSpline(x, y) >>> xs = np.arange(-0.5, 9.6, 0.1) >>> fig, ax = plt.subplots(figsize=(6.5, 4)) >>> ax.plot(x, y, 'o', label='data') >>> ax.plot(xs, np.sin(xs), label='true') >>> ax.plot(xs, cs(xs), label="S") >>> ax.plot(xs, cs(xs, 1), label="S'") >>> ax.plot(xs, cs(xs, 2), label="S''") >>> ax.plot(xs, cs(xs, 3), label="S'''") >>> ax.set_xlim(-0.5, 9.5) >>> ax.legend(loc='lower left', ncol=2) >>> plt.show()
Im zweiten Beispiel wird der Einheitskreis mit einer Spline interpoliert. Es wird eine periodische Randbedingung verwendet. Sie können sehen, dass die Werte der ersten Ableitung, ds/dx=0, ds/dy=1 am periodischen Punkt (1, 0) korrekt berechnet werden. Beachten Sie, dass ein Kreis nicht exakt durch eine kubische Spline dargestellt werden kann. Um die Genauigkeit zu erhöhen, wären mehr Knotenpunkte erforderlich.
>>> theta = 2 * np.pi * np.linspace(0, 1, 5) >>> y = np.c_[np.cos(theta), np.sin(theta)] >>> cs = CubicSpline(theta, y, bc_type='periodic') >>> print("ds/dx={:.1f} ds/dy={:.1f}".format(cs(0, 1)[0], cs(0, 1)[1])) ds/dx=0.0 ds/dy=1.0 >>> xs = 2 * np.pi * np.linspace(0, 1, 100) >>> fig, ax = plt.subplots(figsize=(6.5, 4)) >>> ax.plot(y[:, 0], y[:, 1], 'o', label='data') >>> ax.plot(np.cos(xs), np.sin(xs), label='true') >>> ax.plot(cs(xs)[:, 0], cs(xs)[:, 1], label='spline') >>> ax.axes.set_aspect('equal') >>> ax.legend(loc='center') >>> plt.show()
Das dritte Beispiel ist die Interpolation des Polynoms y = x**3 im Intervall 0 <= x <= 1. Eine kubische Spline kann diese Funktion exakt darstellen. Um dies zu erreichen, müssen wir die Werte und die ersten Ableitungen an den Endpunkten des Intervalls angeben. Beachten Sie, dass y’ = 3 * x**2 und somit y’(0) = 0 und y’(1) = 3.
>>> cs = CubicSpline([0, 1], [0, 1], bc_type=((1, 0), (1, 3))) >>> x = np.linspace(0, 1) >>> np.allclose(x**3, cs(x)) True