python grad_用python进行梯度计算

你需要给gradient一个矩阵来描述你的(x,y)点的角频率值。e、 gdef 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绘制为曲面会提供:

c0ee57dc7d87d4ff45713a5a190cd61d.png

下面是如何解释你的梯度:

gx是一个矩阵,它在所有点上都给出了变化dz/dx。e、 g.gx[0][0]是dz/dx在(x0,y0处。可视化gx有助于理解:

653b09de06293cc5866a39385e71f0ad.png

因为我的数据是从f(x,y) = sin(x+y)gy生成的,所以看起来是一样的。

这里有一个使用f(x,y) = sin(x)的更明显的例子。。。

f(x,y)

14594a69eeb304454c7404206ec0fe53.png

和渐变

jo5aI.png

f9a39588ab6e88da37ecdf954b4827af.png

更新让我们看看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 always 0检查。

dz/dx = cos(x)和。。。>>> np.cos(-1.5)

0.070737201667702906

看起来不错。

你会注意到它们并不完全正确,这是因为我的Z数据不是连续的,有一个步长为0.05,而gradient只能近似于变化率。


版权声明:本文为weixin_39603117原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。