请考虑以下代码:
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)
中。当我们用非均匀x
调用np.gradient(f, x)
时,我们实际上是在为每个内部点执行插值,而不是真正的中心差分。
1条答案
按热度按时间g2ieeal71#
不,我不希望
grad1
等于grad2
,因为间距不均匀。具有非均匀间距的一阶导数的二阶中心差分方程如np.gradient
文档所示。当你没有指定间距时,numpy会假设一个恒定的间距(正如你所说的),并使用与该假设一致的简化公式,即。f' = (f[1:] - f[:-1])/(2h)
(忽略端点)。当您尝试像前面那样执行导数时,最终得到f' = (f[1:] - f[:-1])/(x[1:] - x[:-1])
(再次忽略端点)。这不等同于非均匀方程,因为权重不正确。因此,你的结果是错误的。