2013-08-28 10 views
10

Das Array, das die numpy.gradient-Funktion zurückgibt, hängt von der Anzahl der Datenpunkte/Abstände der Datenpunkte ab. Ist das erwartetes Verhalten? Zum Beispiel:numpy Gradientenfunktion und numerische Ableitungen

y = lambda x: x 

x1 = np.arange(0,10,1) 
x2 = np.arange(0,10,0.1) 
x3 = np.arange(0,10,0.01) 

plt.plot(x1,np.gradient(y(x1)),'r--o') 
plt.plot(x2,np.gradient(y(x2)),'b--o') 
plt.plot(x3,np.gradient(y(x3)),'g--o') 

gibt die ATTACHED Handlung zurück.

Nur der Gradient von y (x1) gibt das korrekte Ergebnis zurück. Was geht hier vor sich? Gibt es eine bessere Möglichkeit, die numerische Ableitung mit numpy zu berechnen?

Prost

Antwort

18

In np.gradient Sie dem Beispiel Abstand sagen sollten. Um die gleichen Ergebnisse zu erzielen sollten Sie Folgendes eingeben:

plt.plot(x1,np.gradient(y(x1),1),'r--o') 
plt.plot(x2,np.gradient(y(x2),0.1),'b--o') 
plt.plot(x3,np.gradient(y(x3),0.01),'g--o') 

Der Standardprobenabstand 1 und deshalb ist es für x1 arbeitet.

Wenn die Entfernung nicht gleich ist, müssen Sie sie manuell berechnen. Wenn Sie die Vorwärts-Differenz können Sie tun:

d = np.diff(y(x))/np.diff(x) 

Wenn Sie bei der Berechnung der zentralen Differenz als np.gradient Interesse hat man so etwas tun könnte:

x = np.array([1, 2, 4, 7, 11, 16], dtype=np.float) 
y = lambda x: x**2 

z1 = np.hstack((y(x[0]), y(x[:-1]))) 
z2 = np.hstack((y(x[1:]), y(x[-1]))) 

dx1 = np.hstack((0, np.diff(x))) 
dx2 = np.hstack((np.diff(x), 0)) 

d = (z2-z1)/(dx2+dx1) 
+1

Ehrfürchtig, danke pabaldonedo. Ich habe gesehen, dass im Handbuch, aber "Probenabstand" mir eine ungewohnte Terminologie war. Eine letzte Frage - was ist, wenn die Probenentfernung nicht gleichmäßig ist? Es gibt nichts im Handbuch. – user1654183

+0

Wenn die Entfernung nicht gleich ist, müssen Sie sie manuell berechnen. – pabaldonedo

+2

@ user1654183 Ich habe meine Antwort bearbeitet, um eine mögliche Lösung für den Fall aufzunehmen, wenn die Probenentfernung nicht gleichmäßig ist. – pabaldonedo