tp06 Eq-Laplace
tp06 Eq-Laplace
tp06 Eq-Laplace
Résolution numérique
BLAISE PASCAL
de l’équation de Laplace
PT 2021-2022
Les équations de Maxwell permettent de montrer que, en régime stationnaire et dans le vide, le potentiel électro-
statique vérifie l’équation de Laplace, c’est-à-dire
∆V = 0 ,
où ∆ est l’opérateur laplacien. Cette équation se retrouve dans de nombreux domaines : ainsi, la température de
tout système vérifie ∆T = 0 en régime permanent 1 , mais on la rencontre également en gravitation, en mécanique des
fluides, en mécanique quantique, pour l’étude des vibrations d’une peau de tambour, etc. Des solutions analytiques
existent dans des cas simples, mais dans le cas général, résoudre cette équation demande d’avoir recours à des méthodes
numériques : c’est le but de ce TP, qui permettra au passage d’observer les effets de bord dans un condensateur plan.
Pour que le TP reste raisonnablement abordable dans une séance de deux heures, nous nous limiterons à deux
dimensions, ce qui revient physiquement à supposer une invariance par translation dans la troisième dimension.
Vous disposez du script Python tp06_eq-laplace_script-depart.py, qui contient quelques fonctions qui nous
serviront à l’initialisation des calculs et à l’affichage des résultats. Ouvrir ce fichier et l’enregistrer sous un nom
différent (pour pouvoir retrouver lesdites fonctions en cas de fausse manœuvre).
j =0 1 2 3 4 j =0 1 2 3 4
i =0 4
1 3
(x2 , y3 )
2 2
3 1
(x2 , y3 )
δ δ
4 i =0
(a) Indices et coordonnées avec les conventions Python (b) Indices et coordonnées avec les conventions Python
et l’option de tracé origin=’lower’
∂2V ∂2V
∆V = 2
+ .
∂x ∂y 2
Il faut donc discrétiser la dérivée seconde sous forme de différence finie, ce qui se fait comme toujours grâce à des
développements limités. En transposant la formule de Taylor,
h2 ′′
f (a + h) = f (a) + h f ′ (a) + f (a) + o(h2 ) ,
2
on peut écrire
∂V δ2 ∂ 2 V
V (xj + δ, yi ) = V (xj , yi ) + δ (xj , yi ) + (xj , yi ) + o(δ 2 )
∂x 2 ∂x2
et de même
∂V δ2 ∂ 2 V
V (xj − δ, yi ) = V (xj , yi ) − δ (xj , yi ) + (xj , yi ) + o(δ 2 ) .
∂x 2 ∂x2
Le potentiel V sera stocké dans une variable globale sous forme d’un tableau numpy V tel que V[i][j] donne la
valeur du potentiel V (jδ, iδ). Par simplicité de notation, on notera donc dans la suite
V [i][j] = V (xj , yi )
On pourrait travailler de façon exactement identique avec des listes de listes, sans changer l’écriture des fonctions,
mais travailler avec des tableaux numpy permet d’intialiser les tableaux et de faire les tracés plus aisément.
1 - Montrer que
∂2V V [i][j + 1] + V [i][j − 1] − 2V [i][j]
[i][j] ≃
∂x2 δ2
puis que
V [i + 1][j] + V [i − 1][j] + V [i][j + 1] + V [i][j − 1] − 4V [i][j]
∆V [i][j] ≃ .
δ2
Ainsi, l’équation de Laplace discrétisée s’écrit, pour tout point (i, j) du domaine de résolution,
Lorsqu’il vérifie l’équation de Laplace, le potentiel en un point est donc une moyenne des potentiels aux points
voisins : c’est ainsi qu’il sera possible de construire par récurrence les valeurs de V en tout point de la grille en
partant des bords où les conditions aux limites sont connues.
II - Algorithme de Jacobi
II.A - Principe
L’algorithme de Jacobi permet une résolution itérative de l’équation (1) : la valeur du potentiel Vn+1 [i][j] au
point [i][j] à l’itération n + 1 se déduit de la valeur des potentiels voisins à l’itération n par
qui représente l’écart entre la nouvelle et l’ancienne valeur du potentiel moyenné sur toute la grille. On choisit de
stopper la simulation lorsque e devient inférieur à une valeur seuil ε définie au début de la simulation, en fonction
d’un compromis entre précision des résultats et temps de calcul.
▷ Initialisation :
→ créer le tableau B et le remplir avec des True et des False pour décrire les bords du domaine ;
→ créer le tableau V et l’initialiser avec les valeurs voulues sur les bords du domaine.
▷ Itérations : actualiser le tableau V : pour tout point (i, j) n’appartenant pas au bord la nouvelle valeur est
calculée selon la relation de récurrence (2).
▷ Terminaison : calculer après chaque itération l’écart e à la précédente avec l’équation (3), et cesser la procédure
lorsque e devient inférieur à ε.
3 - Écrire une fonction ecart(V1,V2) prenant en argument deux tableaux numpy et renvoyant l’écart entre ces deux
tableaux au sens de l’équation (3).
4 - Écrire une fonction iteration_jacobi qui effectue une itération de l’algorithme ci-dessus. Cette fonction ne
prend aucun argument et doit renvoyer l’écart e entre les potentiels avant et après itération.
Rappels utiles :
Pour effectuer une copie d’un tableau numpy on utilise V_copie = V.copy() mais pas V_copie = V,
sans quoi les deux sont liés et toute modification de V entraîne une modification de V_copie.
Avoir choisi un tableau de booléens pour B permet d’écrire directement les tests sous la forme « if B[
i][j]: », ce qui est exactement équivalent à écrire « if B[i][j] == True: », et même « if B[i][j
] == 1: ».
5 - Écrire une fonction jacobi(eps) qui prend en argument un flottant eps et qui itère l’algorithme tant que l’écart
est supérieur à eps. À des fins de comparaison avec la méthode suivante, votre fonction doit renvoyer le nombre
d’itérations. Pour suivre la convergence en temps réel, on pourra ajouter un print (e) à un endroit bien choisi.
7 - Identifier les effets de bord et la distance sur laquelle ils se manifestent. Comme vous le savez (n’est-ce pas ?) les
équipotentielles d’un condensateur plan infini sont équidistantes, parallèles entre elles, et parallèles aux armatures
du condensateur ©
III.A - Principe
La méthode consiste essentiellement à remplacer la relation de récurrence (2) par
D’autre part, le calcul fait intervenir les valeurs du potentiel aux points voisins à l’itération précédente n comme
c’était déjà le cas, mais aussi certaines valeurs à l’itération n + 1 elle-même. Ceci est rendu possible par le fait que la
grille est parcourue à i et j croissants, ces valeurs ont donc déjà été actualisées lors de l’itération n : on comprend ainsi
que cela améliore la vitesse de convergence. En pratique, il ne faut plus utiliser un tableau copie mais directement
itérer V avec l’équation (4).
8 - Écrire les fonctions iteration_gauss_seidel et gauss_seidel qui jouent un rôle analogue aux fonctions du
même nom écrites pour l’algorithme de Jacobi.
9 - Tester ces fonctions sur l’exemple précédent du condensateur. Vérifier que le nombre d’itérations est inférieur.
Pour que la comparaison ait un sens, penser à réinitialiser la matrice V entre les deux simulations.
équipotentielles horizontales D
L’objectif est d’obtenir numériquement une relation entre la valeur Emax du champ électrique et le diamètre D
de la pointe de la tige.
• Calcul du potentiel
La fonction initialisation_effet_pointe(Vmin,Vmax,h,d) fournie dans le script de départ permet d’initialiser
un domaine avec
▷ un contour dont le bord bas est au potentiel Vmin , le bord haut au potentiel Vmax et où le potentiel augmente
linéairement de Vmin à Vmax sur les bords droit et gauche ;
▷ une tige de hauteur h et épaisseur d (en pixels), au potentiel fixé Vmin .
Pour choisir des valeurs ayant un sens physique, on raisonne sur un pas de grille δ = 3 cm, et on prendra
▷ h = 50 et d = 13, ce qui correspond à une poteau de hauteur H = 1,5 m et de largeur D = d × δ = 30 cm ;
▷ un domaine de taille 120 × 120 points, ce qui correspond à 3,6 × 3,6 m ;
▷ un potentiel Vmin = 0 V au niveau du sol et Vmax = Ny × δ × 100 V en haut du cadre, ce qui donne bien un
gradient au repos de 100 V · m−1 .
12 - Initialiser le problème à l’aide de cette fonction. Vérifier que tout est correct à l’aide de trace_bords.
13 - Utiliser ensuite l’algorithme de Gauss-Seidel pour obtenir le potentiel. On prendra encore ε = 10−3 . Visualiser
la solution à l’aide des fonctions trace_equipot et trace_ldc.
14 - Sur les équipotentielles précédentes, identifier la zone où le champ est le plus intense.