2014-09-16 9 views
5

Ich frage mich, ob numpy oder scipy eine Methode in ihren Bibliotheken hatte, um die numerische Ableitung einer Liste von Werten mit ungleichmäßigen Abständen zu finden. Die Idee besteht darin, die Zeitstempel einzufügen, die den Werten entsprechen, und dann die Zeitstempel zu verwenden, um die numerische Ableitung zu finden.Numpy oder SciPy Derivative Funktion für ungleichmäßigen Abstand?

Antwort

4

Sie können Ihre eigenen Funktionen mit numpy erstellen. Für die Derivate Vorwärts-Differenzen mit (edit dank @EOL, aber beachten Sie, dass NumPy der diff() keine differenzierbare Funktion ist):

def diff_fwd(x, y): 
    return np.diff(y)/np.diff(x) 

„zentrale“ Unterschiede (es ist nicht unbedingt zentral ist, je nach Daten Abstand):

def diff_central(x, y): 
    x0 = x[:-2] 
    x1 = x[1:-1] 
    x2 = x[2:] 
    y0 = y[:-2] 
    y1 = y[1:-1] 
    y2 = y[2:] 
    f = (x2 - x1)/(x2 - x0) 
    return (1-f)*(y2 - y1)/(x2 - x1) + f*(y1 - y0)/(x1 - x0) 

wo y die Funktionsauswertungen und x die entsprechenden „Zeiten“ enthält, so dass man ein willkürliches Intervall verwenden.

+0

was genau ist ein Vorwärts- und Zentraldifferenz? – user3123955

+0

@ user3123955 [here hier zum Beispiel] (http://dmpeli.mcmaster.ca/Matlab/Math4Q3/NumMethods/Lecture3-1.html), um einen Überblick über diese numerischen Methoden zu haben –

+1

'y [1:] - y [ : -1] 'wird von der direkter lesbaren' numpy.diff (y) 'bereitgestellt. – EOL

3

Dies wird wahrscheinlich nicht zur Verfügung gestellt, da Sie stattdessen die Ableitung Ihrer abhängigen Variablen (y-Werte) verwenden, die Ableitung Ihrer unabhängigen Variablen (in Ihrem speziellen Fall die Zeitstempel) nehmen und dann die Division der Division vornehmen können erster Vektor nach Sekunde.

Die Definition des Derivats:

f' = dy/dx 

oder in Ihrem Fall:

f'(t) = dy/dt 

Sie können die diff Funktion jedes Ihrer numerischen dy berechnen, um die diff Funktion berechnen Sie Ihre numerisches dt, und dann Element teilen diese Felder, um f '(t) an jedem Punkt zu bestimmen.

2

Dies ist ein wenig spät, aber @ dllahr Antwort gefunden als sehr nützlich und leicht zu implementieren mit numpy:

>>> import numpy as np 
>>> y = [1, 2, 3, 4, 5] 
>>> dy = np.gradient(y) 
>>> x = [1, 2, 4, 8, 10] 
>>> dx = np.gradient(x) 
>>> dy/dx 
array([1., 0.66666667, 0.33333333, 0.33333333, 0.5]) 
0

Seit neuestem NumPy Release (1.13), numpy.gradient hat diese Funktion implementiert (documentation):

>>> #only numpy 1.13 and above 
>>> import numpy as np 
>>> y = [1, 3, 4, 6, 11] 
>>> x = [0, 1, 5, 10, 11] 
>>> np.gradient(y, x) 
array([ 2.  , 1.65  , 0.31666667, 4.23333333, 5.  ]) 

Hier markieren die Werte in x die x-Koordinaten der y-Werte in y.

+0

Das ist also ganz anders als in seiner früheren Version, innt? Zum Beispiel verwende ich 1.11.3 und sein Dokument schlägt vor, dass "np.gradient (y, x)" dieses "x" als Delta x und nicht als Koordinate von "y" behandelt. Das ist eher eine gefährliche Falle, wenn Sie nicht auf die Version achten, dann sind die Ergebnisse total und lautlos falsch. – Jason

+0

@Jason in der Tat, ich selbst [fiel für diese Falle] (https://stackoverflow.com/q/45776214/5099168). Ich bin nur ein Problem für ältere Versionen, die Code für die neue Version ausführen, da die neue Version abwärtskompatibel ist (afaik). Wenn x eine einzelne Zahl wäre, würde es als delta x droht. – Neinstein

+0

Ich traf buchstäblich den Absenden-Button, um eine neue Frage (hier https://stackoverflow.com/q/46701906/2005415) eine Sekunde vor Ihrer Antwort zu posten. Ich bin mir nicht sicher, sollte ich es löschen oder behalten? Aber es ist ein sehr böser Bug, ich weiß nicht was ich tun soll, schreibe meine eigene Implementierung? – Jason