我想知道numpy或scipy库中是否有一种方法可以找到具有非均匀间距的值列表的数值导数。这个想法是将对应于这些值的时间戳输入进去,然后使用时间戳来找到数值导数。
我想知道numpy或scipy库中是否有一种方法可以找到具有非均匀间距的值列表的数值导数。这个想法是将对应于这些值的时间戳输入进去,然后使用时间戳来找到数值导数。
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
对应于“时间”,这样您就可以使用任意区间。
这有点晚了,但我发现 @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])
这可能没有提供是因为您可以通过对因变量(y值)和自变量(在您的特定情况下,时间戳)进行求导,然后将第一个向量除以第二个向量来代替。
求导数的定义是:
f' = dy / dx
f'(t) = dy / dt
UnivariateSpline.derivative
是查找任何数据集的导数的简单方法(x轴必须按升序排列)。x = [1, 3, 8, 10]
y = [0, 8, 12, 4]
z = scipy.interpolate.UnivariateSpline.derivative(x,y)
dz = z.derivative(n)
其中n为导数的阶数
请注意,UnivariateSpline的默认阶数为3,相当于scipy.interpolate.CubicSpline
自从最新的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
中的值标记了y
中y值的x坐标。np.gradient(y, x)
将此x
视为delta x,而不是y
的坐标。如果您没有注意版本,则这是一个非常危险的陷阱,结果将完全且无声地错误。 - Jason
numpy.diff(y)
可以提供类似于y[1:] - y[:-1]
的效果。 - Eric O. Lebigotdiff()
不代表“微分”,而是代表“差异”。顺便说一句,中心差异在NumPy中已经存在:numpy.gradient()
(http://docs.scipy.org/doc/numpy/reference/generated/numpy.gradient.html#numpy.gradient)。:) - Eric O. Lebigot