Calcul scientifique TP4 : Eléments finis

B. Aoubiza & M.R. Laydi ENS2M

Résolution d'un problème modèle par l'élément fini $\QTR{cal}{P}_{1}$

On considère le problème à données régulières suivant
MATH
dont la formulation variationnelle est
MATH
$\ $
MATH
On note $\QTR{cal}{P}_{1}$, l'espace des polynômes de degré $\leq 1$, i.e. $\QTR{cal}{P}_{1}$ est l'espace engendré par les monômes MATH

Maillage :

On découpe MATH en $n+1$ intervalles $e$ de longueur $h=\frac{L}{n+1}$ et on pose $x_{i}=ih,$ $0\leq i\leq n+1$.
MATH
Sur chaque élément MATH, tout polynôme de degré $1$ MATH, MATH, s'écrit
MATH
Posons MATH et MATH dont les graphes sont :


MATH
on obtient
MATH

Fonctions de base :

Introduisons les fonctions de base $\varphi _{k},$ $k=0,1,..,n+1$, définies par
MATH
Remarquer que MATH pour $i,j=0,1,..,n+1.$

Espace approché :

On note $\QTR{cal}{V}_{h}$ l'espace engendré par les fonctions de base $\varphi _{k},$ $k=0,1,..,n+1$. Donc MATH et
MATH

Problème approché :

Le problème approché consiste à chercher
MATH
vérifiant
MATH
i.e.
MATH
Le problème est donc de trouver MATH tel que
MATH

Matrice du système et matrices élémentaires

Calculons les coefficients du système ci-dessus qui sont donnés par
MATH
Comme MATH on obtient pour $i,j=1,...,n$
MATH

MATH

Ainsi le calcul des $a_{j,k}$ revient à évaluer pour chaque élément $e$ la matrice élémentaire
MATH
et donc
MATH

Second membre du système et seconds membres élémentaires

Calculons maintenant les composantes du second membre du système
MATH
Le terme MATH est défini par
MATH
Comme MATH le calcul des $b_{j}$ revient à évaluer le second membre élémentaire
MATH
Ainsi, on obtient MATH
MATH
Donc
MATH

Exemple

Pour le maillage ci-dessous où $n=3,$
MATH

Le système algébrique à résoudre s'obtient en trois étapes :

  1. On calcule les matrices et seconds membres élémentaires pour chaque élément :
    MATH

  2. On forme la matrice $A$ et le second membre globales (assemblage), on obtient :
    MATH

  3. On prend en compte les conditions de Dirichlet :

    On rajoute deux équations, c'est-à-dire $u_{0}=\alpha _{0}$ et $u_{4}=\alpha _{L}$. On obtient le système
    MATH

Intégration numérique

Le calcul des matrices et seconds membres élémentaires fait intervenir des calculs d'intégrales. En général, on fait appelle aux méthodes numériques pour les approcher. On utilisera des formules de quadrature de type :
MATH
où les $x_{k}$ sont les abscisses de points choisis dans l'intervalle $\left[ a,b\right] $ et les $w_{k}$ sont les poids correspondants. Exemple de formules de quadrature :

Quelques notations et aides pour la programmation

Description des variables

Maillage et conditions aux bords

coord : Tableau des coordonnées des points
elements : Tableau des degrés de liberté associées a chaque élément
bordD : Tableau des degrés de liberté sur le bord de Dirichlet

Structure de données en 1D

coord.dat elements.dat bordD.dat
%x
$\QTR{tt}{x}_{1}$
$\vdots $
$\QTR{tt}{x}_{n}$
%dl#1 dl#2 ...
n $_{1}^{1}$ n $_{2}^{1}$ ...
$\vdots $
n $_{1}^{m}$ n $_{1}^{m}$ ...
%Point# dl#
n $_{\QTR{tt}{1}}$ dl $_{\QTR{tt}{1}}$
$\QTR{tt}{\vdots }$ $\QTR{tt}{\vdots }$
n $_{\QTR{tt}{D}}$ dl $_{\QTR{tt}{d}}$

Caractéristiques du problème

ntdl Nombre total des degrés de liberté
Numeros Tableau des numéros des degrés de liberté inconnues

Eléments du Système

A Matrice globale
B Second membre globale
Ke Matrice élémentaire
Fe Second membre élémentaire
uh Vecteur solution

Description des fonctions

En général, la résolution par éléments finis des problèmes ci-après nécessite les programmes suivants :

principal Programme d'appel principal
KeFe Sous-programme de calcul de la matrice et second membre élémentaires

Structure du programme principal

La structure du programme principal est la suivante :

  1. Chargement du maillage et informations qui lui sont relatives

  2. Calcul des matrices et des seconds membres élémentaires et leurs assemblages

  3. Prise en compte des conditions aux limites : de Neumann et (ou) de Dirichlet

  4. Résolution du système

  5. Présentation de la solution

Programmes

Programme principal

%==========================================================================
%   -(sigma*u')'+beta*u'+lamda*u = f, dans 0 < x < L                                                                        
%   u(0) = u0  et  u(L) = uL
%==========================================================================
%   Approximation P1
%   ================
%   Les fichiers de donnees : 
%                            <coord.dat>, <elements.dat> et <bordD.dat> 
%   Le sous-programme : 
%                            <KeFe.m> 
%   Les fonctions :
%                            <sigma.m>, <beta.m>, <lamda.m> et <f.m> 
%-------------------------------------------------------------------------
% Descriptions des tableaux  relatives au maillage
%-------------------------------------------------------------------------
%\qquad coord    : coordonnees de points
%              x1    
%              ...  
%   elements : degres de liberte associes a chaque element           
%              dl#1  dl#2  ...
%              ...   ...   ...
%\qquad bordD    : bord de Dirichlet
%              noeud#   dl#1   ...   
%               ...     ...    ...
%--------------------------------------------------------------------------
%   A\qquad \qquad : matrice globale
%   B        : Second membre globale
%\qquad Ke       : matrice elementaire
%   Fe       : Second membre elementaire
%   uh       : vecteur solution
%   Numeros  : numeros des dls inconnues   
%==========================================================================\qquad 
%------------------------------------------------%
% Programmeurs:  B. Aoubiza & R. Laydi (an 2001) %
% Copyright (c)  ENSMM                           %
%                Universite de Franche-Comte     %
%------------------------------------------------%
 clc;        % effacer l'ecran 
 clear all;  % effacer toutes les variables de la section de travail.
%-------------------------------------------------------------------
% 1. Maillage et les informations qui lui sont relatives
%-------------------------------------------------------------------
% Lecture 
 load coord.dat    ; 
 load elements.dat ;   
 load bordD.dat    ;  
% Calcul
 ntdl    = max(max(elements));       % Nombre total des degres de liberte
 Numeros = setdiff(1:ntdl,bordD(:,2));% Degres de liberte inconnus
%-----------------------------
%  initialisation des matrices
%-----------------------------
 A  = sparse(ntdl,ntdl);     % matrice du systeme
 B  = sparse(ntdl,1);        % vecteur second membre
 uh = sparse(ntdl,1);        % vecteur solution
%-----------------------------------------------------------------
%  2. Calcul des matrices et des seconds membres elementaires
%     et leurs assemblage
%-----------------------------------------------------------------
 for el=1:size(elements,1),          % boucle sur les elements
   noe       = elements(el,:) ;      % numeros des noeuds sommets
   x1        = coord(noe(1))  ;      % abscisse sommet 1 
   x2        = coord(noe(2))  ;      % abscisse sommet 2
   [Ke,Fe]   = KeFe(x1,x2)    ;      % calcul de Ke et Fe
   A(noe,noe)= A(noe,noe)+ Ke ;      % Assemblage de A
   B(noe)    = B(noe)    + Fe ;      % Assemblage de B
 end
%-------------------------------------------------------------------
%  3. Prise en compte des conditions aux limites de Dirichlet
%-------------------------------------------------------------------
  dl     = bordD(1,2);   % Numero du degre de liberte a gauche
  uh(dl) = 0         ;   % Condition au bord de gauche
  dl     = bordD(2,2);   % Numero du degre de liberte a droite
  uh(dl) = 100       ;   % Condition au bord de droite    
% Mise a jour du second membre   
  B = B-A*uh;
%-------------------------------------------------------------------
%  4. Resolution du systeme 
%-------------------------------------------------------------------
  uh(Numeros) = A(Numeros,Numeros)\B(Numeros);   
%-------------------------------------------------------------------
%  5. Presentation la solution
%-------------------------------------------------------------------
  plot(coord,uh,'*');   
  legend('Solution approch\U{e9}e');
%---------------------------Fin-------------------------------------

Matrice et second membre élémentaires

function [Ke,Fe] = KeFe(x1,x2)
%-------------------------------------------------------------------
 Fe = zeros(2,1); Ke = zeros(2,2); 
% Abscisses et poids de Gauss-Legendre (2 points)
 x(1) = (x1+x2)/2 + ((x2-x1)/2)*(-1/sqrt(3));
 x(2) = (x1+x2)/2 + ((x2-x1)/2)*( 1/sqrt(3));
 pg   = [(x2-x1)/2 , (x2-x1)/2];              % Poid des points
% Fonctions de base et leurs derivees
 N1 = (x2-x)/(x2-x1);    dN1 = -1/(x2-x1)*ones(1,2);
 N2 = (x-x1)/(x2-x1);    dN2 =  1/(x2-x1)*ones(1,2);
% Matrice elementaire  
 Ke(1,1)= dot(pg , sigma(x).*dN1.*dN1+beta(x).*dN1.*N1+lambda(x).*N1.*N1);
 Ke(1,2)= dot(pg , sigma(x).*dN2.*dN1+beta(x).*dN2.*N1+lambda(x).*N2.*N1);
 Ke(2,1)= dot(pg , sigma(x).*dN1.*dN2+beta(x).*dN1.*N2+lambda(x).*N1.*N2);
 Ke(2,2)= dot(pg , sigma(x).*dN2.*dN2+beta(x).*dN2.*N2+lambda(x).*N2.*N2);
% Second membre elementaire
 Fe(1)= dot(pg , f(x).*N1);   % dot : produit scalaire
 Fe(2)= dot(pg , f(x).*N2);

Problème de second ordre en 1D

Position du problème

On s'intéresse à la résolution par la méthode des éléments finis du problème à données régulières suivant :
MATH
dont la formulation variationnelle est donnée par :
MATH

MATH

Approximation par un élément fini $\QTR{cal}{P}_{1}$

On munira $\Omega $ d'une triangulation MATH composée de $n$ segments.
MATH

Eléments finis $\QTR{cal}{P}_{1}$

Les caractéristiques de cet élément fini sont :


MATH

On cherche à résoudre, par l'élément fini $\QTR{cal}{P}_{1}$défini ci-dessus, le problème () avec des conditions aux limites de Dirichlet dont la forme bilinéaire et la forme linéaire sont données par ().

Problème approché

Le problème variationnel approché est de la forme :


MATH
$\QTR{cal}{U}_{h}$ désigne un sous-espace de MATH, de dimension finie, construit à l'aide des fonctions d'interpolation, tel que :
MATH

Matrices et seconds membres élémentaires

La matrice élémentaire MATH MATH et le second membre élémentaire MATH associés sont définis par
MATH

Simulation numérique

On considère la résolution du problème :
MATH

Données de la discrétisation


MATH

Structure des fichiers de données relatives aux maillage.

coord.dat elements.dat bordD.dat
%x
0.00
$\vdots $
$\QTR{tt}{100.00}$
%dl#1 dl#2
1 2
$\vdots $ $\vdots $
20 21
%Point# dl#
1 1
21 21

Fonctions

function y = sigma(x)
   y = 1+x ;
 
function y = beta(x)
   y = x ;
 
function y = lambda(x)
   y = 1;
 
function y = f(x)
   y = 1;

Résultat

Ci-dessous le graphe de la solution approchée du problème.
fem__141.png

Travaux pratiques

- Vérifier que $u(x)=x$ est la solution du problème ci-dessus.

- Sur le même graphe, afficher les deux solutions (exacte et approchée).

- Pourquoi ces deux solutions sont confondues?

- On considère le problème suivant :
MATH

  1. En concervant la configuration géométrique du problème ci-dessus, apporter les modifications nécess-aires aux fonctions Matlab pour résoudre ce problème.

  2. Vérifier que $u(x)=x^{2}/100$ est la solution du problème ci-dessus.

  3. Sur le même graphe, afficher les deux solutions (exacte et approchée). Quelles sont vos constatations sur les solutions?

Problèmes en dimension 2

Position du problème

On considère le problème à données régulières suivant :
MATH
dont la formulation variationnelle est
MATH

MATH

Approximation par un élément fini $\QTR{cal}{P}_{1}$

On munira $\Omega $ d'une triangulation MATH, composée de $n$ triangles. On se propose de résoudre le problème () par l'élément fini $\QTR{cal}{P}_{1}$.

Elément fini de degré 1 sur un triangle

Les caractéristiques de cet élément fini sont :

L'espace d'approximation est donc


MATH

Matrice et second membres élémentaires

La matrice élémentaire MATH MATH et le second membre élémentaire MATH associés au problème sont définis par
MATH

Problème approché

On approche le problème () par
MATH

Intégration numérique

Comme dans le cas de la dimension $1$, nous évaluerons les intégrales à l'aide d'une formule d'intégration approchée, de la forme :
MATH
où les $a_{k}$ sont des points de l'élément $e$ et les $w_{k}$ sont les poids correspondants.

Quelques notations et aides pour la programmation

Structure de données en 2D

coord.dat elements.dat bordD.dat
%x y
x $_{1}$ y$_{1}$
$\QTR{tt}{\vdots }$ $\QTR{tt}{\vdots }$
x $_{n}$ y$_{n}$
%dl#1 dl#2 ...
n $_{1}^{1}$ n $_{2}^{1}$ ...
$\vdots $ $\vdots $
n $_{1}^{m}$ n $_{1}^{m}$ ...
%Point# dl#1 dl#2
n $\QTR{tt}{1}$ dl MATH dl MATH
$\vdots $ $\vdots $ $\vdots $
n $\QTR{tt}{d}$ dl MATH dl MATH

Simulation numérique

On s'intéresse à la résolution du problème suivant :
MATH

Ainsi, $\sigma _{1}=1$, $\sigma _{2}=1$, $f(x,y)=0$ et MATH.

Données de la discrétisation

coord.dat elements.dat bordD.dat
%x y
0.0 0.0
$\vdots $
1.0 1.0
%dl#1 dl#2 dl#3
1 2 5
$\vdots $
12 16 15
%Point# dl#
1 1
$\vdots $
16 16

fem__206.pngMaillage du domaine.

Fonctions

function sigma1 = sigma1(x,y)
   sigma1 = 1 ;
 
function sigma2 = sigma2(x,y)
   sigma2 = 1 ;
 
function f = f(x,y)
   f = 0;
 
function ud = u_D(x,y)
   ud = -2+5*x-4*y ;

Résultat

Ci-dessous, on présente les isovaleurs de la solution approchée ($uh$).

fem__208.png

Travaux pratiques

- En considérant le problème ci-dessus,

  1. Vérifier que $u(x,y)=-2+5x-4y$ est la solution analytique du problème ;

  2. Comparer les deux solutions en apportant les modifications nécessaires au programme ;

  3. Que constatez-vous?

- On considère le problème de diffusion anisotrope suivant :
MATH

Apporter les modifications nécessaires aux fonctions Matlab pour résoudre ce problème avec les données suivantes :
MATH

- On considère le problème suivant :
MATH

  1. Donner la formulation variationnelle de ce problème ;

  2. Apporter les modifications nécessaires aux fonctions Matlab pour résoudre ce problème avec les données suivantes :
    MATH

Programmes

Programme principal

%======================================================================
% - div(sigma_i(x,y).grad(u))= f    dans Omega
%                    u(x,y)  = uD   sur bordD
%======================================================================
%   Approximation P1
%   ================
%------------------------------------------------%
% Programmeurs:  B. Aoubiza & R. Laydi (an 2001) %
% Copyright (c)  ENSMM                           %
%                Universite de Franche-Comte     %
%------------------------------------------------%
 clc;        % effacer l'ecran
 clear all;  % effacer toutes les variables de la section de travail.
%-------------------------------------------------------------------
% 1. Maillage et les informations qui lui sont relatives
%-------------------------------------------------------------------
% Lecture
 load coord.dat   ;    
 load elements.dat; 
 load bordD.dat   ;
% Calcul
 ntdl  = max(max(elements(:,:)))   ; % Nombre total des degres de liberte
 Numeros=setdiff(1:ntdl,bordD(:,2)); % Degres de liberte inconnus
%-----------------------------
%  initialisation des matrices
%-----------------------------
 A  = sparse(ntdl,ntdl);     % matrice du systeme
 B  = sparse(ntdl,1);        % vecteur second membre
 uh = sparse(ntdl,1);        % vecteur solution
%-----------------------------------------------------------------
%  2. Calcul des matrices et des seconds membres elementaires
%     et leurs assemblage
%-----------------------------------------------------------------
 for el=1:size(elements,1),       % boucle sur les elements
   npt        = elements(el,:)  ; % numeros des points sommets
   ex         = coord(npt,1)    ; % abscisses
   ey         = coord(npt,2)    ; % ordonnees
   noe        = elements(el,:)  ; % numeros des dl de l'element
   [Ke,Fe]    = KeFe(ex,ey)     ; % calcul de Ke et Fe
   A(noe,noe) = A(noe,noe) + Ke ; % assemblage de la matrice
   B(noe)     = B(noe)     + Fe ; % assemblage du second membre
 end
%-------------------------------------------------------------------
%  3 Prise en compte des conditions aux limites de Dirichlet
%-------------------------------------------------------------------
 for i=1:size(bordD,1),      % Nombre de degre de liberte sur GammaD
    npt   = bordD(i,1)     ; % Numeros du point  
    dl    = bordD(i,2)     ; % Numeros du degre de liberte
    xy    = coord(npt,:)   ; % x y du point
    uh(dl)= uD(xy(1),xy(2));
 end
% Mise a jour du second membre 
 B = B-A*uh ;
%-------------------------------------------------------------------
%  4. Resolution du systeme
%-------------------------------------------------------------------
 uh(Numeros) = A(Numeros,Numeros)\B(Numeros); 
 uh=full(uh);
%-------------------------------------------------------------------
%  5. Presentation de la solution
%-------------------------------------------------------------------
% Une presentation graphique de la solution approchee
 trisurf(elements,coord(:,1),coord(:,2),uh','facecolor','interp');
 view(0,90);
 title('Solution du Probleme');
 colorbar;
%---------------------------Fin-------------------------------------

Matrice et second membre élémentaires

function [Ke,Fe] = KeFe(ex,ey)
%------------------------------------------------------------------------
% Calcul de la matrice et du second membre elementaire
%------------------------------------------------------------------------
% Entree : coordonnees des sommets de l'element
%           ex = [x1 x2 x3]
%           ey = [y1 y2 y3]    
% Sortie :  Ke :  Matrice elementaire (3 x 3)
%           Fe :  Second membre elementaire (3 x 1)
%------------------------------------------------------------------------
% On utilise la methode de Gauss-Legendre avec 3 points.
 A=0.5*det([ones(3,1) ex ey]); % Aire du triangle
% Points d'integration : milieux des arretes
 x =0.5*[ex(2)+ex(1) ex(3)+ex(2) ex(1)+ex(3)];
 y =0.5*[ey(2)+ey(1) ey(3)+ey(2) ey(1)+ey(3)];
 pg=[A/3 , A/3 , A/3];    % Poids des points
%
% Fonctions de base aux 3 points d'integration
%
 N1 = ((ey(3)-ey(2)).*(ex(2)-x)-(ex(3)-ex(2)).*(ey(2)-y))/(2*A);
 N2 = ((ey(1)-ey(3)).*(ex(3)-x)-(ex(1)-ex(3)).*(ey(3)-y))/(2*A);
 N3 = ((ey(2)-ey(1)).*(ex(1)-x)-(ex(2)-ex(1)).*(ey(1)-y))/(2*A);
%
% Derivees des fonctions de base aux 3 points d'integration
%
 dxN1=-(ey(3)-ey(2))/(2*A)*ones(1,3); dyN1=(ex(3)-ex(2))/(2*A)*ones(1,3);
 dxN2=-(ey(1)-ey(3))/(2*A)*ones(1,3); dyN2=(ex(1)-ex(3))/(2*A)*ones(1,3);
 dxN3=-(ey(2)-ey(1))/(2*A)*ones(1,3); dyN3=(ex(2)-ex(1))/(2*A)*ones(1,3);
%===========================
% Matrice elemantaire      %
%===========================
 Ke(1,1) = dot(pg , sigma1(x,y).*dxN1.*dxN1+sigma2(x,y).*dyN1.*dyN1);
 Ke(1,2) = dot(pg , sigma1(x,y).*dxN2.*dxN1+sigma2(x,y).*dyN2.*dyN1);
 Ke(1,3) = dot(pg , sigma1(x,y).*dxN3.*dxN1+sigma2(x,y).*dyN3.*dyN1);
 Ke(2,1) = dot(pg , sigma1(x,y).*dxN1.*dxN2+sigma2(x,y).*dyN1.*dyN2);
 Ke(2,2) = dot(pg , sigma1(x,y).*dxN2.*dxN2+sigma2(x,y).*dyN2.*dyN2);
 Ke(2,3) = dot(pg , sigma1(x,y).*dxN3.*dxN2+sigma2(x,y).*dyN3.*dyN2);
 Ke(3,1) = dot(pg , sigma1(x,y).*dxN1.*dxN3+sigma2(x,y).*dyN1.*dyN3);
 Ke(3,2) = dot(pg , sigma1(x,y).*dxN2.*dxN3+sigma2(x,y).*dyN2.*dyN3);
 Ke(3,3) = dot(pg , sigma1(x,y).*dxN3.*dxN3+sigma2(x,y).*dyN3.*dyN3);
%============================
% Second membre elementaire %
%============================
 Fe(1,1) = dot(pg , f(x,y).*N1) ;
 Fe(2,1) = dot(pg , f(x,y).*N2) ;
 Fe(3,1) = dot(pg , f(x,y).*N3) ;
This document created by Scientific WorkPlace 4.0.