2013-08-28 4 views
10

Массив, возвращаемый функцией numpy.gradient, зависит от количества точек данных/интервалов точек данных. Это ожидаемое поведение? Например:Функция градиента numpy и числовые производные

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

возвращает ATTACHED участок.

Только градиент y (x1) возвращает правильный результат. Что здесь происходит? Есть ли лучший способ вычислить числовую производную с помощью numpy?

Приветствия

ответ

18

В np.gradient вы должны сказать расстояние образца. Для того, чтобы получить те же результаты, которые вы должны ввести:

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

расстояние выборки по умолчанию 1, и именно поэтому она работает на x1.

Если расстояние даже не нужно его вычислять вручную. Если вы используете вперед разницу вы можете сделать:

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

Если вы заинтересованы в вычислении центральной разности в np.gradient ли вы могли бы сделать что-то вроде этого:

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, спасибо pabaldonedo. Я видел, что в руководстве, но «выборка расстояния» была для меня незнакомой терминологией. Один последний вопрос - что, если расстояние выборки не равно? В руководстве нет ничего. – user1654183

+0

Если расстояние даже не нужно вычислять вручную. – pabaldonedo

+2

@ user1654183 Я отредактировал свой ответ, чтобы включить возможное решение для случая, когда расстояние выборки не равно. – pabaldonedo

Смежные вопросы