基于链式规则的NumPy有限差分优化

aiqt4smr  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(71)

请考虑以下代码:

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)时,我们实际上是在为每个内部点执行插值,而不是真正的中心差分。

g2ieeal7

g2ieeal71#

不,我不希望grad1等于grad2,因为间距不均匀。具有非均匀间距的一阶导数的二阶中心差分方程如np.gradient文档所示。当你没有指定间距时,numpy会假设一个恒定的间距(正如你所说的),并使用与该假设一致的简化公式,即。f' = (f[1:] - f[:-1])/(2h)(忽略端点)。当您尝试像前面那样执行导数时,最终得到f' = (f[1:] - f[:-1])/(x[1:] - x[:-1])(再次忽略端点)。这不等同于非均匀方程,因为权重不正确。因此,你的结果是错误的。

相关问题