2013-08-28 19 views
10

La matrice restituisce la funzione numpy.gradient in base al numero di punti dati/spaziatura dei punti dati. È questo comportamento previsto? Ad esempio:Funzione gradiente numpy e derivati ​​numerici

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') 

restituisce il grafico ATTACHED.

Solo il gradiente di y (x1) restituisce il risultato corretto. Che cosa sta succedendo qui? C'è un modo migliore per calcolare la derivata numerica usando numpy?

Acclamazioni

risposta

18

In np.gradient si dovrebbe dire la distanza campione. Per ottenere gli stessi risultati, digitare:

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') 

La distanza campione predefinita è 1 ed è per questo che funziona per x1.

Se la distanza non è uniforme, è necessario calcolarlo manualmente. Se si utilizza la differenza in avanti si può fare:

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

Se siete interessati a calcolare la differenza centrale come np.gradient non si potrebbe fare qualcosa di simile:

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

Impressionante, grazie pabaldonedo. Ho visto che nel manuale ma la "distanza di campionamento" era una terminologia sconosciuta per me. Un'ultima domanda: cosa succede se la distanza del campione non è uniforme? Non c'è nulla nel manuale. – user1654183

+0

Se la distanza non è uniforme, è necessario calcolarla manualmente. – pabaldonedo

+2

@ user1654183 Ho modificato la mia risposta per includere una possibile soluzione per il caso in cui la distanza del campione non è uniforme. – pabaldonedo