Сплайн-интерполяция

У меня возникли трудности с выполнением сплайн-интерполяции для приведенного ниже набора:

import numpy
SOURCE = numpy.array([[1,2,3],[3,4,5], [9,10,11]])
from scipy.interpolate import griddata
from scipy.interpolate import interp1d
input = [0.5,2,3,6,9,15]

Линейная интерполяция работает нормально, но когда я заменяю линейную на кубическую, у меня возникает ошибка:

f = interp1d(SOURCE[:,0], SOURCE[:,1:], kind="linear", axis=0, bounds_error=False)
f(input)

f = interp1d(SOURCE[:,0], SOURCE[:,1:], kind="cubic", axis=0, bounds_error=False)
ValueError: The number of derivatives at boundaries does not match: expected 1, got 0+0

Как я могу выполнить эту кубическую интерполяцию?


person Nielsou Akbrg    schedule 03.05.2020    source источник
comment
В некоторых интерполяторах это связано с аргументом order.   -  person HashRocketSyntax    schedule 23.04.2021


Ответы (1)


Ваши SOURCE данные слишком короткие. Для кубического сплайна требуется как минимум четыре точки для интерполяции, но вы предоставляете только три. Если вы добавите еще одно значение к SOURCE, оно должно работать более или менее так, как ожидалось:

>>> SOURCE = numpy.array([[1,2,3],[3,4,5], [9,10,11], [12,13,14]])  # added an extra value
>>> f = interp1d(SOURCE[:,0], SOURCE[:,1:], kind="cubic", axis=0, bounds_error=False)
>>> f(input)
array([[nan, nan],
       [ 3.,  4.],
       [ 4.,  5.],
       [ 7.,  8.],
       [10., 11.],
       [nan, nan]])
person Blckknght    schedule 03.05.2020
comment
спасибо, я действительно добавил немного больше данных, это очевидно, так как нужно аппроксимировать разницу для каждой точки... также знаете ли вы, есть ли возможность указать значение производной для экстраполяции (либо 0, либо [ f (x1) - f(x0) ] / [x1 - x0] для обычных или зажатых сплайнов ? - person Nielsou Akbrg; 03.05.2020