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 par éléments d'ne fonction s'écrit globalement:
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 éléments (et donc le même nombre de degré de liberté que dans l'example du paragraphe 3.2.2 avec des éléments ) sont tracées sur la figure (4.20) , ainsi que l'interpolation de la fonction , que l'on comparera avec l'interpolation de la figure (4.13) sur un maillage identique. On constate que l'approximation est meilleure que l'approximation , ce qui est confirmée par la valeur de l'erreur moyenne: (soit plus de 2,5 fois plus faible).
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 . Montrez que dans ce cas la précision de l'approximation est d'ordre 4, i.e. en .