import numpy as np import matplotlib.pyplot as plt Lx=1e-3 # taille du domaine de travail en mètre Ly=1e-3 Nx=100 # nombre de points de la grille Ny=100 dx=Lx/Nx # intervalle entre deux points dy=Ly/Ny precision = 1e-3# règle la précision du calcul : si la methode converge à ce # nombre près, le programme arrête les itérations V=np.zeros((Nx,Ny)) # tableaux à 2 dimensions vide au départ V2=np.zeros((Nx,Ny)) # V : potentiel B=np.zeros((Nx,Ny)) # Ex et Ey composantes du champ électrique Ex=np.zeros((Nx,Ny)) # B : si B=1, le potentiel est imposé, B=0 vide Ey=np.zeros((Nx,Ny)) # conditions aux limites : capteur tactile V[0,10:47]=10 V[0,53:90]=-10 # V[10,:]=0 # doigt à 0 V au dessus du capteur # B[10,:]=1 #------------calcul du potentiel méthode de Gauss Seidel ------------------- emax=1000 # on met une valeur arbitraire > précision k=0 # pour que le while ne stoppe pas tout de suite # les itérations, emax sera l'écart max de # potentiel entre deux itérations w=2/(1+np.pi/max(Nx,Ny)) # paramètre optimal pour la convergence while emax>precision: # tant que la présicion n'est pas atteinte # on met à zéro au départ pour calculer le max emax=0 # d'écart sur l'ensemble de la grille for i in range(1,Ny-1): # on ne va pas jusqu'au bord ! le bord du for j in range(1,Nx-1): # domaine de calcul reste à 0 V if B[i,j]==0: # si on est dans le vide : on résout l'equ de Laplace # méthode de Jacobi V2=V[i,j] V[i,j]=(1.-w)*V[i,j]+w*(V[i+1,j]+V[i-1,j]+V[i,j+1]+V[i,j-1])/4. # on travaille directement sur V et on utilise les valeurs # de la grille en cours de calcul pour faire converger la # méthode plus vite # plus besoin de travailler sur une matrice copiée ! emax=max(emax,abs(V2-V[i,j])) # on compare pour trouver # l'écart maximum k=k+1 # on compte le nombre d'itérations #--------------------------------------------------------------------------- print(str(k)+" itérations") # -------------calcul du champ électrique Ex et Ey-------------------------- Emax=0 for i in range(1,Nx-1): for j in range(1,Ny-1): Ey[i,j]=-(V[i+1,j]-V[i-1,j])/(2*dy) # calcul du gradient selon Oy Ex[i,j]=-(V[i,j+1]-V[i,j-1])/(2*dx) # selon Ox #---------------------------------------------------------------------------- # calcul de la charge q=0 for j in np.arange(10,48,1): q=q+Ey[1,j]*8.85e-12*dx*370e-6 #si électrode carré de 370 micromètres print("capacité : C = "+str(q/20*1e12)+" pF") # tracé de la carte de champ : potentiel et champ électrique x=np.linspace(-Lx/2*1e3,Lx/2*1e3,Nx) y=np.linspace(0,Ly*1e3,Ny) X,Y=np.meshgrid(x,y) plt.figure(figsize=(10,8)) cf=plt.contourf(X,Y,V,100,cmap='jet') graph=plt.contour(X,Y,V,25,colors='black') plt.clabel(graph,inline=1,fontsize=10,fmt='%3.2f') #affiche les valeurs de V plt.colorbar(cf) plt.xlabel("en mm") plt.ylabel("en mm") plt.title("Carte de champ et potentiel") plt.streamplot(X,Y,Ex,Ey,density=1,color='black') plt.show()