2014-09-16 2 views
5

Мне было интересно, есть ли у numpy или scipy метод в своих библиотеках, чтобы найти числовую производную от списка значений с неравномерным интервалом. Идея состоит в том, чтобы подавать метки времени, соответствующие значениям, а затем для использования временных меток для поиска числовой производной.Производящая функция Numpy или SciPy для неравномерного интервала?

ответ

4

Вы можете создать свои собственные функции с помощью numpy. Для производных с использованием вперед различия (редактировать благодаря @EOL, но обратите внимание, что NumPy-х diff() не дифференцируемая функция):

def diff_fwd(x, y): 
    return np.diff(y)/np.diff(x) 

«центральное» различие (это не обязательно центральное, в зависимости от расстояния между данными):

def diff_central(x, y): 
    x0 = x[:-2] 
    x1 = x[1:-1] 
    x2 = x[2:] 
    y0 = y[:-2] 
    y1 = y[1:-1] 
    y2 = y[2:] 
    f = (x2 - x1)/(x2 - x0) 
    return (1-f)*(y2 - y1)/(x2 - x1) + f*(y1 - y0)/(x1 - x0) 

где y содержит функции оценки и x соответствующие «раз», таким образом, что вы можете использовать произвольный интервал.

+0

что такое прямое и центральное различие точно? – user3123955

+0

@ user3123955 [проверьте здесь, например] (http://dmpeli.mcmaster.ca/Matlab/Math4Q3/NumMethods/Lecture3-1.html), чтобы получить обзор этих численных методов –

+1

'y [1:] - y [ : -1] 'обеспечивается более разборчивым' numpy.diff (y) '. – EOL

3

Это, вероятно, не предусмотрено, потому что вместо этого вы можете взять производную от вашей зависимой переменной (значения y), взять производную от вашей независимой переменной (в вашем конкретном случае, временные метки), а затем разделить первый вектор вторым.

Определение производной:

f' = dy/dx 

или в вашем случае:

f'(t) = dy/dt 

Вы можете использовать функцию сравнения для расчета каждого из вашего численного Ау, функция Diff для расчета число dt, а затем элемент делит эти массивы, чтобы определить f '(t) в каждой точке.

2

Это немного поздно, но нашел @ ответ dllahr, чтобы быть очень полезным и легко осуществить с numpy:

>>> import numpy as np 
>>> y = [1, 2, 3, 4, 5] 
>>> dy = np.gradient(y) 
>>> x = [1, 2, 4, 8, 10] 
>>> dx = np.gradient(x) 
>>> dy/dx 
array([1., 0.66666667, 0.33333333, 0.33333333, 0.5]) 
0

SciPy-х UnivariateSpline.derivative простой способ найти производную любого набора данных (х -axis необходимо заказать так, чтобы он увеличивался).

x = [1, 3, 8, 10] 
y = [0, 8, 12, 4] 
z = scipy.interpolate.UnivariateSpline.derivative(x,y) 
dz = z.derivative(n) 

где п есть порядок производной

исх: https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.interpolate.UnivariateSpline.derivative.html

0

С нового выпуска NumPy (1.13), numpy.gradient имеет эту функцию, реализованный (documentation):

>>> #only numpy 1.13 and above 
>>> import numpy as np 
>>> y = [1, 3, 4, 6, 11] 
>>> x = [0, 1, 5, 10, 11] 
>>> np.gradient(y, x) 
array([ 2.  , 1.65  , 0.31666667, 4.23333333, 5.  ]) 

Здесь значения в x обозначают x-координаты значений y в y.

+0

Так что это сильно отличается от его более ранней версии, innt? Например, я использую 1.11.3, и его документ предполагает, что 'np.gradient (y, x)' обрабатывает этот 'x' как delta x, а не координату' y'. Это довольно странная ловушка, если вы не обращаете внимания на версию, тогда результаты полностью и молчат. – Jason

+0

@ Джейсон действительно, я сам [упал на эту ловушку] (https://stackoverflow.com/q/45776214/5099168). Я только проблема для старых версий, запускающих код для новой версии, так как новая версия обратно совместима (afaik). Если x было единственным числом, это угрожало бы ему как delta x. – Neinstein

+0

Я буквально ударил кнопку отправки, чтобы опубликовать новый вопрос (здесь https://stackoverflow.com/q/46701906/2005415) 1 секунду, прежде чем замечать ваш ответ. Я не уверен, должен ли я удалить его или сохранить его? Но это очень неприятная ошибка, я не знаю, что делать, написав мою собственную реализацию? – Jason

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