generate_knots#
- scipy.interpolate.generate_knots(x, y, *, w=None, xb=None, xe=None, k=3, s=0, nest=None)[Quelle]#
Generiert Knotenvektoren, bis das Least-Squares (LSQ)-Kriterium erfüllt ist.
- Parameter:
- x, yarray_like
Die Datenpunkte, die die Kurve
y = f(x)definieren.- warray_like, optional
Gewichte.
- xbfloat, optional
Die Grenze des Approximationsintervalls. Wenn None (Standard), wird es auf
x[0]gesetzt.- xefloat, optional
Die Grenze des Approximationsintervalls. Wenn None (Standard), wird es auf
x[-1]gesetzt.- kint, optional
Der Grad der Spline. Standard ist kubisch,
k = 3.- sfloat, optional
Der Glättungsfaktor. Standard ist
s = 0.- nestint, optional
Stoppt, wenn mindestens so viele Knoten platziert sind.
- Erzeugt:
- tndarray
Knotenvektoren mit zunehmender Anzahl von Knoten. Der Generator ist endlich: er stoppt, wenn das Glättungskriterium erfüllt ist oder wenn die Anzahl der Knoten den Maximalwert überschreitet: den vom Benutzer bereitgestellten nest oder x.size + k + 1 – was der Knotenvektor für die interpolierende Spline ist.
Hinweise
Die Routine generiert aufeinanderfolgende Knotenvektoren zunehmender Länge, beginnend bei
2*(k+1)bislen(x) + k + 1, und versucht, die Knoten in den Regionen dichter zu machen, in denen die Abweichung der LSQ-Spline von den Daten groß ist.Wenn die maximale Anzahl von Knoten erreicht ist (
len(x) + k + 1) (dies geschieht, wennsklein undnestgroß ist), stoppt der Generator und die letzte Ausgabe sind die Knoten für die Interpolation mit der Not-a-Knot-Randbedingung.Knoten werden an Datenstellen platziert, es sei denn,
kist gerade und die Anzahl der Knoten istlen(x) + k + 1. In diesem Fall hat die letzte Ausgabe des Generators interne Knoten an Greville-Stellen,(x[1:] + x[:-1]) / 2.Hinzugefügt in Version 1.15.0.
Beispiele
Generiert einige verrauschte Daten und passt eine Sequenz von LSQ-Splines an.
>>> import numpy as np >>> import matplotlib.pyplot as plt >>> from scipy.interpolate import make_lsq_spline, generate_knots >>> rng = np.random.default_rng() >>> x = np.linspace(-3, 3, 50) >>> y = np.exp(-x**2) + 0.1 * rng.standard_normal(size=50)
>>> knots = list(generate_knots(x, y, s=1e-10)) >>> for t in knots[::3]: ... spl = make_lsq_spline(x, y, t) ... xs = xs = np.linspace(-3, 3, 201) ... plt.plot(xs, spl(xs), '-', label=f'n = {len(t)}', lw=3, alpha=0.7) >>> plt.plot(x, y, 'o', label='data') >>> plt.plot(xs, np.exp(-xs**2), '--') >>> plt.legend()
Beachten Sie, dass die Erhöhung der Anzahl von Knoten dazu führt, dass das Ergebnis die Daten immer genauer verfolgt.
Beachten Sie auch, dass ein Schritt des Generators mehrere Knoten hinzufügen kann.
>>> [len(t) for t in knots] [8, 9, 10, 12, 16, 24, 40, 48, 52, 54]