Próbuję przenieść program, który używa ręcznie obracanego interpolatora (opracowanego przez kolegę matematyka), aby używał interpolatorów dostarczonych przez scipy. Chciałbym użyć lub owinąć interpolator scipy, aby zachowywał się jak najbliżej starego interpolatora.
Kluczową różnicą między tymi dwiema funkcjami jest to, że w naszym oryginalnym interpolatorze - jeśli wartość wejściowa jest powyżej lub poniżej zakresu wejściowego, nasz oryginalny interpolator ekstrapoluje wynik. Jeśli spróbujesz tego z interpolatorem scipy, podniesie się ValueError
. Rozważmy ten program jako przykład:
import numpy as np
from scipy import interpolate
x = np.arange(0,10)
y = np.exp(-x/3.0)
f = interpolate.interp1d(x, y)
print f(9)
print f(11) # Causes ValueError, because it's greater than max(x)
Czy istnieje rozsądny sposób, aby to zrobić, aby zamiast się rozbijać, ostatnia linia po prostu wykona liniową ekstrapolację, kontynuując gradienty zdefiniowane przez pierwszy i ostatni dwa punkty do nieskończoności.
Zauważ, że w prawdziwym oprogramowaniu tak naprawdę nie używam funkcji exp - to jest tutaj tylko dla ilustracji!
scipy.interpolate.UnivariateSpline
wydaje się ekstrapolować bez problemów.