Python中数组的导数?

6

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

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

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

其中result是一个与x大小相同的numpy数组,包含y关于xn阶导数的值(我希望使用多个y的值来计算导数,以避免非平滑结果)。


2
可能的解决方案:https://dev59.com/bWMk5IYBdhLWcg3wxAlM#18993405 - unutbu
当y数据不规则分布(两个连续点之间的dx不是常数)时,如何使用高斯滤波器? - Vincent
这篇文章提供了计算等距网格有限差分所需的系数。该文章链接到 Bengt Fornberg 的一篇论文,展示了如何计算任意间距网格的系数。这是该PDF的链接。 - unutbu
如果您知道您的数据可以由某些函数建模,则可以通过将数据拟合到该函数来更好地处理。如果函数是可微的,则可以解析地计算导数。如果它不可微,则可以在定期间隔的网格上对函数进行采样,计算有限差分,并插值以找到不规则网格点处导数的近似值。 - unutbu
3个回答

6
这不是一个简单的问题,但已经有很多方法被设计来处理它。一个简单的解决方案是使用有限差分方法。命令numpy.diff()使用有限差分,您可以指定导数的阶数。
维基百科还有一个页面,列出了不同精度的不同导数所需的有限差分系数。如果numpy函数不能满足您的要求。
根据您的应用程序,您还可以使用scipy.fftpack.diff,它使用完全不同的技术来完成相同的事情。虽然您的函数需要定义良好的傅里叶变换。
有很多变体(例如分部求和, 有限差分算子或为保留系统方程中已知演化常数而设计的算子)都基于以上两种思路。你需要根据具体问题来决定选择哪种方法。
好消息是,在这个领域已经有了很多研究成果。数值微分的维基百科页面提供了一些资源(虽然它主要集中在有限差分技术上)。

scipy.fftpack.diff 看起来非常有用。但是,如果我有一个在时间网格 tgrid 上给定为数组 ampl 的函数,我发现(通过试错)我必须执行 T = tgrid[-1] - tgrid[0]; deriv = scipy.fftpack.diff(ampl) * (2.0*pi / T)。我想也许可以通过将正确的 period 传递给 diff 函数来实现相同的效果,但我无法找到正确的值。是否有这种用例的示例? - Michael Goerz

1

findiff 项目是一个Python包,可以对任意维度的数组进行任意精度阶数的导数运算(当然取决于您的硬件限制)。它可以处理均匀和非均匀网格上的数组,并创建导数的广义形式,即具有常数和变量系数的部分导数的一般线性组合。


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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接