Ich versuche, ein Programm zu portieren, das einen handgerollten Interpolator (entwickelt von einem Mathematikerkollegen) verwendet, um die von scipy bereitgestellten Interpolatoren zu verwenden. Ich möchte den Scipy-Interpolator verwenden oder umschließen, damit er dem alten Interpolator so nahe wie möglich kommt.
Ein wesentlicher Unterschied zwischen den beiden Funktionen besteht darin, dass in unserem ursprünglichen Interpolator - wenn der Eingabewert über oder unter dem Eingabebereich liegt, unser ursprünglicher Interpolator das Ergebnis extrapoliert. Wenn Sie dies mit dem Scipy-Interpolator versuchen, wird a ausgelöst ValueError
. Betrachten Sie dieses Programm als Beispiel:
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)
Gibt es eine vernünftige Möglichkeit, dies so zu gestalten, dass die letzte Linie anstelle eines Absturzes einfach eine lineare Extrapolation durchführt und die durch die ersten und letzten beiden Punkte definierten Verläufe bis ins Unendliche fortsetzt.
Beachten Sie, dass ich in der realen Software die exp-Funktion nicht verwende - das dient nur zur Veranschaulichung!
scipy.interpolate.UnivariateSpline
scheint ohne Probleme zu extrapolieren.