Implémentation de la Méthode des
Éléments Finis (MEF) – Détail Théorique
et Code MATLAB
1. Forme variationnelle
Partant de l’équation stationnaire de convection–diffusion–réaction :
-∇·(D ∇u) + v·∇u + σu = f dans Ω
On multiplie par une fonction test v appartenant à un espace de fonctions V et on intègre sur le
domaine Ω :
∫Ω D ∇u · ∇v dx + ∫Ω (v · ∇u) v dx + ∫Ω σ u v dx = ∫Ω f v dx
Cela permet d’obtenir une formulation faible ou variationnelle de l’équation, adaptée à
l’approximation par éléments finis.
2. Maillage
Le domaine Ω est divisé en petits éléments (maillage), typiquement des triangles (2D) ou
tétraèdres (3D). Les nœuds sont les sommets des éléments, et chaque élément est associé à des
fonctions de forme (ou fonctions de base) locales.
3. Fonctions de base
Dans chaque élément, la solution est approchée par une combinaison linéaire des fonctions de
forme :
u_h(x) = Σ u_i φ_i(x)
Les fonctions de base φ_i sont généralement des fonctions polynomiales (linéaires ou
quadratiques) valant 1 en un nœud et 0 aux autres.
4. Matrices élémentaires
Pour chaque élément, on calcule :
- Matrice de diffusion (locale) : K_d(e)[i,j] = ∫_e D ∇φ_i · ∇φ_j dx
- Matrice de convection (locale) : K_c(e)[i,j] = ∫_e (v · ∇φ_j) φ_i dx
- Matrice de réaction (locale) : K_r(e)[i,j] = ∫_e σ φ_j φ_i dx
- Vecteur source (local) : F(e)[i] = ∫_e f φ_i dx
Ces matrices sont ensuite assemblées pour former le système global K·U = F.
5. Exemple de code MATLAB (1D, éléments linéaires)
Voici un exemple simplifié de code MATLAB pour résoudre une équation de convection-
diffusion-réaction en 1D :
% Paramètres
L = 1; % longueur du domaine
N = 10; % nombre d’éléments
h = L/N; % taille d’un élément
x = linspace(0, L, N+1)';
D = 1; % coefficient de diffusion
v = 2; % vitesse de convection
sigma = 1; % coefficient de réaction
f = @(x) sin(pi*x); % source
% Initialisation
K = zeros(N+1);
F = zeros(N+1);
% Assemblage
for e = 1:N
xe = x(e:e+1);
he = xe(2) - xe(1);
% Matrice élémentaire de diffusion
Ke_d = D/he * [1, -1; -1, 1];
% Matrice de convection
Ke_c = v/2 * [-1, 1; -1, 1];
% Matrice de réaction
Ke_r = sigma*he/6 * [2, 1; 1, 2];
% Vecteur source
fe1 = f(xe(1));
fe2 = f(xe(2));
Fe = he/6 * [2*fe1 + fe2; fe1 + 2*fe2];
% Assemblage global
K(e:e+1, e:e+1) = K(e:e+1, e:e+1) + Ke_d + Ke_c + Ke_r;
F(e:e+1) = F(e:e+1) + Fe;
end
% Conditions de Dirichlet : u(0) = u(1) = 0
K(1,:) = 0; K(1,1) = 1; F(1) = 0;
K(end,:) = 0; K(end,end) = 1; F(end) = 0;
% Résolution
U = K\F;
% Affichage
plot(x, U, '-o'); xlabel('x'); ylabel('u(x)'); title('Solution numérique')