在下面的代码中,我试图找出python中渐变的工作原理并绘制其结果。
当我在不使用plt.plot(x,f)
的情况下运行代码时,根据我的知识,梯度向量似乎是合理的(x轴除外,因为它不在-100到100之间,我也不知道为什么)。但是,当我尝试在功能线上看到这些向量时,出现了问题。我的代码如下:
from numpy import *
import matplotlib.pyplot as plt
x = mgrid[-100:101:1]
f = x**2
Ex = gradient(f)
fig = plt.figure(1)
ax = fig.gca()
ax.quiver(x,Ex)
ax.plot(x,f)
plt.show()
我只是想知道是否有人可以看到我哪里出了问题,对我们的帮助表示感谢。
答案 0 :(得分:0)
看看quiver documentation,您会发现呼叫签名:
quiver(U, V, **kw) quiver(U, V, C, **kw) quiver(X, Y, U, V, **kw) quiver(X, Y, U, V, C, **kw)
这些是理解位置参数的方式。这意味着在您的情况下,将x
理解为U
,将Ex
理解为V
,分别是x和y的U
和V
箭头向量的两个分量。因此,由于没有提供向量的x或y位置,因此它绘制从0到数组长度的箭头,每个箭头都从整数位置开始(在您的情况下为0到200)。
要解决此问题,首先要注意的是quiver
的描述是绘制箭头的二维字段。。它是固有的二维功能。因此,为了获得所需的输出,我们必须提供箭头的x和y位置,分别为x
和f
。而且,它的x和y箭头分量很容易从渐变Ex
中计算出来。渐变大致为 dy / dx ,因此,一旦知道了渐变 f',xy平面中代表它的箭头就是(u,v)=( l,f'* l),其中 l 是x
数组中的间距。
最终,改为使用以下命令进行绘制:
plt.quiver(x,f,np.ones_like(Ex),Ex,angles='xy')
解决了问题。 angles='xy'
使箭头从(x,y)指向(x + u,y + v),在这种情况下应该如此。