考虑以下代码:
x = np.array([1, 5, 6, 10]) # an unstructured coordinate
f = x**2 # function value on the points x
grad1 = np.gradient(f, x) # df/dx
grad2 = np.gradient(f) / np.gradient(x) # df/di * di/dx = df/dx
我本以为,根据链式法则,
grad1=grad2
。上面评论中的i
只是一个统一的“索引”经过测试,这个等式对于简单的线性函数是正确的,但对于例如x**2
如上图。我现在想知道是否存在理论上的原因为什么链式法则对于由有限差分估计的导数通常不成立。
我认为问题在于以下观察: 一般来说,
np.gradient
并不假设输入坐标 x
是统一的。但我认为链式法则的这种表达确实如此,我怀疑这隐含在调用np.gradient(x)
中。当我们用非均匀 np.gradient(f, x)
调用 x
时,我们实际上是在对每个内部点执行插值,而不是真正的中心差异...
不,对于非均匀间距,我不希望
grad1
等于 grad2
。具有非均匀间距的一阶导数的二阶中心差分方程显示在 np.gradient
文档中。当您不指定间距时,numpy 假定恒定间距(如您所说)并使用与该假设相匹配的简化公式,即 f' = (f[1:] - f[:-1])/(2h)
(忽略端点)。当您尝试像您所做的那样执行导数时,您最终会得到f' = (f[1:] -f[:-1])/(x[1:] - x[:-1])
(再次忽略端点)。这不等于非均匀方程,因为权重不正确。因此,你的结果是错误的。