2013-08-28 11 views
10

Tablica funkcji zwraca numpy.gradient zależy od liczby punktów danych/odstępów punktów danych. Czy to oczekiwane zachowanie? Na przykład:funkcja numpy gradient i pochodne numeryczne

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

zwraca działkę ATTACHED.

Tylko gradient y (x1) zwraca poprawny wynik. Co tu się dzieje? Czy istnieje lepszy sposób obliczania pochodnej numerycznej za pomocą numpy?

Cheers

Odpowiedz

18

W np.gradient należy poinformować dystans próbki. Aby uzyskać takie same wyniki należy wpisać:

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

Domyślna odległość próbka 1, a to dlatego, że pracuje dla x1.

Jeśli odległość nie jest jeszcze konieczna, należy ją obliczyć ręcznie. Jeśli używasz różnicę przodu można zrobić:

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

jeśli jesteś zainteresowany w obliczaniu różnicy jako np.gradient centralny nie mógłby zrobić coś takiego:

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

Awesome, thank you pabaldonedo. Widziałem to w instrukcji, ale "odległość próbki" była dla mnie nieznaną terminologią. Ostatnie pytanie - co, jeśli odległość próbki nie jest równa? W instrukcji nie ma nic. – user1654183

+0

Jeśli odległość nie jest równa, musisz ją obliczyć ręcznie. – pabaldonedo

+2

@ user1654183 Edytowałem swoją odpowiedź, aby uwzględnić możliwe rozwiązanie dla przypadku, gdy odległość próbki nie jest równa. – pabaldonedo