我试图用下面的公式为一个给定的物体画一个势场:
U=-α_goal*e^(-((x-x_goal )^2/a_goal +(y-y_goal^2)/b_goal ) )
使用以下代码
# Set limits and number of points in grid
xmax = 10.0
xmin = -xmax
NX = 20
ymax = 10.0
ymin = -ymax
NY = 20
# Make grid and calculate vector components
x = linspace(xmin, xmax, NX)
y = linspace(ymin, ymax, NY)
X, Y = meshgrid(x, y)
x_obstacle = 0
y_obstacle = 0
alpha_obstacle = 1
a_obstacle = 1
b_obstacle = 1
P = -alpha_obstacle * exp(-(X - x_obstacle)**2 / a_obstacle + (Y - y_obstacle)**2 / b_obstacle)
Ey,Ex = gradient(P)
print Ey
print Ex
QP = quiver(X, Y, Ex, Ey)
show()
此代码计算一个潜在字段。我怎样才能很好地画出这个势场呢?另外,给定一个势场,把它转换成矢量场的最佳方法是什么?(矢量场是势场的负梯度。)
我很感激你的帮助。
我试过使用np.gradient(),但结果不是我所期望的:
我所期望的是这样的:
编辑: 更改代码中的两行后:
y, x = np.mgrid[500:-100:200j, 1000:-100:200j]
p = -1 * np.exp(-((x - 893.6)**2 / 1000 + (y - 417.35)**2 / 1000))
我有一个不正确的绘图:它似乎是左右颠倒的(箭头似乎在正确的位置,但不是字段):
编辑:
修改为y, x = np.mgrid[500:-100:200j, -100:1000:200j]
知道原因吗?
首先,让我们在一个规则的网格上计算它,类似于您的示例代码。(另一方面,在计算公式的代码中有一个错误。在
exp
中缺少一个负数:接下来,我们需要计算梯度(这是一个简单的有限差分,与解析计算上述函数的导数相反):
现在我们可以绘制一个“颤动”图,但是,结果可能与您预期的不太一样,因为箭头显示在网格上的每个点上:
让我们把箭调大一点。最简单的方法是绘制每个第n个箭头并让matplotlib处理自动缩放。我们每三点用一次。如果您需要更少、更大的箭头,请将3改为更大的整数。
更好,但是那些箭还是很难看到。一种更好的可视化方法可能是使用覆盖黑色渐变箭头的图像打印:
理想情况下,我们希望使用不同的颜色映射或更改箭头颜色。我把那部分留给你。您还可以考虑等高线图(
ax.contour(x, y, p)
)或流线图(ax.streamplot(x, y, dx, dy
)。举个简单的例子:……为了让自己变得更漂亮:
相关问题 更多 >
编程相关推荐