градиентная функция numpy и числовые производные

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

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?

Ура

1 ответов


на 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.градиент вы можете сделать что-то вроде этого:

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)