Estoy intentando portar un programa que usa un interpolador hecho a mano (desarrollado por un colega de matemáticos) para usar los interpoladores proporcionados por scipy. Me gustaría usar o envolver el interpolador scipy para que tenga un comportamiento lo más parecido posible al antiguo interpolador.
Una diferencia clave entre las dos funciones es que en nuestro interpolador original, si el valor de entrada está por encima o por debajo del rango de entrada, nuestro interpolador original extrapolará el resultado. Si intenta esto con el interpolador scipy, genera un ValueError
. Considere este programa como ejemplo:
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)
¿Existe una forma sensata de hacerlo de modo que en lugar de fallar, la línea final simplemente haga una extrapolación lineal, continuando los gradientes definidos por los dos primeros y dos últimos puntos hasta el infinito?
Tenga en cuenta que en el software real no estoy usando la función exp, ¡eso está aquí solo para ilustración!
scipy.interpolate.UnivariateSpline
parece extrapolar sin problemas.