5.5 Représentation d'un champ vectoriel (en 2D)
Champ vectoriel et potentiel scalaire

En physique, certaines grandeurs sont décrites par des champs vectoriels. Ainsi, le champ électrique \(\vec E\) est une grandeur vectorielle dont les composantes varient selon le point de l'espace considéré :

\[ \vec E = \begin{pmatrix} E_x(x,y,z) \cr E_y(x,y,z) \cr E_z(x,y,z) \cr \end{pmatrix}\,. \]

De plus, certains de ces champs vectoriels ''dérivent d'un potentiel'', c'est-à-dire d'un champ scalaire. Dans le cas de \(\vec E\), ce champ scalaire est le potentiel électrique \(\phi = f(x,y,z)\). Plus précisément,

\[ \vec E = -\vec{\nabla}\phi = -\begin{pmatrix} \partial\phi/\partial x\\ \partial\phi/\partial y\\ \partial\phi/\partial z\\ \end{pmatrix}\,, \]

où \(\vec\nabla\phi\) est appelé le gradient de \(\phi\) et où \(\partial/\partial x\), \(\partial/\partial y\) et \(\partial/\partial z\) sont des dérivées partielles.

La fonction quiver

Le gradient d'un champ scalaire en un point est un vecteur pointant dans la direction où le champ augmente le plus (direction de ''plus grande pente''). Il est donc perpendiculaire à la courbe de niveau qui passe par ce point. Ainsi, le champ électrique est toujours orthogonal aux courbes sur lesquels le potentiel est le même (équipotentielles). Nous allons l'illustrer en deux dimensions à l'aide de la fonction scalaire :

\[ \Psi(x,y) = \frac{1}{\sqrt{x^2 + y^2}} \]

dont nous allons représenter des courbes de niveaux accompagnées de vecteurs gradients. Pour ce faire, nous utilisons la fonction np.gradient qui retourne le gradient d'un champ donné comme un tableau à \(N\) dimensions, ainsi que la fonction ax.quiver qui permet de représenter un champ bidimensionnel de flèches.

import numpy as np x = y = np.linspace(-4.,4.,41) xv, yv = np.meshgrid(x,y,indexing='ij') Psiv = 1/(np.sqrt(xv**2 + yv**2)) # x2 = np.linspace(-4.,4.,7) y2 = np.linspace(-4.,4.,7) x2v, y2v = np.meshgrid(x2,y2,indexing='ij') Psi2v = 1/(np.sqrt(x2v**2 + y2v**2)) dPsidx, dPsidy = np.gradient(Psi2v) # import matplotlib.pyplot as plt fig = plt.figure(1) ax = fig.gca() niveaux = [0.25, 0.5, 0.75, 1.0, 1.25, 1.5] cs = ax.contour(xv,yv,Psiv,levels=niveaux) plt.clabel(cs, inline=True, fontsize=9) ax.quiver(x2v,y2v,dPsidx,dPsidy, color='r') plt.axis('equal') plt.show()

Représentation de quelques courbes \(\Psi=\Psi_0=\text{constante}\) (cercles de rayon \(r=\sqrt{x^2+y^2}\) centrés à l'origine) et de quelques vecteurs gradient \(\vec\nabla\Psi\) :

La fonction streamplot

Matplotlib permet également de représenter un champ vectoriel sous la forme de lignes de champ. Ces lignes sont tangentes, en tout point, à la direction des vecteurs et permettent d'aisément visualiser l'allure du champ. En revanche, elles ne fournissent pas d'information sur l'intensité du champ, sauf si leurs couleurs, leurs épaisseurs ou leur densité sont significatives.

La fonction streamplot demande :

Le paramètre density contrôle l'espacement des lignes du champ.

La couleur des lignes (gérée par le paramètre color qui doit alors être un tableau) permet quant à elle de visualiser la longueur (norme) des vecteurs du champ.

import numpy as np x = np.linspace(-4.,4.,101) y = np.linspace(-4.,4.,101) xv, yv = np.meshgrid(x,y,indexing='ij') Psiv = 1/(np.sqrt(xv**2 + yv**2)) dPsidx, dPsidy = np.gradient(Psiv) import matplotlib.pyplot as plt fig = plt.figure(1) ax = fig.gca() t_couleurs = 36*np.log(dPsidx**2+dPsidy**2) # tableau des couleurs ax.streamplot(x, y, dPsidy, dPsidx, color = t_couleurs,linewidth=1,cmap = plt.cm.plasma, density = 2,arrowstyle = '->', arrowsize = 1.5) ax.set_title("Lignes de champ du gradient de $\Psi$") plt.axis('scaled') plt.show()

Remarque: les lignes de champ ne se croisent jamais.