Le système électrostatique est constitué de trois disques conducteurs parallèles. Le disque central est percé d'un diaphragme circulaire. Le problème est à symétrie axiale. Il s'agit donc de résoudre l'équation de Laplace en coordonnées cylindriques pour le potentiel électrostatique :
Ce document présente la résolution numérique de l'équation de Laplace par la méthode des différences finies expliquée dans Équation de Poisson à deux dimensions. La discrétisation de l'équation est expliquée dans Discrétisation de l'équation de Poisson en géométrie axiale.
Pour le module Python utilisé voir : Équation de Poisson : module python.
Figure pleine pageEn l'absence d'ouverture dans le conducteur central, les champs électriques sont uniformes (on se place loin des bords). Deux cas sont à distinguer : soit les champs de part et d'autre du diaphragme sont de même sens (V0<V1<V2), soit ils sont de sens opposés (V1<V0<V2).
from matplotlib.pyplot import * import math import numpy import poisson.main
On commence par définir un maillage de 256 mailles dans la direction de l'axe de symétrie z et 128 mailles dans la direction radiale r. Le maillage réduit comporte 32 par 16 mailles.
n=7 p=4 levels = n-p+1 laplace = poisson.main.PoissonAxial(p+1,p,levels,1.0,0.5,x0=-0.5,y0=0.0) laplace.laplacien()
On impose une condition limite de dirichlet sur chaque plaque conductrice, avec des potentiels V1, V2=0 pour le diaphragme et V3. Sur le bord du cylindre, on impose une condition limite de Neumann nulle :
Cette condition permet d'obtenir un champ uniforme en l'absence d'ouverture dans le conducteur central. On commence par définir une condition de Neumann sur tous les bords du domaine. Les conditions de Dirichlet sur les bords correspondant aux conducteurs viennent écraser les conditions de Neumann.
V1 = -1.0 V2 = 0.0 V3 = 5.0 rayon = 5 laplace.neumann_borders(0.0,0.0,0.0,0.0,0.0) laplace.dirichlet_polygon(0,0,[0],[16],V1) laplace.dirichlet_polygon(16,rayon,[0],[16-rayon],V2) laplace.dirichlet_polygon(32,0,[0],[16],V3)
La discrétisation de l'équation de Poisson conduit à un système d'équations linéaires qui est résolu par la méthode itérative de Gauss-Seidel avec sur-relaxation.
result=laplace.opencl_iterations_norm(20,50,omega=1.9)
figure(figsize=(10,6)) plot(result[0],result[1]) xlabel('niter') ylabel('norm') grid()plotA.pdf
On récupère le potentiel et les composantes du champ électrique. Pour ces deux dernières, on récupère un tableau symétrique par rapport à l'axe.
V = laplace.get_array(symetry=1) Er = -laplace.get_derivR(symetry=-1) Ez = -laplace.get_derivZ(symetry=1) z = laplace.get_z() r = laplace.get_r(symetry=1)
Tracé des lignes équipotentielles :
figure(figsize=(8,8)) extent = laplace.get_extent(symetry=True) contour(V,40,extent=extent) imshow(~laplace.get_mask(symetry=True),extent=extent,alpha=0.5, cmap=cm.gray) xlabel('z') ylabel('r') grid()plotB.pdf
Tracé du champ Ez sur l'axe :
figure(figsize=(10,5)) plot(z,Ez[2**n,:]) xlabel('z') ylabel('Ez') grid()plotC.pdf
Tracé du champ Ez sur un axe rencontrant le conducteur central :
figure(figsize=(10,5)) plot(z,Ez[int(2**n*1.6),:]) xlabel('z') ylabel('Ez') grid()plotD.pdf
Tracé du champ Er sur un axe radial proche du diaphragme :
figure(figsize=(10,5)) plot(r,Er[:,2**n-2]) xlabel('r') ylabel('Er') grid()plotE.pdf
laplace.close()
n=7 p=4 levels = n-p+1 laplace = poisson.main.PoissonAxial(p+1,p,levels,1.0,0.5,x0=-0.5,y0=0.0) laplace.laplacien() V1 = -1.0 V2 = 0.0 V3 = -5.0 rayon = 5 laplace.neumann_borders(0.0,0.0,0.0,0.0,0.0) laplace.dirichlet_polygon(0,0,[0],[16],V1) laplace.dirichlet_polygon(16,rayon,[0],[16-rayon],V2) laplace.dirichlet_polygon(32,0,[0],[16],V3) result=laplace.opencl_iterations_norm(20,50,omega=1.9) figure(figsize=(10,6)) plot(result[0],result[1]) xlabel('niter') ylabel('norm') grid()plotF.pdf
On récupère le potentiel et les composantes du champ électrique. Pour ces deux dernières, on récupère un tableau symétrique par rapport à l'axe (ou antisymétrique).
V = laplace.get_array(symetry=1) Er = -laplace.get_derivR(symetry=-1) Ez = -laplace.get_derivZ(symetry=1) z = laplace.get_z() r = laplace.get_r(symetry=1)
Tracé des lignes équipotentielles :
figure(figsize=(8,8)) extent = laplace.get_extent(symetry=True) contour(V,40,extent=extent,color='r') imshow(~laplace.get_mask(symetry=True),extent=extent,alpha=0.5, cmap=cm.gray) xlabel('z') ylabel('r') grid()plotG.pdf
Tracé du champ Ez sur l'axe :
figure(figsize=(10,5)) plot(z,Ez[2**n,:]) xlabel('z') ylabel('Ez') grid()plotH.pdf
Tracé du champ Ez sur un axe rencontrant le conducteur central :
figure(figsize=(10,5)) plot(z,Ez[int(2**n*1.6),:]) xlabel('z') ylabel('Ez') grid()plotI.pdf
Tracé du champ Er sur un axe radial proche du diaphragme :
figure(figsize=(10,5)) plot(r,Er[:,2**n-2]) xlabel('r') ylabel('Er') grid()plotJ.pdf
laplace.close()