from_spline#
- метод класса CubicHermiteSpline.from_spline(tck, экстраполяция=None)[источник]#
Построение кусочно-полиномиальной функции из сплайна
- Параметры:
- tck
Сплайн, возвращаемый
splrepили объект BSpline.- экстраполяцияbool или 'periodic', опционально
Если bool, определяет, следует ли экстраполировать на точки вне границ на основе первого и последнего интервалов или возвращать NaN. Если 'periodic', используется периодическая экстраполяция. По умолчанию True.
Примеры
Построить интерполирующий сплайн и преобразовать его в
PPolyэкземпляр>>> import numpy as np >>> from scipy.interpolate import splrep, PPoly >>> x = np.linspace(0, 1, 11) >>> y = np.sin(2*np.pi*x) >>> tck = splrep(x, y, s=0) >>> p = PPoly.from_spline(tck) >>> isinstance(p, PPoly) True
Обратите внимание, что эта функция изначально поддерживает только 1D сплайны.
Если
tckобъект представляет параметрический сплайн (например, построенный с помощьюsplprepилиBSplineсc.ndim > 1), вам потребуется вручную перебирать измерения.>>> from scipy.interpolate import splprep, splev >>> t = np.linspace(0, 1, 11) >>> x = np.sin(2*np.pi*t) >>> y = np.cos(2*np.pi*t) >>> (t, c, k), u = splprep([x, y], s=0)
Обратите внимание, что
cэто список из двух массивов длиной 11.>>> unew = np.arange(0, 1.01, 0.01) >>> out = splev(unew, (t, c, k))
Чтобы преобразовать этот сплайн в степенной базис, мы преобразуем каждый компонент списка коэффициентов b-сплайна,
c, в соответствующий кубический полином.>>> polys = [PPoly.from_spline((t, cj, k)) for cj in c] >>> polys[0].c.shape (4, 14)
Обратите внимание, что коэффициенты полиномов polys находятся в степенном базисе, и их размерности отражают именно это: здесь 4 — порядок (степень+1), а 14 — количество интервалов, что является длиной массива узлов исходного tck минус один.
При необходимости мы можем объединить компоненты в единый
PPolyвдоль третьего измерения:>>> cc = np.dstack([p.c for p in polys]) # has shape = (4, 14, 2) >>> poly = PPoly(cc, polys[0].x) >>> np.allclose(poly(unew).T, # note the transpose to match `splev` ... out, atol=1e-15) True