Функция SPLINE в IDL допускает кубическую c интерполяцию данных (как минимум с 3 точками данных). Хотя библиотека Scipy в Python может выполнять аналогичные вычисления с функциями UnivariateSpline и splrep , они прерываются, если для интерполяций заданы кубические c единицы, а у нас всего 3 точки данных ( то, что не происходит со SPLINE ).
Это простой пример того, что SPLINE делает в IDL:
> x = [2., 3., 4.]
> y = (x-3)^2
> t = FINDGEN(20)/10.+2
> z = SPLINE(x, y, t)
> print, z
1.00000 0.810662 0.642087 0.493590 0.364684 0.255081 0.164684 0.0935898 0.0420876 0.0106618 0.00000 0.0106618 0.0420876 0.0935898 0.164684 0.255081 0.364684 0.493590 0.642087 0.810662
Но если я попробую чтобы сделать это в Python с from scipy.interpolate import splrep, splev
x = np.array([2., 3., 4.])
y = (x-3)**2
t = np.arange(20)/10.+2
z = splev(t, splrep(x, y, k = 3))
или с from scipy.interpolate import UnivariateSpline
x = np.array([2., 3., 4.])
y = (x-3)**2
t = np.arange(20)/10.+2
z = UnivariateSpline(x, y, k = 3)(t)
Я всегда получаю это сообщение об ошибке:
TypeError: m > k must hold
Это я понимаю, поскольку не может быть единственного полиномиального решения с k-степенью, когда нам нужно уместить m точек данных, если m ≤ k. Но тогда возникает вопрос ... Как SPLINE в IDL выполняет эти вычисления? И как я могу воспроизвести его в Python?
Я могу попробовать понизить полином до k = 2 (квадратичная c интерполяция), например,
z = splev(t, splrep(x, y, k = 2))
или
z = UnivariateSpline(x, y, k = 2)(t)
И я получу в обоих случаях:
> print(z)
[1. 0.81 0.64 0.49 0.36 0.25 0.16 0.09 0.04 0.01 0. 0.01 0.04 0.09 0.16 0.25 0.36 0.49 0.64 0.81]
Что, безусловно, похоже на вывод в IDL, если мы не проигнорируем все, что ниже второго десятичного знака.
Как я могу выполнить те же вычисления, что и SPLINE в Python, даже если k = m, как SPLINE?