Méthode des éléments finis en 1D
Méthode des éléments finis en 1D
1 Introduction 1
2 Motivation et prérequis 2
5 Annexe 16
5.1 Code pour le cas k = 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
5.2 Code pour l’erreur dans le cas k=1 . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
5.3 Code pour le cas k = 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
5.4 Code pour l’erreur dans le cas k=2 . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
5.5 Preuve du théorème 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
5.6 Résultats plus généraux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
1 Introduction
On veut étudier la méthode des éléments finis en dimension 1 pour l’équation
(
−u00 = f sur [0, 10]
u(0) = u(10) = 0
On commencera, en partie 2, par des aspects théoriques sur la méthode des éléments finis qui
motiveront cette étude.
Ensuite, on traitera dans deux grandes parties 3 et 4, les méthodes liées aux polynômes de
Lagrange de degrés 1 et 2 sur des maillages uniforme et non uniforme. L’exemple de maillage non
uniforme qu’on donnera est donné par
Dans chacune des deux parties 3 et 4, on aura une implémentation de la méthode avec, pour
fonction f , la fonction x 7→ sin(πx) sur [0, 10]. Puis pour ce problème, on étudiera l’ordre de
convergences des méthodes pour les normes k · kL2 et k · kH 1 (que l’on abrègera en norme L2 et
norme H 1 ) pour les deux maillages (uniforme et non uniforme).
1
Enfin, en annexe 5, on donnera le code qui permet d’effectuer les simulations, ainsi que la preuve
du théorème 2.
L’implémentation se fera dans le langage Python, c’est pourquoi les indices du code commencent
à 0.
La plupart des résultats que l’on présente ici sont des restrictions de théorèmes plus généraux
(par exemple, le lemme de Céa, les majorations d’erreur), mon objectif étant de bien comprendre
les résultats dans notre cadre d’application (Lagrange 1 et 2, pour les normes L2 et H 1 avec des
maillages uniforme et non uniforme). On présente en annexe l’énoncé général de certains résultats
(voir 5.6).
2 Motivation et prérequis
Soit I = [0, 10] et l’équation
(
−u00 = f sur I
(1)
u(0) = u(10) = 0
On veut utiliser une méthode de Galerkin, en se donnant un sous espace de dimension finie Vh
(pour h > 0) de V = H01 (I) qui tend vers V quand h tend vers 0 dans un certain sens.
On veut donc résoudre le problème suivant :
(
Trouver uh ∈ Vh tel que
(3)
∀vh ∈ Vh , a(uh , vh ) = b(vh )
pour (uj )N N
j=1 ∈ R .
N
X
On a donc a(uh , φi ) = uj a(φj , φi ) = b(φi ) pour tout i ∈ {1, . . . , N }, ce qui peut se réécrire
j=1
en
Ah Uh = Fh
avec (Ah )i,j = a(φj , φi ), (Uh )i = ui et (Fh )i = b(φi ).
2
Dans notre cas, pour résoudre (1), on a
Z
(Ah )i,j = φ0i (x)φ0j (x)dx
ZI
(Fh )i = f (x)φi (x)dx
I
Tout le but des parties suivantes sera de résoudre cette équation avec des Vh différents (et donc
des bases (φi ) différentes) et d’étudier les propriétés de convergence entre la solution uh de (3) et
la solution u de (2) quand h tend vers 0.
x0 x1 x2 x3 x4 x5 x6 x7 x8
3
Il faut se donner une base de Vh,1 .
1 φi
x0 x1 xi−1 xi xi+1 xN xN +1
1 φ0
x0 x1 xN xN +1
1 φN +1
x0 x1 xN xN +1
1 1
ϕ0 ϕ1
0 1 0 1
4
Ainsi, pour une cellule K = [α, β] de τ , on peut définir la transformation affine
(
K̂ → K
FK : .
x̂ 7→ x̂β + (1 − x̂)α
On va donc pouvoir se servir de cette formule sur la cellule de référence pour calculer toutes les
intégrales de la matrices Ah . De même, on peut faire le même type de calcul pour calculer Fh .
5
x0 x5x6 x7 x8 x9 x10 x11 x12 x13 x14 x15 x16
Exemple pour N = 15
On représente ensuite les cellules par une liste de tableaux de la forme [i, i + 1] où i varie entre
0 et N .
Pour la matrice Ah , j’ai choisi de créer une matrice A de taille (N + 2) × (N + 2) pour traiter
les cas aux bords, puis d’extraire la sous matrice Ah de taille N × N en enlevant
Z les bords de A.
J’ai choisi d’utiliser la méthode de Simpson pour approcher l’intégrale ϕ0l (x̂)ϕ0m (x̂)dx̂.
K̂
On a alors
Z
1 0
ϕ0l (x̂)ϕ0m (x̂)dx̂ ' ϕl (0)ϕ0m (0) + 4ϕ0l (1/2)ϕ0m (1/2) + ϕ0l (1)ϕ0m (1)
K̂ 6
On présente maintenant les résultats pour les deux maillages présentés ci-dessus, pour N ∈
{20, 60, 200}.
N = 20 N = 20
6
N = 60 N = 60
N = 200 N = 200
La méthode semble donc converger. Dans la partie suivante, on va quantifier cette convergence
et calculer l’ordre de la convergence pour les normes L2 et H 1 .
3.3.1 En théorie
Lemme 1 (de Céa). Pour u la solution de (1), uh solution de (3) et Πh (u) la projection de u sur
l’espace Vh,1 , on a
M
ku − uh kH 1 6 ku − Πh (u)kH 1
α
où M est la constante de continuité de a, α est la constante de coercivité de a avec a la forme
bilinéaire de (2).
7
puisque u et uh sont solutions de (1) et (3).
En soustrayant, on a donc
a(u − uh , uh − Πh (u)) = 0.
Par coercivité de a, on a
αku − uh k2H 1 6 a(u − uh , u − uh ) + a(u − uh , uh − Πh (u))
| {z }
=0
6 a(u − uh , u − Πh (u))
6 M ku − uh kH 1 ku − Πh (u)kH 1
Ainsi on a
M
ku − uh kH 1 6 ku − Πh (u)kH 1 .
α
Théorème 1. Pour u solution H 2 (I) de (1) et Πh (u) la projection de u sur l’espace Vh,1 , on a
Démonstration.
Étape 1 : Montrons que ku0 − Πh (u)0 kL2 6 hku00 kL2 .
On va raisonner par densité, on suppose ici que u est C ∞ .
XN Z xi+1
0 0 2
ku − Πh (u) kL2 = (u0 (x) − Πh (u)0 (x))2 dx (5)
i=0 xi
8
Ainsi, en injectant dans l’égalité (5), on a
2
0
ku − Πh (u)0 k2L2 6 max hi ku00 k2L2 .
i∈J0,N K
En passant à la racine, on a
ku0 − Πh (u)0 kL2 6 hku00 kL2 .
Ainsi
ku − Πh (u)k2L2 6 h4 ku00 k2L2 .
En passant à la racine carrée, on obtient
Étape 3 : Conclusion.
ku − uh kH 1 (I) 6 Ch
9
Démonstration. On a, par le lemme de Céa et par le fait que −u00 = f , les inégalités suivantes :
M
ku − uh kL2 (I) 6 ku − Πh (u)kL2 (I)
α
6 C 0 h2 ku00 kL2 en utilisant la preuve du théorème 1
6 C 0 h2 kf kL2
6 C 00 h2 avec C 00 = C 0 kf kL2
et
M
ku − uh kH 1 (I) 6 ku − Πh (u)kH 1 (I)
α
MC
6 C 0 hku00 kL2 avec C 0 =
α
6 C 0 hkf kL2
6 C 00 h avec C 00 = C 0 kf kL2
3.3.2 En pratique
On va maintenant calculer numériquement les erreurs entre la solution exacte et la solution
approchée en normes L2 et H 1 . Pour cela, on calcule la norme L2 de u − uh 1 en utilisant la fonction
quad du module [Link] de Python. On va donner la fonction uh explicitement grâce à la
fonction uh_k1 (voir annexe 5.2). De plus, pour calculer la norme H 1 , il faut calculer u0h qui sera une
fonction constante par morceaux qui vaut sur chaque [xi , xi+1 ] du maillage le coefficient directeur
de la pente entre uh (xi ) et uh (xi+1 ). On donne cette fonction explicitement grâce à uhprim_k1 (voir
annexe 5.2).
On va de nouveau faire une distinction entre les cas où le maillage sera uniforme ou non uniforme.
10
On résume les résultats en donnant le coefficient directeur moyen des pentes pour les différentes
simulations.
x0 x1 x2 x3 x4 x5 x6 x7 x8
Il faut se donner une base de Vh,2 . Pour chaque cellule K = [xj , xj+1 ], on va rajouter un point
au milieu xej , afin d’avoir trois points sur chaque cellule. Ainsi, comme il existe un unique polynôme
de degré au plus deux qui passe par trois points distincts, on va pouvoir trouver 3 polynômes pour
chaque cellule tels que chaque polynôme vaut 1 sur un des trois points et 0 sur les deux autres. On
décrit les trois fonctions ϕ0 , ϕ01 et ϕ1 pour la cellule de référence K̂ = [0, 1].
11
1 1 1
ϕ01
ϕ0 ϕ1
On peut ensuite utiliser les mêmes calculs que pour la méthode de Lagrange avec des polynômes
de degré au plus 1, il faut juste faire varier m, l dans {0, 1, 2} dans les intégrales que l’on considère.
Si on veut représenter la base de Vh,2 que l’on s’est donnée, on tracerait les 2N + 1 fonctions
suivantes (car Vh,2 est de dimension 2N + 1).
On a les N fonctions (φi )Ni=1 :
1 φi
x0 x1 xi−1 xi xi+1 xN xN +1
1 φei
x0 x1 xi−1 xi xi+1 xN xN +1
J’ai choisi d’implémenter le maillage par une liste qui contient les 2N + 3 points rangés telle que
les N points du maillage sont au début (rangés dans l’ordre croissant), puis on met les N + 1 points
milieux (par ordre croissant) et enfin les deux bords.
Pour un maillage uniforme, on aura
Nodes_2_uni = Nodes_1_uni[1:-1]
+ [(Nodes_1_uni[i] + Nodes_1_uni[i+1])/2 for i in range (n+1)] + [0,10]
12
Nodes = [1.66, 3.33, 5.0, 6.66, 8.33, 0.83, 2.5, 4.16, 5.83, 7.5, 9.16, 0, 10]
Exemple pour N = 5
Nodes = [0.22, 0.90, 2.10, 3.92, 6.48, 0.11, 0.56, 1.50, 3.01, 5.20, 8.24, 0, 10]
Exemple pour N = 5
On représente ensuite les cellules par une liste de tableaux de la forme [i, i + 1, i + n + 1] où i
varie entre 0 et N − 2. Ainsi on place le début de la cellule, la fin de la cellule puis le milieu de
la cellule. Les deux cellules du bords sont donc de la forme [31, 0, 15] et [14, 32, 30] dans
l’exemple où N = 15.
Pour la matrice Ah , j’ai choisi de créer une matrice Ah de taille N × N cette fois-ci et de gérer
les bords dans la boucle de calcul des coefficients.
On peut donc calculer la matrice Ah en faisant une boucle sur les cellules, puis en faisant varier
1
ϕ0 (x̂)ϕ0m (x̂)dx̂ à Al,m si les indices
R
l et m dans l’ensemble {0, 1, 2} et en ajoutant
xj+1 − xj K̂ l
correspondant à la cellule ne sont pas dans le tableau Bords.
De même, on calcule le vecteur colonne Fh de taille N en faisant attention aux bords.
Enfin on résout le système Ah Uh = Fh pour obtenir notre solution à l’aide la bibliothèque numpy
et de la commande Uh = [Link](Ah, Fh).
On présente maintenant les résultats pour les deux maillages présentés ci-dessus, pour N ∈
{20, 60, 200}.
13
Maillage uniforme Maillage non uniforme
N = 20 N = 20
N = 60 N = 60
N = 200 N = 200
Comme dans la partie précédente, la méthode semble converger. Dans la section suivante, on va
quantifier cette convergence et calculer l’ordre de la convergence pour les normes L2 et H 1 .
14
4.3 Analyse numérique
On veut donner une estimation de l’erreur de notre approximation.
4.3.1 En théorie
Théorème 2. Pour u solution H 3 (I) de (1) et Πh (u) la projection de u sur l’espace Vh,2 , on a
Démonstration. Semblable à la preuve du théorème 1. Pour la preuve détaillée, voir l’annexe 5.5.
ku − uh kH 1 (I) 6 Ch2
4.3.2 En pratique
On va maintenant calculer numériquement les erreurs entre la solution exacte et la solution
approchée en normes L2 et H 1 . Pour cela, on calcule la norme L2 de u − uh 2 en utilisant toujours la
fonction quad du module [Link] de Python. On va donner la fonction uh explicitement
grâce à la fonction uh_k2 (voir annexe 5.4) en interpolant entre les 3 points xi , xei et xi+1 . De plus,
pour calculer la norme H 1 , il faut calculer u0h qui sera une fonction affine par morceaux. On donne
cette fonction explicitement grâce à uhprim_k2 (voir annexe 5.4).
On va continuer de faire une distinction entre les cas où le maillage sera uniforme ou non
uniforme.
On résume les résultats en donnant le coefficient directeur moyen des pentes pour les différentes
simulations.
2. où u est la solution exacte et uh la solution approchée calculée par la méthode des éléments finis
15
On a donc une différence entre les résultats théoriques et les simulations pour la norme L2 .
Cependant, pour la norme H 1 , les simulations coı̈ncident avec les résultats théoriques.
La différence de résultats pour la norme L2 vient sans doute d’une erreur d’approximation
d’intégrale que l’on effectue dans la méthode des éléments finis. En effet, dans la partie théorique,
on calcule l’erreur pour la fonction uh qui est donnée par la résolution du système Ah Uh = Fh . Or,
dans la pratique, pour calculer Ah , on a utilisé une méthode de Simpson qui introduit une erreur
de calcul numérique. Cette erreur a été négligée dans la partie théorique.
5 Annexe
5.1 Code pour le cas k = 1
from math import *
import numpy as np
from [Link] import quad
import [Link] as plt
n=20
a=0
b=10
def f(x):
return sin(pi*x)
def solution_exacte(x):
return f(x)/(pi*pi)
16
#Calcul de A_h
A = [Link]((n+2,n+2))
for k in range (len(Cells_1)):
for i in range(2):
for j in range(2):
A[Cells_1[k][i]][Cells_1[k][j]] += 1/(abs(Nodes_1[Cells_1[k][1]]-
Nodes_1[Cells_1[k][0]]))*6*(DerRefBasisFct(0, 1)[i]*
DerRefBasisFct(0, 1)[j]+4*DerRefBasisFct(1/2, 1)[i]*
DerRefBasisFct(1/2, 1)[j]+DerRefBasisFct(1, 1)[i]*DerRefBasisFct(1, 1)[j])
A= [Link](A)
A = A[1:-1,1:-1]
#Calcul de F_h
F = [Link](n+2)
for k in range (len(Cells_1)):
for i in range(2):
F[Cells_1[k][i]] += (Nodes_1[Cells_1[k][1]]-Nodes_1[Cells_1[k][0]])*6*
(RefBasicFct(0,1)[i]*f(Nodes_1[Cells_1[k][1]])+4*RefBasicFct(1/2,1)[i]*
f(1/2*Nodes_1[Cells_1[k][0]]+(1/2)*Nodes_1[Cells_1[k][1]])+
RefBasicFct(1,1)[i]*f(Nodes_1[Cells_1[k][0]]))
F = [Link](F)
F = F[1:-1]
#solution approchée
U = [Link](A, F)
sol = [Link](n+2)
for i in range (1,n+1):
sol[i] = U[i-1]
17
S+= ((b[i+1]-b[i])/(a[i+1]-a[i]))
return S/(len(a)-1)
def erreur_k1_H1(n):
Nodes_1 = [b*i/(n+1) + (1-i/(n+1))*a for i in range(n + 2)]
#Nodes_1 = [x*b/(n+1)* sinh(x/n)/sinh((n+1)/n) for x in range (n + 2)]
sa = resol_k1(n)
def g(x):
return uh_k1(sa, Nodes_1, x)
def gprim(x):
return uhprim_k1(sa, Nodes_1, x)
return sqrt(quad(lambda x : (g(x)-f(x)/(pi*pi))**2, a, b)[0])
+sqrt(quad(lambda x : (gprim(x)-cos(x*pi)/(pi))**2, a, b)[0])
def trace_erreur_k1(norm):
xlinspace = [Link]([100,200,500,800, 1000, 3000])
def maxliste(L):
max = L[1] - L[0]
18
for i in range (len(L) - 1):
if (L[i+1] - L[i]) > max :
max = L[i+1] - L[i]
return max
#H = [maxliste([x*b/(n+1)* sinh(x/n)/sinh((n+1)/n) for x in range (n+2)])
for n in xlinspace]
H = [maxliste([b*i/(n+1) + (1-i/(n+1))*a for i in range(n+2)]) for n in xlinspace]
if norm == "L2":
Erreur = [erreur_k1_L2(n) for n in xlinspace]
[Link]()
[Link]([log(h) for h in H], [log(x) for x in Erreur])
[Link]()
if norm == "H1":
Erreur = [erreur_k1_H1(n) for n in xlinspace]
[Link]()
[Link]([log(h) for h in H], [log(x) for x in Erreur])
[Link]()
return moy_coef([log(h) for h in H], [log(x) for x in Erreur])
n=20
a=0
b=10
def f(x):
return sin(pi*x)
def solution_exacte(x):
return f(x)/(pi*pi)
19
def RefBasicFct(x, k):
if k == 1:
return [Link]([x, 1-x])
if k == 2:
return [Link]([2*(x-1/2)*(x-1), 2*(x-1/2)*x, -4*x*(x-1)])
#Calcul de A_h
A_2 = [Link]((2*n+1,2*n+1))
for k in range (len(Cells_2)):
for i in range(3):
for j in range(3):
I = Cells_2[k][i]
J = Cells_2[k][j]
if I not in Bords and J not in Bords:
A_2[I][J] += 1/(abs(Nodes_2[Cells_2[k][1]]-Nodes_2[Cells_2[k][0]]))*6*
(DerRefBasisFct(0, 2)[i]*DerRefBasisFct(0, 2)[j]+4*
DerRefBasisFct(1/2, 2)[i]*DerRefBasisFct(1/2, 2)[j]+
DerRefBasisFct(1, 2)[i]*DerRefBasisFct(1, 2)[j])
A_2 = [Link](A_2)
#Calcul de F_h
F_2 = [Link](2*n+1)
for k in range (len(Cells_2)):
for i in range(3):
I = Cells_2[k][i]
if I not in Bords:
F_2[I] += (Nodes_2[Cells_2[k][1]]-Nodes_2[Cells_2[k][0]])*6*
(RefBasicFct(0,2)[i]*f(Nodes_2[Cells_2[k][1]])+
4*RefBasicFct(1/2,2)[i]*
f(1/2*Nodes_2[Cells_2[k][0]]+1/2*Nodes_2[Cells_2[k][1]])
+RefBasicFct(1,2)[i]* f(Nodes_2[Cells_2[k][0]]))
F_2 = [Link](F_2)
20
#Calcul de U_h
U_2 = [Link](A_2, F_2)
def reordonne(a,n):
V = [Link](len(a))
for i in range(n):
V[2*i+1] = a[i]
for i in range(n+1):
V[2*i] = a[i+n]
return V
21
return fc/((c-a)*(c-b))*(x-a)*(x-b) + fa/((a-b)*(a-c))*(x-b)*(x-c)
+ fb/((b-a)*(b-c))*(x-a)*(x-c)
def erreur_k2_L2(n):
Nodes_1 = [b*i/(n+1) + (1-i/(n+1))*a for i in range(n+2)]
Nodes_2 = Nodes_1[1:-1] +
[(Nodes_1[i] + Nodes_1[i+1])/2 for i in range (n+1)] + [a,b]
sa = resol_k2(n)
solution = [Link](([Link](
([Link]([0]),sa)),[Link]([0])))
segment = [Link](([Link](
([Link]([a]),reordonne(Nodes_2[:-2],n))),[Link]([b])))
def g(x):
return uh_k2(solution,segment,x)
return sqrt(quad(lambda x : (g(x) - f(x)/(pi*pi))**2,a,b)[0])
def erreur_k2_H1(n):
Nodes_1 = [b*i/(n+1) + (1-i/(n+1))*a for i in range(n+2)]
Nodes_2 = Nodes_1[1:-1] +
[(Nodes_1[i] + Nodes_1[i+1])/2 for i in range (n+1)] + [a,b]
sa = resol_k2(n)
solution = [Link](([Link](
([Link]([0]),sa)),[Link]([0])))
segment = [Link](([Link](
([Link]([a]),reordonne(Nodes_2[:-2],n))),[Link]([b])))
def g(x):
return uh_k2(solution,segment,x)
22
def gprim(x):
return uhprim_k2(solution,segment,x)
return sqrt(quad(lambda x : (g(x)-f(x)/(pi*pi))**2,a,b)[0])
+ sqrt(quad(lambda x : (gprim(x)-cos(x*pi)/(pi))**2,a,b)[0])
def trace_erreur_k2(norm):
xlinspace = [Link]([100,200,500,800, 1000, 3000])
if norm == "infini":
Erreur = [erreur_k2_infini(n) for n in xlinspace]
[Link]()
[Link]([log(1/n) for n in xlinspace],[log(x) for x in Erreur])
[Link]()
if norm == "L2":
Erreur = [erreur_k2_L2(n) for n in xlinspace]
[Link]()
[Link]([log(1/n) for n in xlinspace],[log(x) for x in Erreur])
[Link]()
if norm == "H1":
Erreur = [erreur_k2_H1(n) for n in xlinspace]
[Link]()
[Link]([log(1/n) for n in xlinspace],[log(x) for x in Erreur])
[Link]()
return moy_coef([log(1/n)for n in xlinspace],[log(x) for x in Erreur])
23
Z xi+1 Z xi+1
00 00
(u (x) − Πh (u) (x)) dx = 2
(u00 (x) − u00 (yi ))2 dx
xi xi
Z xi+1 Z x 2
(3)
= u (t)dt dx
x y
Z ixi+1 Z ix Z x
(3) 2
6 u (t) dt 1dt dx par Cauchy–Schwarz
x yi yi
Z ixi+1 Z x
6 hiu(3) (t)2 dt dx
x y
Z ixi+1 Z ixi+1
(3) 2
6 hi u (t) dt dx
xi xi
Z xi+1 Z xi+1
(3) 2
6 hi u (t) dx dt par Fubini
xi xi
Z xi+1
6 h2i u(3) (t)2 dt (9)
xi
En passant à la racine, on a
ku00 − Πh (u)00 kL2 6 hku(3) kL2 .
Ainsi
ku0 − Πh (u)0 k2L2 6 h4 ku(3) k2L2 .
En passant à la racine carrée, on obtient
24
Étape 3 : Montrons que ku − Πh (u)kL2 6 h3 ku(3) kL2 .
N Z xi+1
X
ku − Πh (u)k2L2 = |u(x) − Πh (u)(x)|2 dx
i=0 xi
M
ku − uh kV 6 inf ku − vh kV
α vh ∈Vh
où M est la constante de continuité de a, α est la constante de coercivité de a avec a la forme
bilinéaire de (2).
Théorème 3. Pour u solution H k+1 (I) de (1) et Πh (u) la projection de u sur l’espace Vh des
polynômes de degré au plus k par morceaux sur un maillage τh , on a
25