目前我有两个numpy数组:x
和y
大小相同。
我想编写一个函数(如果存在,可能会调用numpy / scipy函数):
def derivative(x, y, n = 1):
# something
return result
其中result
是一个与x
大小相同的numpy数组,其中包含与n
相关的y
衍生物x
的值y
(我希望使用{{1}}的几个值来评估导数,以避免出现不平滑的结果。
答案 0 :(得分:6)
这不是一个简单的问题,但是已经设计了很多方法来处理它。一个简单的解决方案是使用finite difference方法。命令`numpy.diff'使用有限差分,您可以在其中指定导数的顺序。维基百科还有一个页面,列出了不同精度的不同衍生物所需的finite differencing coefficients。如果numpy函数不能达到你想要的效果。
根据您的应用程序,您还可以使用scipy.fftpack.diff使用completely different technique执行相同的操作。虽然你的功能需要一个明确定义的傅里叶变换。
在上述两个想法中,有很多很多变量(例如summation by parts有限差分算子或运算符,旨在保留方程组中已知的演化常数)。你应该做的将在很大程度上取决于你试图解决的问题。
好消息是,该领域已经做了很多工作。 Numerical Differentiation的维基百科页面有一些资源(尽管它专注于有限差分技术)。
答案 1 :(得分:1)
findiff project是一个Python包,它可以按任何所需的精度顺序(当然,取决于您的硬件限制)对任何维度的数组进行衍生。它可以处理均匀网格和非均匀网格上的数组,并且还可以创建导数的推广,即具有常数和可变系数的偏导数的一般线性组合。
答案 2 :(得分:0)
这样可以解决您的问题吗?
def get_inflection_points(arr, n=1):
"""
returns inflextion points from array
arr: array
n: n-th discrete difference
"""
inflections = []
dx = 0
for i, x in enumerate(np.diff(arr, n)):
if x >= dx and i > 0:
inflections.append(i*n)
dx = x
return inflections