你需要给予gradient
描述您的角频率值的矩阵(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] 是dz/dx
at (x0,y0
)。可视化gx
有助于理解:
由于我的数据是从生成的f(x,y) = sin(x+y)
gy 看起来一样。
这是一个更明显的例子f(x,y) = sin(x)
...
f(x,y)
和梯度
update让我们看一下 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
Yes.
此时我们的梯度分量是什么?
>>> gy[20][30]
0.0
>>> gx[20][30]
0.070707731517679617
那些检查出来了吗?
dz/dy always 0
check.
dz/dx = cos(x)
and...
>>> np.cos(-1.5)
0.070737201667702906
看起来不错。
你会注意到它们并不完全正确,那是因为我的 Z 数据不连续,步长为0.05
and gradient
只能近似估计变化率。