L'approximation par éléments finis
consiste à utiliser
une interpolation polynomiale de degré 2 sur l'élèment de référence
. On utilise les 3 points d'interpolations
,
,
sur
associés à 3 points sur l'élément
: les 2
extrémités du segment
,
, et le milieu du segment
. On notera
les numéros de ces 3
noeuds (figure 4.17).
Sur l'élément de référence, on définit donc 3 fonctions de formes:
qui sont tracées sur la figure ci dessous (figure 4.18).
Une approximation par éléments finis
sur un maillage
de
éléments nécéssite
points nodaux: les
extrémités de segment et les
milieux. On numérote ces points
de 1 à
, et donc un élément
a pour extrémités les sommets
et
de numéro
et
, et
pour noeud milieu le sommet
de numéro
. Les 3
fonctions de base
associées à ces 3
sommets de numéro
sont définies en fonction
des fonctions de formes
à l'aide de la transformation
vers l'élèment de référence (figure 4.19).
L'approximation
et sur chaque élément de sommets
du
maillage:
où les fonctions de base
sont définies à partir
des fonctions de forme
par transformation vers l'élément
de référence
:
Le programme Maple 4.3.1 ci dessous implémente cette interpolation
.
> restart: # Approximation par elements finis 1D P2 > with(linalg): with(plots): # Nombre d'éléments Ne et degre d'approximation par element k > L:=3; Ne:=4; # Maillage et coordonnes des pts de maillages > h:=L/Ne; Xp:=[seq(i*h,i=0..Ne)]; # d=degre d'interpolation elts finis, Nn=Nombre de noeuds, X=coordonnees # des nds > d:=2; Nn:=2*Ne+1;X:=vector(Nn,0): > for i from 1 to Ne do X[2*i-1]:=Xp[i];X[2*i]:=(Xp[i]+Xp[i+1])/2; end: > X[Nn]:=Xp[Ne+1]: > evalm(X); # num=numérotation par élément et long=longueur de chaque element > num:=k->[2*k-1,2*k+1,2*k]; long:=k->Xp[k+1]-Xp[k]; # Fonctions de forme de l'element P2 > N1:=unapply(interp([-1,0,1],[1,0,0],xi),xi); > N2:=unapply(interp([-1,0,1],[0,0,1],xi),xi); > N3:=unapply(interp([-1,0,1],[0,1,0],xi),xi); # Transformation vers l'element de reference [-1,1] > Xi:=(xi,k)->(1-xi)/2*Xp[k]+(1+xi)/2*Xp[k+1]; # Interpolation d'une fonction g(x) sur le maillage > Interpol:=proc(g) > global Nn: > local G,i; > G:=vector(Nn,0): > for i from 1 to Nn do G[i]:=g(X[i]); end; > return evalm(G); > end proc: # Calcul de la norme L2 de l'erreur > Erreur:=proc(f,F) > global Ne,Xp; > local err,k,noi,h; > err:=0.0: > for k from 1 to Ne do > h:=long(k): > noi:=num(k): > err:=err+h/2* > evalf(int((f(Xi(xi,k))-(F[noi[1]]*N1(xi)+F[noi[2]]*N2(xi)+ > F[noi[3]]*N3(xi) ))^2,xi=-1..1)); > end: > return(sqrt(err)); > end: # Example: fonction cos(2x) > f:=x->cos(2*x); > F:=evalf(Interpol(f)); > P1:=plot(f(x),x=0..L): > P2:=plot([seq([X[i],F[i]],i=1..Nn)],style=point,color=blue): > display(P1,P2,title="Approximation P2 de cos(2x)"); > err:=Erreur(f,F);
Dans ce programme, les points du maillage (extrémités des
segments) sont notés Xp, alors que les
points nodaux
(i.e. degré de liberté) sont notés X et sont calculés en
fonction de Xp (ligne 11). La numérotation des 3 points d'interpolation
pour un élément k est donnée par la fonction num (ligne 15).
Les 3 fonctions de forme sont calculées comme polynômes de Lagrange
(lignes 17,18,19). Le changement de variable vers l'élément de référence
est définie à la ligne 21, et la fonction d'interpolation à la ligne
23 (ce sont les mêmes que pour l'interpolation
.
Par contre le calcul de l'erreur moyenne d'interpolation (ligne 31)
est différente de la fonction
, puisque l'on fait
explicitement intervenir les fonctions de forme par élément.
Les fonctions de base pour un maillage avec
En suivant l'approche générale précédente, l'approximation
de la solution
du problème (4.20) s'écrit:
Elle vérifie la formulation faible discrète (4.23), qui est
équivalente à un système linéaire de dimension :
L'expression des coefficients de A et B est la même
que dans la relation (4.23), mais les fonctions
sont maintenant les fonctions de base
définies
précédemment. Comme avec les éléments finis
du
paragrape 4.2, nous construirons tout d'abord la matrice
A et le second membre B sans tenir compte des conditions
aux limites, en calculant des matrices et des seconds membres élémentaires,
puis nous appliquerons les conditions aux limites.
Les matrices élémentaires de raideur
et de masse
pour un élément
sont données par les relations
(4.24) et (4.25) avec
. Ce sont des matrices
dont le calcul général est éffectué par les 2 fonctions Maple
MatRigidite (programme 4.2.4) et MatMasse
(programme 4.2.4).
Dans le cas où le coefficient est constant par élément, la
matrice élémentaire de raideur
s'écrit:
De même si le coefficient est constant par élément, la
matrice élémentaire de masse
s'écrit:
Exercice: démontrer les deux résultats précédents.
Le second membre élémentaire pour un élément est donné par
la relation générale (4.26) avec
. Pour le calcul
on utilise la fonction Maple SmbElem (programme 4.2.5).
L'expression obtenue pour ce second membre élémentaire en
s'écrit:
Exercice: démontrer cette relation.
La procédure d'assemblage reprend l'algorithme général (4.2.6).
Ainsi pour le maillage de éléments et
noeuds de la
figure 4.21, la matrice élémentaire
de
l'élémentaire
contribue aux éléments suivants de la matrice
A :
On notera que la numérotation des noeuds sur l'élément est
dans l'ordre
alors que sur l'élément de référence la numérotation
est
(on numérote d'abord les extrémités puis le milieu).
On a a donc
,
et
.
Les conditions aux limites sont imposées de la même façon qu'au paragraphe 4.2.7, et on utilise le programe Maple (programme 4.2.7).
En utilisant ces programmes Maple avec , sur le maillage de
la figure (4.21) qui contient
éléments (soit
inconnues), on obtiens la matrice
suivante:
et un second membre :
La solution obtenue vaut:
Les valeurs nodales de la solution sont très proche de la solution
exacte, ce que confirme le calcule de l'erreur moyenne qui est encore
plus faible qu'avec l'approximation
(
au lieu de
). Mais la grande différence avec l'approximation
se trouve sur le calcul du flux en
: on
trouve un flux égale à
(au lieu de
en
),
très proche de la valeur exacte
. Dans ce cas l'approximation
apporte une meilleure précision sur la dérivée
en
, que l'approximation
.
Pour quantifier cette étude, nous avons tracé l'erreur relative moyenne
et l'erreur relative sur la condition
aux limites en
en fonction du nombre d'éléments
du maillage.
Les résultats sont tracés en échelle logarithmique sur la figure (4.22)
que l'on comparera avec la figure(4.16). On constate que
l'erreur relative moyenne varie en
(soit en
)
(comparaison avec une droite de pente
), et que l'erreur relative
sur la condition aux limites varie en
(soit aussi
en
) . La précision de l'approximation
est donc d'ordre 3, i.e. en
, alors que la précision
de l'approximation
est d'ordre 2, i.e. en
(on a noté
la taille caractéristique des éléments
)
Exercice: modifier le programme Maple précédent pour faire l'étude avec des éléments