Informatique et dessin de champs de vecteurs
Je suis en train de dessiner un champ de potentiel pour un objet donné à l'aide de la formule suivante:
U=-α_goal*e^(-((x-x_goal )^2/a_goal +(y-y_goal^2)/b_goal ) )
en utilisant le code suivant
# 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()
Ce code permet de calculer un champ de potentiel. Comment puis-je tracer ce champ de potentiel bien? Aussi, étant donné un champ de potentiel, quelle est la meilleure façon de le convertir en un champ de vecteurs? (champ de vecteurs est la moins gradient du champ de potentiel. )
Je vous serais reconnaissant de toute aide.
J'ai essayé d'utiliser np.gradient() mais le résultat n'est pas ce que j'ai prévu:
Ce que je dois attendre, c'est quelque chose le long de ces lignes:
EDIT:
Après la modification de la deux lignes dans le code:
y, x = np.mgrid[500:-100:200j, 1000:-100:200j]
p = -1 * np.exp(-((x - 893.6)**2 / 1000 + (y - 417.35)**2 / 1000))
J'ai une mauvaise intrigue: il semble être inversée gauche-droite (flèches semblent être dans le bon endroit, mais pas le champ):
EDIT:
Fixe en changeant de y, x = np.mgrid[500:-100:200j, -100:1000:200j]
Aucune idée pourquoi?
source d'informationauteur Tad
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, nous allons l'évaluer sur une grille régulière, semblable à votre code d'exemple. (Sur une note de côté, vous avez une erreur dans le code afin d'évaluer votre équation. Il ne manque plus qu'un négatif à l'intérieur de la
exp
.):Prochaine, nous aurons besoin de calculer le gradient (c'est une simple différence finie, par opposition à un point de vue analytique du calcul de la dérivée de la fonction ci-dessus):
Maintenant, nous pouvons faire un "tremblement" de l'intrigue, cependant, les résultats ne seront probablement pas tout à fait ce que vous attendez, comme une flèche est affichée à chaque point de la grille:
Nous allons faire apparaître les flèches de plus en plus gros. La façon la plus simple pour ce faire est de tracer tous les n-ème de la flèche et de laisser matplotlib gérer la mise à l'échelle automatique. Nous allons utiliser tous les 3 point ici. Si vous voulez moins de, plus de flèches, de changer les 3 à un plus grand nombre entier.
Mais ces flèches sont encore assez difficile à voir. Une meilleure façon de visualiser ce que pourrait être avec une image de la parcelle avec le noir gradient de flèches superposées:
Idéalement, nous aimerions vous souhaitez utiliser un autre palette de couleur ou de modifier la flèche couleurs. Je vais quitter la partie pour vous. Vous pouvez également envisager un tracé de contour (
ax.contour(x, y, p)
) ou un streamplot (ax.streamplot(x, y, dx, dy
). Juste pour montrer un exemple rapide de celles-ci:...Et juste pour le plaisir de faire vraiment de fantaisie: