gpt4 book ai didi

python - 计算和绘制矢量场

转载 作者:太空狗 更新时间:2023-10-29 17:21:48 25 4
gpt4 key购买 nike

我正在尝试使用以下公式为给定对象绘制势场:

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() 但结果不是我所期望的:

enter image description here

我所期望的是沿着这些思路: enter image description here

编辑:更改代码中的两行后:

y, x = np.mgrid[500:-100:200j, 1000:-100:200j] 
p = -1 * np.exp(-((x - 893.6)**2 / 1000 + (y - 417.35)**2 / 1000))

我有一个不正确的情节:它似乎是左右颠倒的(箭头似乎在正确的位置而不是字段):enter image description here编辑:通过更改为 y, x = np.mgrid[500:-100:200j, -100:1000:200j] 知道为什么吗?

最佳答案

首先,让我们在规则网格上评估它,类似于您的示例代码。 (附带说明,您在计算方程式的代码中有错误。它在 exp 中缺少一个负数。):

import numpy as np
import matplotlib.pyplot as plt

# Set limits and number of points in grid
y, x = np.mgrid[10:-10:100j, 10:-10:100j]

x_obstacle, y_obstacle = 0.0, 0.0
alpha_obstacle, a_obstacle, b_obstacle = 1.0, 1e3, 2e3

p = -alpha_obstacle * np.exp(-((x - x_obstacle)**2 / a_obstacle
+ (y - y_obstacle)**2 / b_obstacle))

接下来,我们需要计算梯度(这是一个简单的有限差分,与分析计算上述函数的导数相反):

# For the absolute values of "dx" and "dy" to mean anything, we'll need to
# specify the "cellsize" of our grid. For purely visual purposes, though,
# we could get away with just "dy, dx = np.gradient(p)".
dy, dx = np.gradient(p, np.diff(y[:2, 0]), np.diff(x[0, :2]))

现在我们可以制作一个“箭袋”图,但是,结果可能不会完全符合您的预期,因为在网格上每个 点都显示了一个箭头:

fig, ax = plt.subplots()
ax.quiver(x, y, dx, dy, p)
ax.set(aspect=1, title='Quiver Plot')
plt.show()

enter image description here

让我们把箭头变大。最简单的方法是绘制每个第 n 个箭头并让 matplotlib 处理自动缩放。我们将在这里使用每 3 个点。如果您想要更少、更大的箭头,请将 3 更改为更大的整数。

# Every 3rd point in each direction.
skip = (slice(None, None, 3), slice(None, None, 3))

fig, ax = plt.subplots()
ax.quiver(x[skip], y[skip], dx[skip], dy[skip], p[skip])
ax.set(aspect=1, title='Quiver Plot')
plt.show()

enter image description here

好多了,但是那些箭头仍然很难看清。一种更好的可视化方法可能是使用覆盖有黑色渐变箭头的图像图:

skip = (slice(None, None, 3), slice(None, None, 3))

fig, ax = plt.subplots()
im = ax.imshow(p, extent=[x.min(), x.max(), y.min(), y.max()])
ax.quiver(x[skip], y[skip], dx[skip], dy[skip])

fig.colorbar(im)
ax.set(aspect=1, title='Quiver Plot')
plt.show()

enter image description here

理想情况下,我们希望使用不同的颜色图或更改箭头颜色。我会把那部分留给你。您还可以考虑等高线图 (ax.contour(x, y, p)) 或流图 (ax.streamplot(x, y, dx, dy)。只是为了展示其中的一个简单示例:

fig, ax = plt.subplots()

ax.streamplot(x, y, dx, dy, color=p, density=0.5, cmap='gist_earth')

cont = ax.contour(x, y, p, cmap='gist_earth')
ax.clabel(cont)

ax.set(aspect=1, title='Streamplot with contours')
plt.show()

enter image description here

...只是为了变得非常花哨:

from matplotlib.patheffects import withStroke

fig, ax = plt.subplots()

ax.streamplot(x, y, dx, dy, linewidth=500*np.hypot(dx, dy),
color=p, density=1.2, cmap='gist_earth')

cont = ax.contour(x, y, p, cmap='gist_earth', vmin=p.min(), vmax=p.max())
labels = ax.clabel(cont)

plt.setp(labels, path_effects=[withStroke(linewidth=8, foreground='w')])

ax.set(aspect=1, title='Streamplot with contours')
plt.show()

enter image description here

关于python - 计算和绘制矢量场,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25342072/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com