首页 > 解决方案 > 非均匀间距,带有 numpy.gradient 的多元导数

问题描述

所以我试图使用 numpy.gradient 得到以下公式的二阶导数,我试图用 S[:,0] 区分它一次,然后用 S[:,1]

S = np.random.multivariate_normal(mean, covariance, N)
formula = (S[:,0]**2) * (S[:,1]**2)

但问题是当我使用间距作为 numpy.gradient 的第二个参数时

dx = np.diff(S[:,0])
dy = np.diff(S[:,1])
dfdx = np.gradient(formula,dx)

我收到错误消息

ValueError: when 1d, distances must match the length of the corresponding dimension

我明白这是因为间距向量长度比公式少一个元素,但我不知道该怎么做才能解决这个问题。我在某处也读到过,您可以将点的坐标而不是间距作为第二个参数,但是当我尝试通过将公式与 S[:,0] 和 S[ 进行微分来检查结果时: ,1],然后尝试通过 S[:,0] 再通过 S[:,1] 来区分它,并比较两个结果,应该是相似的;这两个结果之间存在巨大差异。

谁能向我解释我在这里做错了什么?

标签: pythonnumpygradient

解决方案


当使用 Numpy's 引入函数值的坐标向量时gradient,您必须小心地将其作为具有与函数维度一样多的数组的列表引入,或者指定gradient您想要的轴(作为 的参数)计算梯度。
当您检查两种微分方式时,我认为问题在于您的公式实际上不是二维的,而是一维的(即使您使用来自两个变量的数据,请注意您的f数组只有一维)。

看一下这个小脚本,我们在其中验证了微分顺序确实不会改变结果(假设您的函数表现良好)。

import numpy as np
# Dummy arrays and function 
x = np.linspace(0,1,50)
y = np.linspace(0,2,50)
f = np.sin(2*np.pi*x[:,None]) * np.cos(2*np.pi*y)

dfdx  = np.gradient(f, x, axis = 0)
df2dy = np.gradient(dfdx, y, axis = 1)

dfdy  = np.gradient(f, y, axis = 1)
df2dx = np.gradient(dfdy, x, axis = 0)

# Check how many values are essentially different
print(np.sum(~np.isclose(df2dx, df2dy)))

这适用于您的问题吗?


推荐阅读