Как преобразовать функцию IDL SPLINE в Python [особенно для случая, когда у нас есть 3 точки данных] - PullRequest
0 голосов
/ 06 августа 2020

Функция 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?

...