您需要为渐变提供一个矩阵,该矩阵描述(x,y)点的角频率值.例如
def f(x,y):
return np.sin((x + y))
x = y = np.arange(-5, 5, 0.05)
X, Y = np.meshgrid(x, y)
zs = np.array([f(x,y) for x,y in zip(np.ravel(X), np.ravel(Y))])
Z = zs.reshape(X.shape)
gx,gy = np.gradient(Z,0.05,0.05)
您可以看到将Z绘制为曲面给出:
以下是解释渐变的方法:
gx是一个矩阵,可以在所有点上给出变化dz / dx.例如gx [0] [0]是(x0,y0)处的dz / dx.可视化gx有助于理解:
由于我的数据是从f(x,y)= sin(x y)生成的,因此gy看起来相同.
这是一个使用f(x,y)= sin(x)的更明显的例子……
F(X,Y)
和渐变
更新让我们来看看xy对.
这是我使用的代码:
def f(x,y):
return np.sin(x)
x = y = np.arange(-3,3,.05)
X, Y = np.meshgrid(x, y)
zs = np.array([f(x,y) for x,y in zip(np.ravel(X), np.ravel(Y))])
xy_pairs = np.array([str(x)+','+str(y) for x,y in zip(np.ravel(X), np.ravel(Y))])
Z = zs.reshape(X.shape)
xy_pairs = xy_pairs.reshape(X.shape)
gy,gx = np.gradient(Z,.05,.05)
现在我们可以查看并确切了解发生了什么.假设我们想知道与Z [20] [30]的值有什么联系?然后…
>>> Z[20][30]
-0.99749498660405478
关键是
>>> xy_pairs[20][30]
'-1.5,-2.0'
是对的吗?让我们检查.
>>> np.sin(-1.5)
-0.99749498660405445
是.
那时我们的梯度组件是什么?
>>> gy[20][30]
0.0
>>> gx[20][30]
0.070707731517679617
退房吗?
dz / dy总是0检查.
dz / dx = cos(x)和…
>>> np.cos(-1.5)
0.070737201667702906
看起来不错.
您会注意到它们并不完全正确,这是因为我的Z数据不连续,步长为0.05,渐变只能接近变化率.