F

MENUCours Outils et Méthodes pour la Physique

Vous disposez d'un relevé de températures en différents points de l'espace et désirez tracer quelques isothermes ? À moins que vous ayez accès à l'expression mathématique d'un potentiel électrique et que vous cherchiez à en représenter les équipotentielles ? Lisez la suite, on vous explique tout.

Je dispose d'une expression mathématique

Supposons que l'on étudie un champ scalaire \(f(x,y)\) dont on connaît l'expression en fonction des coordonnées du plan. On cherche à tracer une courbe de niveau (ou courbe implicite) qui vérifie \(f(x,y)=K\). Plus précisément, on cherche à tracer une courbe de niveau passant par le point M0 de coordonnées \((x_0,y_0)\), ce qui revient à fixer \(K=f(x_0,y_0)\).

Le principe

Une technique simple consiste à traiter la courbe de niveau comme une ligne de champ. En effet, le vecteur \[ \overrightarrow{V_\perp}(\text{M})=\overrightarrow{\text{grad}}\,f(\text{M})= \begin{pmatrix} \dfrac{\partial f}{\partial x} \\ \dfrac{\partial f}{\partial y} \end{pmatrix} \] est un vecteur qui a la propriété[1] d'être perpendiculaire à la courbe de niveau passant par le point M. Par conséquent, le vecteur \[ \overrightarrow{V_\parallel}(\text{M})=\begin{pmatrix} \dfrac{\partial f}{\partial y} \\ -\dfrac{\partial f}{\partial x} \end{pmatrix} \] est parallèle à la courbe de niveau passant par le point M. Remarquez que l'on a bien \(\overrightarrow{V_\perp}\cdot \overrightarrow{V_\parallel}=0\). Aussi, en se déplaçant le long de ce champ vectoriel on décrit une courbe de niveau. Le problème se ramène donc au tracé d'une ligne de champ de \(\overrightarrow{V_\parallel}(\text{M})\). Pour cela, on utilisera l'algorithme expliquée à la référence[2].

Quand arrêter le tracé ?

Lorsque l'on trace une courbe de niveau par cette technique, on construit une suite de segments de façon itérative. Il faut donc savoir quand arrêter le tracé. Deux cas de figure se présentent :

Remarque

Notez que la technique proposée ne permet pas toujours de tracer toutes les courbes de niveau correspondant à un certain niveau \(K\). En effet, l'ensemble des points vérifiant \(f(x,y)=K\) peut donner plusieurs courbes fermées disjointes. Or, avec notre technique, dès que la première courbe se referme, le tracé s'arrête.

Exemple

Étudions le champ scalaire défini par \[ f(x,y)=(x^2+3y^2)\,\mathrm{e}^{-(x^2+y^2)} \] Commençons par calculer les dérivées partielles : \[ \left\{\begin{array}{rcl} \dfrac{\partial f}{\partial x} &=& 2x(1-x^2-3y^2)\,\mathrm{e}^{-(x^2+y^2)}\\ \dfrac{\partial f}{\partial y} &=& 2y(3-x^2-3y^2)\,\mathrm{e}^{-(x^2+y^2)}\\ \end{array}\right. \] Il nous reste à choisir un champ vectoriel tangent à la ligne de niveau. On a vu précédemment que le vecteur \((\frac{\mathrm{d}f}{\mathrm{d}y}, -\frac{\mathrm{d}f}{\mathrm{d}x})\) convenait, mais il a le défaut de demander beaucoup de calcul. C'est pourquoi, on opte pour un vecteur tangent qui lui est proportionnel et qui s'exprime plus simplement : \[ \overrightarrow{V_\parallel}(\text{M})=\begin{pmatrix} y\,(3-x^2-3y^2) \\ x\,(x^2+3y^2-1) \end{pmatrix} \]

Simulation

Built with Processing

Courbes de niveau de la fonction \(f(x,y)=(x^2+3y^2)\,\mathrm{e}^{-(x^2+y^2)}\) pour \(x\in[-2,2]\) et \(y\in[-2,2]\).
Cliquer pour tracer une courbe de niveau


Réinitialisation
Your browser does not support the canvas element.

Je dispose d'un ensemble de données

Position du problème

Imaginons que l'on dispose de données \(f_{i}\) réparties en différents points Mi. Deux classes de problèmes sont à distinguer :

  1. Les données sont réparties de façon quelconque et le maillage n'est pas très étroit de sorte que les valeurs \(f_i\) varient significativement d'un point à un autre. Dans ce cas la technique consiste à produire un maillage triangulaire puis à interpoler linéairement \(f(x,y)\) à l'intérieur de chaque triangle à partir des valeurs de \(f\) aux sommets des triangles. On en déduit ensuite le segment correspondant au niveau \(f(x,y)=K\). La courbe de niveau est alors une suite de lignes brisées que l'on peut adoucir à l'aide de techniques plus ou moins rafinées. Disons le tout de suite, les techniques de contouring demandent beaucoup de ressources informatiques et font appel à des mathématiques assez avancées en général. Néammoins, une bonne introduction à ces techniques est l'algorithme CONREC écrit par Paul Burke[3]. Nous ne traitons pas de ce type de problème ici (il faudrait que je m'y penche un jour...)
  2. Les données sont réparties sur une grille carrée et le maillage est suffisamment serré pour autoriser des approximations par différence fines. C'est par exemple la situation que l'on rencontre lorsque l'on résout l'équation de Laplace dans un problème de diffusion ou d'électrostatique par la méthode de relaxation[4]. C'est dans ce cadre que nous situons notre propos.

Considérons donc un réseau constitué de \(N^2\) éléments carrés d'arête \(a\). Pour simplifier, adoptons comme unité de longueur l'arête \(a\) de sorte que les nœuds du réseau ont des coordonnées entières : \[ x_i=i \quad\text{et}\quad y_j=j \quad\text{avec}\quad (i,j)\in [0,N]\times[0,N] \]

Imaginons maintenant qu'un programme fournisse les valeurs d'un champ scalaire \(f(x_i,y_j)\) sur ce réseau carré. La question est : comment tracer la courbe de niveau de \(f\) passant par un point quelconque M ?

Algorithme

Là encore on peut voir la ligne de niveau comme une ligne du champ \(\overrightarrow{V_\parallel}\). Le problème est que l'on ne connaît pas l'expression des dérivées partielles de \(f(x,y)\). Cependant, on peut les approcher par différences finies : \[ \dfrac{\partial f}{\partial x}(x,y)\simeq f_{i+1,j}-f_{i,j} \quad\text{et}\quad \dfrac{\partial f}{\partial y}(x,y)\simeq f_{i,j+1}-f_{i,j} \] où \(i=\lfloor x \rfloor\) et \(j=\lfloor y \rfloor\) (on calcule les parties entières).

Finalement, on peut proposer l'algorithme suivant.

Algorithme

  1. Importation du fichier de données \(f_{i,j}\).
  2. Initialisation du point de départ : \(x=x_0\) et \(y=y_0\).
  3. Initialisation du pas \(h\).
  4. Définition du champ vectoriel \(\overrightarrow{V_\parallel}(x,y)\) :
    • \(i=\lfloor x \rfloor\) et \(j=\lfloor y \rfloor\) (on calcule les parties entières).
    • \(K_1=(f_{i+i,j}-f_{i,j})\).
    • \(K_2=(f_{i,j+1}-f_{i,j})\).
    • \(\overrightarrow{V_\parallel}(x,y)=\begin{pmatrix}K_2\\-K_1\end{pmatrix}\)
  5. Définition du champ vectoriel unitaire \(\overrightarrow{U\,}(x,y)\) : \[\overrightarrow{U}=\frac{\overrightarrow{V_\parallel}}{\|\overrightarrow{V_\parallel}\|}\]
  6. Définition de la fonction TEST(x,y) qui renvoie la valeur VRAIE tant que l'on veut continuer de tracer la ligne de champ.
  7. Tant que TEST(x,y)=VRAIE faire
    • Tracer un segment entre \((x,y)\) et \((x+h\,U_x(x,y),y+h\,U_y(x,y))\)
    • \(x=x+h\,U_x(x,y)\)
    • \(y=y+h\,U_y(x,y)\)

Vous aimez ?

Pour en savoir plus...

  1. J. Roussel Complément sur les opérateurs différentiels. (2013-02) FEMTO, la physique enseignée http://femto-physique.fr/mecanique_des_fluides/mecaflu_complement1.php
  2. J. Roussel Comment tracer une ligne de champ ? (2016-05) FEMTO, la physique enseignée http://femto-physique.fr/omp/tracer_ligne_de_champ.php
  3. P. Burke CONREC a contouring subroutine. (1987 07) paulbourke.net http://paulbourke.net/papers/conrec/
  4. J. Roussel L'équation de laplace et la méthode de relaxation (2007 09) FEMTO, la physique enseignée http://femto-physique.fr/omp/methode_de_relaxation.php