Vous êtes sur la page 1sur 12

29/11/2023 14:10 EF2D

Cours accéléré analyse numérique - M2 AMS

Méthode des éléments finis pour un problème


2D.

I - Conditions aux limites de Neumann


homogènes

https://www.imo.universite-paris-saclay.fr/~filipa.caetano/EF2D.html 1/12
29/11/2023 14:10 EF2D

On s'intéresse ici à la résolution approchée du problème aux limites suivant, avec

conditions aux limites de Neumann homogène :

⎧ − Δu + u = f , dans Ω,

(P N ) ⎨ ∂ u

= 0, dans ∂ Ω,
∂n

¯
¯¯¯ 2 2
où f : Ω ⟶ R est une fonction de classe C donnée et où Ω est un ouvert de R

donné, de frontière ∂ Ω régulière.

Question 1. Écrire la formulation variationnelle du problème (P ) sous la forme

u ∈ V tel que
(P N v) {
a(v, u) = L(v), ∀ v ∈ V,
1
où V = H (Ω), a est une forme bilinéaire dans V et L une forme linéaire de V , que

l'on explicitera.

On suppose désormais que le domaine Ω est polygonale et on considère une

triangulation Th de Ω, autrement dit un pavage de Ω par des triangles tel que

l'intersection de chaque deux triangles est soit vide, soit une arête complète des 2

triangles, soit un sommet des deux triangles. L'indice h note le diamètre maximal

des triangles de Th .

1
On considère l'espace Vh corespondant à l'approximation de H (Ω) par des
1
éléments finis P associés à la triangulation Th :

0 ¯
¯¯¯ 1
Vh = {Φ ∈ C (Ω ) | Φ|T ∈ P , pour tout T ∈ Th }.

On note {TN } N =1,…,N les triangles de Th , {S I } I =1,…,N les sommets des


tri Som

triangles la triangulation et {ΦI } I =1,…,N les fonctions de Vh définies par


Som

ΦI (S J ) = δ I J , I , J = 1, … , NSom .

Les fonctions ΦI sont l'analogue en dimension 2 des fonctions chapeaux que l'on a

vu en dimension 1.

On a que {Φ1 , … , ΦN } est une base de Vh et Vh est donc un sous-espace de


Som

1
H (Ω) de dimension finie NSom .

Le problème discret consiste alors à chercher uh ∈ Vh tel que

(P N vh ) a(ΦI , uh ) = L(ΦI ), ∀ I = 1, … , NSom .

N Som

Question 2. Soit uh = ∑ uI ΦI . Montrer que uh est solution de (P N vh ) si et

I =1

T
seulement si le vecteur U = (u1 , … , uN Som ) est solution d'un système linéaire

KU + MU = F ,

N Som ×N Som
où K et M sont les matrices de M (R) définies par

K I ,J = ∫ ∇ΦI ⋅ ∇ΦJ , M I ,J = ∫ ΦI ΦJ ,
Ω Ω

N Som
et où F est le vecteur de R défini par

https://www.imo.universite-paris-saclay.fr/~filipa.caetano/EF2D.html 2/12
29/11/2023 14:10 EF2D

FI = ∫ f ΦI .
Ω

Maillage de Ω.

Dans un premier temps on considère Ω le carré [0, 2] × [0, 2].

Pour se répérer dans le maillage du domaine Ω, les triangles et les sommets des

triangles sont numérotés respectivement de 1 à NT ri et de 1 à NSom .

La triangulation Th de Ω est alors représentée par deux matrices. La première, que

l'on appellera dans le programme python T abT ri, contient la liste des triangles. Il

s'agit d'une matrice de taille NT ri × 3 que, dans chaque ligne N , contient les 3

indices I des sommets du triangle TN . La deuxième, que l'on appellera T abS om,

contient les coordonnées de chaque sommet de la triangulation. C'est une matrice

de taille NSom × 2 que, dans chaque ligne I contient les coordonnées du sommet S I .

Le code suivant crée le maillage et ces matrices.

https://www.imo.universite-paris-saclay.fr/~filipa.caetano/EF2D.html 3/12
29/11/2023 14:10 EF2D

In [5]: %matplotlib inline


import matplotlib.pyplot as plt
import numpy as np
import matplotlib.tri as tri
import math
import numpy.random as rd

Nx=18
Ny=18

x_m=0.
x_M=2.
y_m=0.
y_M=2.

x=np.linspace(x_m,x_M,Nx+2)
y=np.linspace(y_m,y_M,Ny+2)

X,Y=np.meshgrid(x,y)

X=X.flatten()
Y=Y.flatten()

triang = tri.Triangulation(X, Y)

NTri=np.shape(triang.triangles)[0]
NSom=np.shape(triang.x)[0]

#Tableau avec coordonnes des noeuds


TabSom=np.zeros([NSom,2])
TabSom[:,0]=triang.x
TabSom[:,1]=triang.y

# Tableau avec noeuds des triangles


TabTri=triang.triangles

# Représentation du maillage
plt.figure(1)
plt.gca().set_aspect('equal')
plt.triplot(X,Y,triang.triangles, 'b-', lw=0.5)
plt.title('maillage')

plt.show()

https://www.imo.universite-paris-saclay.fr/~filipa.caetano/EF2D.html 4/12
29/11/2023 14:10 EF2D

[[ 1 0]
[ 2 1]
[ 3 2]
...,
[399 378]
[399 379]
[399 398]]

Les matrices élémentaires

Pour construire les matrices de masse M et de rigidité K, on commence par définir

des matrices élémentaires qui permettent, localement sur un triangle TN de noeuds

SI , SI et S I , de calculer
1 2 3

˙ ˙
∫ ∇ΦI ∇ΦI et ∫ ΦI ΦI
i j i j

TN TN

pour i, j = 1, 2, 3. Ces intégrales vont contribuer respectivement à l'élément K I et


i ,Ij

MI des matrices globales.


i ,Ij

Question 3. Construire deux fonctions M elem (S 1, S 2, S 3) et K elem (S 1, S 2, S 3) calculant

les matrices de masse et de rigidité élémentaires sur un triangle T de sommets

S 1 = (x1 , y1 ), S 2 = (x2 , y2 ) et S 3 = (x3 , y3 ).

Pour calculer la matrice de masse élémentaire sur le triangle T , on peut utiliser les

formules ci-dessous.

Les fonctions de base associées à chaque sommet de T sont localement données

par

1 1
λ1 (x, y) = (y23 (x − x3 ) − x23 (y − y3 )), λ2 (x, y) = (y31 (x − x1 ) − x31 (y − y1 )), λ3 (x,
D D

où xij = xi − xj , yij = yi − yj et D = x23 y31 − x31 y23 . |D| est égal à deux fois la

surface du triangle.

Pour k1 , k2 , k3 ∈ {0, 1, 2}, on a

k1 k2 k3
k 1 !k 2 !k 3 !
∫ λ λ λ = 2 aire(T ).
1 2 3
T (k1 + k2 + k3 + 2)!

https://www.imo.universite-paris-saclay.fr/~filipa.caetano/EF2D.html 5/12
29/11/2023 14:10 EF2D

In [2]: def M_elem(S1,S2,S3):


# A compléter

def K_elem(S1,S2,S3):
# A compléter

Assemblage des matrices M et K .

Dans cette partie on met en oeuvre un algorithme pour construire les matrices M et

K . Pour ce faire on remarque que, par exemple,


N T ri

M I ,J = ∑ ∫ ΦI ΦJ = ∑ ∫ ΦI ΦJ .
TN TN
N =1 N :SI ,SJ ∈TN

L'algoritme de construction des matrices consiste alors à faire la boucle suivante :

Pour N= 1...NTri
Détérmination des sommets S_I1, S_I2 et S_I3 du triangle T_N
Calcul des matrices élémentaires associées au triangle T_N
Pour i=1..3
Pour j=1...3
Rajouter à M(Ii,Ij) la contribution venue du triangle T_N

Question 4. Compléter dans le programme l'assemblage des matrices M et K

In [5]: # A compléter

https://www.imo.universite-paris-saclay.fr/~filipa.caetano/EF2D.html 6/12
29/11/2023 14:10 EF2D

Calcul du second membre F .

On peut calculer exactement les composantes FI du vecteur F ou approcher ses

valeurs en utilisant par exemple des formules de quadrature.

Ici on fait le choix de remplacer f par son interpolé P1 aux points du maillage, i.e. on
N Som

approche f par la fonction ∑ f (S I )ΦI .

I =1

Question 5. En approchant f par son interpolé, donner une approximation du second

membre F faisant intervenir la matrice de masse.

On admet que cette approximation ne change pas l'approximation par éléments finis

du problème.

Validation : calcul d'une solution connue

On considère f tel que la fonction

u(x, y) = cos(πx) cos(2πy)

est solution du problème (P N ) dans Ω = [0, 2] × [0, 2].

Question 6. Construire dans le programme une fonction f (x, y) définissant le second

membre f et calculer l'approximation du vecteur F obtenue comme expliqué dessus.

Calculer le vecteur U des coefficients de la solution approchée donnée par la

méthode des élements finis et utiliser le code suivant pour la visualiser. Visualiser

aussi la solution exacte.

In [3]: # A compléter

# pour réprensenter la solution u

#plt.figure(2)
#plt.gca().set_aspect('equal')
#plt.tripcolor(triang.x,triang.y,triang.triangles, u, shading='flat')
#plt.colorbar()
#plt.title('solution approchee par EF P1')

N Som

Question 7. Soit Πh u = ∑ u(S I )ΦI l'interpolé P1 de la solution exacte u de (P N )

I =1
2 1
aux points S I . Calculer, pour différentes valeurs de h, les normes L et H de

l'erreur uh − Πh u. Remarquer que ces normes peuvent se calculer en utilisant les

matrice de masse et de rigidité M et K . Evaluer l'ordre de précision de la méthode


2
en norme L et en norme H1 .

D'autres structures de maillage

Vous pouvez remplacer le debut de votre programme par le code ci-dessus, pour

générer un maillage non structuré du carré...

https://www.imo.universite-paris-saclay.fr/~filipa.caetano/EF2D.html 7/12
29/11/2023 14:10 EF2D

In [5]: Nx=18
Ny=18

x_m=0.
x_M=2.
y_m=0.
y_M=2.

Rx=rd.random([Nx+2,Nx+2])
Rx[:,0]=0
Rx[:,-1]=0
Ry=rd.random([Ny+2,Ny+2])
Ry[0,:]=0
Ry[-1,:]=0
x=np.linspace(x_m,x_M,Nx+2)#+4*((x_M-x_m)/(5*(Nx+2)))*Rx
y=np.linspace(y_m,y_M,Ny+2)#+4*((y_M-y_m)/(5*(Ny+2)))*Ry

X,Y=np.meshgrid(x,y)
X=X+0.9*((x_M-x_m)/((Nx+2)))*Rx
Y=Y+0.9*((y_M-y_m)/((Ny+2)))*Ry

X=X.flatten()
Y=Y.flatten()

triang = tri.Triangulation(X, Y)

NTri=np.shape(triang.triangles)[0]
NSom=np.shape(triang.x)[0]

#Tableau avec coordonnes des noeuds


TabSom=np.zeros([NSom,2])
TabSom[:,0]=triang.x
TabSom[:,1]=triang.y

# Tableau avec noeuds des triangles


TabTri=triang.triangles

plt.figure(1)
plt.gca().set_aspect('equal')
plt.triplot(X,Y,triang.triangles, 'b-', lw=0.5)
plt.title('maillage')

plt.show()

https://www.imo.universite-paris-saclay.fr/~filipa.caetano/EF2D.html 8/12
29/11/2023 14:10 EF2D

D'autres structures de maillage

... Ou par celui-ci, pour discrétiser le problème (P N ) posé dans une coronne.

In [6]: def triangulation_couronne(nrad=8,nang=36):


radii = np.linspace(0.25, 1, nrad)
angles = np.linspace(0, 2*np.pi, nang, endpoint=False)
angles = np.repeat(angles[..., np.newaxis], nrad, axis=1)
angles[:, 1::2] += np.pi/nang
x = (radii*np.cos(angles)).flatten()
y = (radii*np.sin(angles)).flatten()

# On construit une triangulation de Delaunay et on filtre les triangles proches de l'origine


triang = tri.Triangulation(x, y)
xmid = x[triang.triangles].mean(axis=1)
ymid = y[triang.triangles].mean(axis=1)
mask = xmid*xmid + ymid*ymid >= .25*.25
T = triang.triangles[mask,:]
return x,y,T

[x,y,T] = triangulation_couronne(8,36)

NTri=np.shape(T)[0]
NSom=np.shape(x)[0]

TabSom=np.zeros([NSom,2])
TabSom[:,0]=x
TabSom[:,1]=y

# noeuds des triangles


TabTri=T

plt.figure(1)
plt.gca().set_aspect('equal')
plt.triplot(x,y,T, 'b-', lw=0.5)
plt.title('maillage')

plt.show()

# .... Le programme

https://www.imo.universite-paris-saclay.fr/~filipa.caetano/EF2D.html 9/12
29/11/2023 14:10 EF2D

II - Conditions aux limites de Dirichlet ¶

On s'intéresse maintenant à la résolution approchée du problème aux limites suivant

pour l'équation de Poisson, cette fois-ci avec conditions aux limites de Dirichlet

homogène :

− Δu + u = f , dans Ω,
(P ) {
u = 0, dans ∂ Ω
¯
¯¯¯ 2 2
où f : Ω ⟶ R est une fonction de classe C donnée et où Ω est un ouvert de R

donné.

Question 1. Écrire la formulation variationnelle du problème (P ) sous la forme

u ∈ V tel que
(P v) {
a(v, u) = L(v), ∀ v ∈ V,
1
où V = H (Ω), a est une forme bilinéaire dans V et L une forme linéaire de V , que
0

l'on explicitera.

Comme dans le cas du problème de Neumann, on considère une triangulation Th du


1 1
domaine Ω et on considère Vh l'approximation de H (Ω) par des éléments finis P

associés à la triangulation Th , introduite lors de l'étude du problème de Neumann.

On note {TN } N =1,…,N tri les triangles de Th , {S I } I =1,…,N Som les sommets des

triangles la triangulation et {ΦI } I =1,…,N Som les fonctions de la base de Vh définies

par ΦI (S J ) = δ I J , I , J = 1, … , N S om.

0 1
L'espace V que l'on considèrera pour approcher H sera constitué des éléments
h 0

ΦI de la base de Vh tels que I n'est pas un sommet appartenant au bord ∂ Ω de Ω.

Pour cela, il faut tout d'abord référencer les sommets I qui sont dans le bord.

Question 2. Compléter le code générateur du maillage de Ω donné à la partie I, qui

génère le maillage et les tableaux T abT ri, contenant la liste des triangles, et

T abS om, contenant les coordonnées de chaque sommet de la triangulation, pour

créer un tableau Ref S om, de taille N S om × 1 , que dans chaque ligne I prendra la

valeur 1 si le sommet I appartient à ∂ Ω , et 0 sinon.

https://www.imo.universite-paris-saclay.fr/~filipa.caetano/EF2D.html 10/12
29/11/2023 14:10 EF2D

On note

S 0 = {I ∈ {1, … , N S om} : S I ∉ ∂ Ω}

l'ensemble contenant les sommets de la triangulation appartenant à l'intérieur de Ω.

On définit alors

0
V = V ect({ΦI : I ∈ S 0 }).
h

0
Le problème discret consiste alors à chercher uh ∈ V tel que
h

(Ph ) a(ΦI , uh ) = L(ΦI ), ∀ I ∈ S0 .

Ces équations originent un système matricielle à résoudre AU = F , avec

AI J = a(ΦJ , ΦI ), FI = L(ΦI ), pour I , J ∈ S 0 . Il s'agit d'un système analogue à celui

de la discrétisation du problème de Neumann, mais dont la matrice est de taille égale

au cardinal de S 0 , au lieu de taille N S om .

En pratique on ne construit pas cette matrice de taille plus petite. On va construire

une matrice de taille N S om , contenant les termes AI J = a(ΦJ , ΦI ) correspondant

aux sommets du bord ∂ Ω , mais on va la modifier dans les lignes et colonnes

correspondant à ces noeuds. On fait le même pour le vecteur F . On obtient un

système matricielle de taille N S om et on le modifie de sort à ce que, si I ∉ S 0 ,

l'équation I de ce système soit la condition de Dirichlet

U I = 0.

Pour ce faire, on modifie la valeur de FI en la mettant à 0, et on modifie les ligne et

colonne I de A en mettant tous ses coefficients à 0 , à l'exception du coefficient AI I

que l'on met par exemple égal à 1 .

Cette méthode est connue sous le nom de pseudo-élimination.

Question 3. Construire un programme qui donne la solution approchée du problème

(Ph ).

Question 4. On considère f tel que la fonction

u(x, y) = sin(πx) sin(2πy)

est solution du problème (P) dans Ω = [0, 2] × [0, 2].

Calculer la solution approchée donnée par la méthode des éléments finis et

représenter graphiquement la solution exacte et la solution approchée. Représenter

dans une autre figure la différence, en valeur absolue, entre les deux solutions.

Diminuer le pas de la discrétisation et refaire l'exercice.

https://www.imo.universite-paris-saclay.fr/~filipa.caetano/EF2D.html 11/12
29/11/2023 14:10 EF2D

III (pour aller plus loin) - Conditions aux limites de


Robin

Réfléchir dans cette partie comment adapter la méthode à un problème aux limites

avec conditions aux limites de Robin :

⎧ − Δu + u = f , dans Ω,
~
(P ) ⎨ ∂ u
⎩ + pu = g, dans ∂ Ω,
∂n

où p > 0 et g une fonction continue sur ∂ Ω donné.

Pour cela :

Écrire la formulation variationelle de ce problème ;

Écrire le problème discret associé à une discrétisation par éléments finis P1

du domaine Ω et le système linéaire correspondant. Celui-ci fait intervenir une

nouvelle matrice de masse surfacique.

Réfléchir à comment faire pour assembler cette nouvelle matrice, à l'image

de ce qu'on fait pour les matrices de masse et de rigidité.

Il faut pour cela accéder au tableau triang.edges qui donne dans chaque ligne les

sommets des arêtes des triangles composant la triangulation, et créer un tableau qui

référence les arêtes qui font partie du bord ∂ Ω .

https://www.imo.universite-paris-saclay.fr/~filipa.caetano/EF2D.html 12/12

Vous aimerez peut-être aussi