python中数组的派生?

时间:2013-11-18 09:21:09

标签: python arrays numpy derivative

目前我有两个numpy数组:xy大小相同。

我想编写一个函数(如果存在,可能会调用numpy / scipy函数):

def derivative(x, y, n = 1):
    # something
    return result

其中result是一个与x大小相同的numpy数组,其中包含与n相关的y衍生物x的值y (我希望使用{{1}}的几个值来评估导数,以避免出现不平滑的结果。

3 个答案:

答案 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