Cours EF GME3 EPAC Partie1
Cours EF GME3 EPAC Partie1
--------------
ECOLE POLYTECHNIQUE D’ABOMEY-CALAVI
--------------
Introduction à la Méthode
des Eléments Finis
EDO 1D
1
Présentation générale de la Méthode des
Eléments Finis
2.1 Introduction
Pour analyser un phénomène naturel en générale ou un problème d’ingénierie
en particulier, on est souvent amené à développer un modèle mathématique
pouvant décrire d’une manière aussi fiable que possible le problème en
question.
Le développement d’un modèle mathématique s’appuie généralement sur
quelques postulats de base et plusieurs hypothèses simplificatrices pour
aboutir à des équations gouvernantes qui sont souvent des équations
différentielles auxquelles sont ajoutées des conditions aux limites. Exemple,
la théorie d’élasticité s’appuie sur le postula fondamental de l’existence du
vecteur contrainte et les équations générales d’élasticité linéaire isotrope sont
obtenues avec les hypothèses de petites déformations, d’homogénéité et
d’isotropie des matériaux ainsi que la linéarité des relations liants les
contraintes et les déformations.
La résolution analytique d’équations différentielles pose parfois des difficultés
insurmontables, et une solution exacte décrivant bien le problème étudié n’est
pas toujours facile à trouver. Le recours aux modèles physiques et à la
simulation expérimentale pour la recherche d’une solution analogue à la
solution recherchée peut s’avérer coûteux en temps et en moyens.
Avec les progrès enregistrés dans le domaine de l’informatique et les
performances des ordinateurs de plus en plus grandes, il est devenu possible
de résoudre des systèmes d’équations différentielles très complexes. Plusieurs
techniques de résolution numérique ont été ainsi développées et appliquées
avec succès pour avoir des solutions satisfaisantes à des problèmes
d’ingénierie très variés.
La méthode des éléments finis est l’une des techniques numériques les plus
puissantes. Elle est basée sur une idée simple : subdiviser (discrétiser) une
forme complexe en un grand nombre de sous-domaines élémentaires de forme
géométrique simple (éléments finis) interconnectés en des points appelés
nœuds. On retrouve les premières applications véritables de la méthode des
2
éléments finis en 1956 en mécanique des structures. Un groupe de chercheurs
(Turner, Clough, Martin et Topp [59]) de Boeing utilisent cette méthode pour
calculer la voilure d’un avion.
La méthode des éléments finis est maintenant reconnue comme l’une des
principales méthodes de résolution des équations aux dérivées partielles (EDP)
dans des géométries quelconques, que ce soit en dimension un, deux ou trois.
L’un des avantages majeurs de cette méthode est le fait qu’elle offre la
possibilité de développer un programme permettant de résoudre, avec peu de
modifications, plusieurs types de problèmes. En particulier, toute forme
complexe d’un domaine géométrique où un problème est bien posé avec toutes
les conditions aux limites, peut être facilement traité par la méthode des
éléments finis.
Cette méthode consiste à diviser le domaine physique à traiter en plusieurs
sous domaines appelés éléments finis à dimensions non infinitésimales. La
solution recherchée est remplacée dans chaque élément par une
approximation avec des polynômes simples et le domaine peut ensuite être
reconstitué avec l’assemblage ou sommation de tous les éléments.
Problème physique
4
A ces méthodes doivent être associées des techniques d'itération pour traiter le cas
non linéaire. La plus célèbre est la méthode de Newton Raphson.
𝛀 B(u)=0
A(u)=0
∀𝑤 ∈ 𝑉, ∫ w. A(𝑢)dΩ = 0 (2.2)
Ω
Cette équation est appelée forme intégrale forte de l'équation différentielle (ou du
système d’équations différentielles). Elle est analogue à l'expression des travaux
virtuels. En fait la solution de (2.2) a encore plus de portée, on peut affirmer que si
5
elle est satisfaite pour toute fonction poids w, alors l'équation différentielle (2.1) est
satisfaite en tout point du domaine .
(i) Exemple
On considère l’équation différentielle du second ordre suivante :
𝑑2 𝑢
𝐴(𝑢) = + 1 − 𝑥 = 0; 0 ≤ 𝑥 ≤ 1 (2.3)
𝑑𝑥 2
Définie dans le domaine unidimensionnel Ω = [0, 𝐿] avec les conditions aux
limites :
𝑢(𝑥 = 0) = 0 𝑒𝑡 𝑢( 𝑥 = 1 ) = 0 (2.4)
Dans ce cas 𝐵(𝑢) est l’ensemble des valeurs imposées aux deux bords du
domaine. En unidimensionnel, se réduit à deux points. La forme intégrale
associée à l’équation A(u) s’écrit:
𝑑2 𝑢 1
𝑑2 𝑢 1
∫ 𝑤( + 1 − 𝑥) 𝑑Ω = 0; ∫ 𝑤 𝑑𝑥 = ∫ 𝑤(𝑥 − 1)𝑑𝑥 (2.5)
Ω 𝑑𝑥2 0 𝑑𝑥2 0
∫ 𝑤𝐵(𝑢) 𝑑Γ = 0 (2.6)
Γ
Dans la pratique, il est possible d'intégrer (2.2) par partie et de la remplacer par :
6
le nom de la méthode de Galerkin, le deuxième est la détermination de
fonctionnelles variationnelles que l'on cherche à rendre stationnaire.
Dans la pratique, il n'est pas toujours facile de trouver une fonctionnelle. Le
premier procédé est plus utilisé ; il consiste à choisir 𝑤 = 𝛿𝑢 fonction de Dirac
(une perturbation de la fonction cherchée) et d'utiliser l'approximation nodale
pour la discrétisation. w s'appelle aussi fonction poids d'où le mot : "pondéré".
(i) Exemple
Pour obtenir la forme variationnelle faible de l’exemple précédent (équation
2.5) on intègre par partie le premier terme.
1 1 1
𝑑𝑤 𝑑𝑢 𝑑𝑢
−∫ 𝑑𝑥 + [𝑤 ] = ∫ 𝑤(𝑥 − 1)𝑑𝑥 (2.8)
0 𝑑𝑥 𝑑𝑥 𝑑𝑥 0 0
On voit maintenant que les conditions aux limites notamment sur les dérivées
sont explicitement prises en compte dans l’équation. Les valeurs imposées à
la fonction elle-même seront traitées lors de la résolution des systèmes
discrets.
Frontière
Nœud interne
Elément
Nœud
frontière
7
• Aucun élément bidimensionnel ne doit être plat, éviter les angles
proches de 180° ou de 0°. (Fig. 1.4 b)
• Deux éléments distincts ne peuvent avoir en commun que des points
situés dans leurs frontières communes ; le recouvrement est exclu. (Fig.
1.4 c)
• L'ensemble de tous éléments doit constituer un domaine aussi proche
que possible du domaine donné ; les trous entre éléments sont exclus.
(Fig. 1.4 d)
𝑢 = ∑ 𝑎𝑖 𝑥 𝑖 (2.9)
𝑖=0
8
𝑎0
𝑎
𝑢 =< 1 𝑥 𝑥2 ⋯ > [𝑎1 ] ≡< 𝑃(𝑥) > {𝐴} (2.10)
2
⋮
9
3. Equation différentielles du premier ordre
3.2 Etapes à suivre
Dans le cas des équations différentielles, le problème est formulé directement
sous forme mathématique et revient à déterminer une fonction inconnue u
définie dans un domaine et régie par une équation différentielle avec des
conditions aux limites
3.2.1 Formulation du problème
On prend comme exemple l’équation différentielle ordinaire d’ordre un
suivante :
𝑑𝑢
+ 2𝑥(𝑢 − 1) = 0 𝑎𝑣𝑒𝑐 𝑢(0) = 0
𝑑𝑥
Dans ce problème, = est un domaine de dimension 1 ; sa frontière se
réduit à deux points : 0 et 2.
2
La solution exacte de cette équation est : 𝑢𝑒 = 1 − 𝑒 −𝑥
3.2.2 Discrétisation du domaine
Le domaine est divisé en n segments (appelés éléments) de taille 1/n.
Chaque élément contient deux nœuds sur lesquelles la fonction u est
interpolée.
Les lignes de commandes MATLAB qui permettent d’obtenir les deux tableaux
sont :
10
n = 4; % nombre d’éléments
x = 0:2/n:2; % coordonnées des noeuds
for i = 1:n % début de boucle sur les éléments
t(i,:) = [i, 1+i]; % connectivite de chaque élément
end; % fin de boucle
Remarque
Pour un nombre plus élevé d’éléments il suffit d’augmenter la valeur de n .
x(i) donne la coordonnée du nœud i ; x(2) affiche : 0.5
t(i,:) donne les deux nœuds dé l’élément i ; t(2,:) affiche : 2 3
t(:,i) donne la colonne i du tableau t ; t(:,2) affiche :
2
3
4
5
3.2.3 Discrétisation et interpolation sur l’élément
On peut interpoler la fonction u recherchée dans un élément par un polynôme.
L’ordre du polynôme conditionne la précision de la solution approchée. Pour
un élément à deux nœuds on peut prendre :
𝑢 = 𝑎0 + 𝑎1 𝑥 (3.1)
11
Cette approximation de la fonction inconnue u est appelée interpolation polynomiale,
elle est fonction de et qui sont des coefficients sans valeur physique. Pour utiliser
les valeurs de u aux nœuds on cherche une interpolation en fonction de u1 et u2.
L’interpolation polynomiale aux nœuds s’écrit :
𝑢1 1 𝑥1 𝑎0
[𝑢 ] = [ ] [ ] ≡ 𝑢𝑛 = 𝑃𝑛 𝑎𝑛
2 1 𝑥2 𝑎1
L’inverse de ce système d’équations donne les paramètres an.
𝑎0 1 𝑥 −𝑥1 𝑢1
𝑎𝑛 = 𝑃𝑛−1 𝑢𝑛 ≡ [𝑎 ] = [ 2 ][ ]
1 𝑥2 − 𝑥1 −1 1 𝑢2
En remplaçant les an on peut maintenant approcher la fonction u par :
1 𝑥 −𝑥1 𝑢1 𝑥2 − 𝑥 𝑥 − 𝑥1 𝑢
𝑢 =< 1 𝑥> [ 2 ] [𝑢 ] =< > [𝑢1 ]
𝑥2 − 𝑥1 −1 1 2 𝑥2 − 𝑥1 𝑥2 − 𝑥1 2
𝑢 = 𝑁𝑈𝑛
avec N est un vecteur ligne contenant des fonctions de x appelées fonctions de
forme.
Cette interpolation est appelée interpolation nodale puisqu’elle dépend des
valeurs aux nœuds de la fonction inconnue u.
3.2.4 Propriétés des fonctions de forme
Il est intéressant de relever les propriétés suivantes pour les fonctions de forme
N:
Remarque
Les deux fonctions de forme peuvent s’écrire sous forme des polynômes de
Jacobi :
𝑥 − 𝑥𝑗
𝑁𝑖 (𝑥) = ∏ (3.2)
𝑥𝑖 − 𝑥𝑗
𝑗≠𝑖
12
sans passer par l’interpolation polynomiale, des fonctions de forme pour des
éléments d’ordre supérieur (plus de deux nœuds).
Par exemple les fonctions de forme de l’élément à trois nœuds sont :
(𝑥 − 𝑥2 )(𝑥 − 𝑥3 )
𝑁1 (𝑥) =
(𝑥1 − 𝑥2 )(𝑥1 − 𝑥3 )
(𝑥 − 𝑥1 )(𝑥 − 𝑥3 )
𝑁2 (𝑥) = (3.3)
(𝑥2 − 𝑥1 )(𝑥2 − 𝑥3 )
(𝑥 − 𝑥1 )(𝑥 − 𝑥2 )
𝑁3 (𝑥) =
{ (𝑥3 − 𝑥1 )(𝑥3 − 𝑥2 )
On peut vérifier aisément sur la figure ci-dessous les propriétés aux nœuds des trois
fonctions ainsi que leur somme sur l’élément.
1 𝑠𝑖 𝑥 = 𝑥1 0 𝑠𝑖 𝑥 = 𝑥1 0 𝑠𝑖 𝑥 = 𝑥1
𝑁1 (𝑥) ={ 0 𝑠𝑖 𝑥 = 𝑥2 ; 𝑁2 (𝑥) ={ 1 𝑠𝑖 𝑥 = 𝑥2 ; 𝑁3 (𝑥) = { 𝑠𝑖 𝑥 = 𝑥2
0
0 𝑠𝑖 𝑥 = 𝑥3 0 𝑠𝑖 𝑥 = 𝑥3 1 𝑠𝑖 𝑥 = 𝑥3
Le scripte MATLAB qui permet de calculer et de tracer ces trois fonctions est le
suivant :
x1 = 2;
x2 = 5;
x3 = 8;
x = x1:0.1:x3;
N1 = (x-x2).*(x-x3)/(x1-x2)/(x1-x3);
N2 = (x-x1).*(x-x3)/(x2-x1)/(x2-x3);
N3 = (x-x1).*(x-x2)/(x3-x1)/(x3-x2);
S = N1+N2+N3;
plot(x,N1,x,N2,x,N3,x,S)
Noter qu’il est préférable d’utiliser un fichier fonction (M-file) d’usage plus
général.
3.2.5.1 Fonction m-file définissant Ni pour des points xi donnés
function [ y ] = FoncForm( i,X,x )
%=================================================
% Forme de forme pour élément de type Lagrange
%-------------------------------------------------
% Utilisation:
% [ y ] = FoncForm( i,X,x )
%-------------------------------------------------
% Description:
% Arguments d'entrée:
% i : Numéro d'ordre de la fonction de Jacobi
% X : Vecteur (ligne ou colonne) définissant
13
% les points xi
% x : Scalaire où on souhaite évaluer Ni
%
% Argument de sortie:
% y : image de x par Ni
%--------------------------------------------------
%==================================================
n=max(size(X,1),size(X,2));
p=1;
for j=1:n
if j~=i
p=p*(x-X(j))/(X(i)-X(j));
end
end
y=p;
end
Création de l’ensemble des fonctions de forme vérifiant et de leurs dérivées par un même
m-file
On sait que
𝑁𝑋
𝑥 − 𝑋𝑗
𝑁𝑖 (𝑋, 𝑥) = ∏
𝑋𝑖 − 𝑋𝑗
𝑗≠𝑖
𝑗=1
𝑁𝑋 𝑁𝑋 𝑁𝑋
𝑥 − 𝑋𝑗 𝑥 − 𝑋𝑗 𝑥 − 𝑋𝑗
⋯ ∏ ⋯
𝑁(𝑋, 𝑥) = [∏ 𝑋 − 𝑋 𝑋𝑖 − 𝑋𝑗 ∏
𝑋𝑁𝑋 − 𝑋𝑗 ]
𝑗≠11 𝑗 𝑗≠𝑖 𝑗≠𝑁𝑋
𝑗=1
𝑗=1 𝑗=1
Donc
𝑁𝑋 𝑁𝑋
𝜕 1 𝜕
[𝑁 (𝑋, 𝑥)] = ∏ ∏(𝑥 − 𝑋𝑗 )
𝜕𝑥 𝑖 𝑋𝑖 − 𝑋𝑗 𝜕𝑥
𝑗≠𝑖 𝑗≠𝑖
𝑗=1 𝑗=1
( ) ( )
𝑁𝑋 𝑁𝑋 𝑁𝑋
1
= ∏ ∑ ∏(𝑥 − 𝑋𝑗 )
𝑋𝑖 − 𝑋𝑗
𝑗≠𝑖 𝑗≠𝑖 𝑘≠𝑖
𝑗=1 𝑗=1 𝑘≠𝑗
( ) ( 𝑘=1 )
𝑁𝑋 𝑁𝑋 𝑁𝑋
1
= ∑ (∏ ) ∏(𝑥 − 𝑋𝑗 )
𝑋𝑖 − 𝑋𝑘
𝑗≠𝑖 𝑘≠𝑖 𝑘≠𝑖
𝑗=1 𝑘=1 𝑘≠𝑗
( 𝑘=1 )
14
𝑁𝑋 𝑁𝑋 𝑁𝑋
1 1
=∑ ∏ ∏(𝑥 − 𝑋𝑗 )
𝑋𝑖 − 𝑋𝑗 𝑋𝑖 − 𝑋𝑘
𝑗≠𝑖 𝑘≠𝑖 𝑘≠𝑖
𝑗=1 𝑘≠𝑗 𝑘≠𝑗
( ( 𝑘=1 ) ( 𝑘=1 ))
𝑁𝑋 𝑁𝑋
1 𝑥 − 𝑋𝑗
=∑ ∏
𝑋𝑖 − 𝑋𝑗 𝑋𝑖 − 𝑋𝑘
𝑗≠𝑖 𝑘≠𝑖
𝑗=1 𝑘≠𝑗
( ( 𝑘=1 ))
𝑁𝑋
𝜕 1
[𝑁𝑖 (𝑋, 𝑥)] = ∑ ( 𝑁 (𝑋𝑗 , 𝑥)) (3.3)
𝜕𝑥 𝑋𝑖 − 𝑋𝑗 𝑖
𝑗≠𝑖
𝑗=1
𝑑𝑁(𝑋,𝑥)
Création de 𝑑𝑥
function [y] = dLagMEF(X,t)
%=========================================================
% Dérivée première des fonctions de forme de type Jacobi
% Auteur: GBAGUIDI Thomas Brice
%=========================================================
N=length(X);
15
y1=zeros(N,1);
for i=1:N
y1(i,1)=0;
for j=1:N
if j<i
Xj=X;
Xj(j)=[];
xx=LagMEF(Xj,t);
y1(i,1)=y1(i,1)+xx(i-1)/(X(i)-X(j));
elseif j>i
Xj=X;
Xj(j)=[];
xx=LagMEF(Xj,t);
y1(i,1)=y1(i,1)+xx(i)/(X(i)-X(j));
end
end
end
y=y1';
end
Script représentant dans un même graphique les fonctions 𝑁𝑖 (𝑥) et leur somme, pour un vecteur
𝑋 = [𝑥1 , 𝑥2 , … , 𝑥𝑛 ] donné.
X=[0 0.1 0.2 0.3 0.4];
nn=size(X,2);
xx=linspace(X(1),X(end),1001);
kk=size(xx,2);
yy=zeros(nn,kk);
for k=1:kk
for ii=1:nn
yy(ii,k)=FoncForm(ii,X,xx(k));
end
end
plot(xx,yy,xx,sum(yy(1:nn,:)));
grid on;
legend('N1','N2','N3','N4','N5','Somme Ni');
1.2
N1
N2
1
N3
N4
0.8
N5
Somme Ni
0.6
0.4
0.2
-0.2
-0.4
-0.6
0 0.05 0.1 0.15 0.2 0.25 0.3 0.35 0.4
16
3.2.5.2 Construction des fonctions de forme polynomiales avec la dérivée imposée à un
nœud 𝑋𝑘 donné (interpolation de Hermite) :
𝑇
On impose par exemple que pour un vecteur de nœuds 𝑋 = [𝑋1 , 𝑋2 , … , 𝑋𝑁𝑋 ] ,
𝑁𝑖 (𝑋, 𝑘, 𝑥𝑗 ) = 𝛿𝑖𝑗
𝜕𝑁𝑖 (𝑋, 𝑘, 𝑥)
| = 0, 𝑖≠𝑘
𝜕𝑥 𝑥=𝑋 (3.4)
𝑘
𝜕𝑁𝑘 (𝑋, 𝑘, 𝑥)
| = 𝑑𝑢𝑘 ,
{ 𝜕𝑥 𝑥=𝑋
𝑘
donc
𝑁𝑋
1
𝑎𝑖𝑘 𝐿𝑖 (𝑋, 𝑋𝑘 ) + (𝑎𝑖𝑘 𝑋𝑘 + 𝑏𝑖𝑘 ) ∑ ( 𝐿 (𝑋𝑗 , 𝑋𝑘 )) = 𝛿𝑖𝑘 𝑑𝑢𝑘
𝑋𝑖 − 𝑋𝑗 𝑖
𝑗≠𝑖
𝑗=1
Ou encore
𝑁𝑋 𝑁𝑋
1 1
𝑎𝑖𝑘 𝛿𝑖𝑘 + 𝑋𝑘 ∑ ( 𝐿𝑖 (𝑋𝑗 , 𝑋𝑘 )) + 𝑏𝑖𝑘 ∑ ( 𝐿 (𝑋𝑗 , 𝑋𝑘 )) = 𝛿𝑖𝑘 𝑑𝑢𝑘 (3.8)
𝑋𝑖 − 𝑋𝑗 𝑋𝑖 − 𝑋𝑗 𝑖
𝑗≠𝑖 𝑗≠𝑖
[ 𝑗=1 ] 𝑗=1
17
𝑁𝑋 𝑁𝑋
1 1
𝑎𝑖𝑘 𝛿𝑖𝑘 + (𝑋𝑘 − 𝑋𝑖 ) ∑ ( 𝐿𝑖 (𝑋𝑗 , 𝑋𝑘 )) = 𝛿𝑖𝑘 𝑑𝑢𝑘 − ∑ ( 𝐿 (𝑋𝑗 , 𝑋𝑘 )) (3.9)
𝑋𝑖 − 𝑋𝑗 𝑋𝑖 − 𝑋𝑗 𝑖
𝑗≠𝑖 𝑗≠𝑖
[ 𝑗=1 ] 𝑗=1
Pour 𝒊 ≠ 𝒌, on a
L’égalité (3.8) devient après simplification des termes nuls,
1 1
𝑎𝑖𝑘 [(𝑋𝑘 − 𝑋𝑖 ) 𝐿𝑖 (𝑋 𝑘 , 𝑋𝑘 )] = − 𝐿 (𝑋 𝑘 , 𝑋𝑘 ) (3.10)
𝑋𝑖 − 𝑋𝑘 𝑋𝑖 − 𝑋𝑘 𝑖
On sait que 𝑥 ⟼ 𝐿𝑖 (𝑋 𝑘 , 𝑥) a exactement n -1 racines réelles distinctes qui sont les composantes
de 𝑋 𝑘 , n étant le nombre de composante de 𝑋 𝑘 . Mais, 𝑋𝑘 n’est pas une racine de 𝐿𝑖 (𝑋 𝑘 , 𝑥) car,
c’est la composante de X supprimée pour constituer 𝑋 𝑘 (voir paragraphe 3.2.5.1). On peut donc
simplifier l’égalité (3.10), ce qui donne :
1
𝑎𝑖𝑘 =
𝑋𝑖 − 𝑋𝑘
−𝑋𝑘
𝑏𝑖𝑘 = 1 − 𝑎𝑖𝑘 𝑋𝑖 =
𝑋𝑖 − 𝑋𝑘
𝑥 − 𝑋𝑘
𝑁𝑖 (𝑋, 𝑘, 𝑥) = 𝐿 (𝑋, 𝑥) (3.11)
𝑋𝑖 − 𝑋𝑘 𝑖
Pour 𝒊 = 𝒌, :
L’égalité (3.9) devient
𝑁𝑋 𝑁𝑋
1 1
𝑎𝑘𝑘 1 + (𝑋𝑘 − 𝑋𝑘 ) ∑ ( 𝐿𝑘 (𝑋𝑗 , 𝑋𝑘 )) = 𝑑𝑢𝑘 − ∑ ( 𝐿 (𝑋𝑗 , 𝑋𝑘 )) (3.12)
𝑋𝑘 − 𝑋𝑗 𝑋𝑘 − 𝑋𝑗 𝑘
𝑗≠𝑘 𝑗≠𝑘
[ 𝑗=1 ] 𝑗=1
𝐿𝑘 (𝑋𝑗 , 𝑋𝑘 ) = 1 ∀𝑗 ≠ 𝑘
Donc
𝑁𝑋
1
𝑎𝑘𝑘 = 𝑑𝑢𝑘 − ∑ ( )
𝑋𝑘 − 𝑋𝑗
𝑗≠𝑘
𝑗=1
𝑁𝑋
1
𝑏𝑘𝑘 = 1 − 𝑋𝑘 𝑑𝑢𝑘 − ∑ ( )
𝑋𝑘 − 𝑋𝑗
𝑗≠𝑖
[ 𝑗=1 ]
𝑁𝑋
1
𝑁𝑘 (𝑋, 𝑘, 𝑥) = 𝑑𝑢𝑘 − ∑ ( ) (𝑥 − 𝑋𝑘 ) + 1 𝐿𝑘 (𝑋, 𝑥) (3.13)
𝑋𝑘 − 𝑋𝑗
𝑗≠𝑖
[( 𝑗=1
) ]
18
M-file
function [ y ] = Ndu0( X,du0k,k,t )
%=========================================================
% Fonctions de forme de type polinomiale Ni
% tel que
% ° Ni(X,k,xj)=𝛿ij
% ° dNi(X,k,xj)/dx=0 si i≠k
% ° dNk(X,k,xj)/dx=duok
%
% Auteur: GBAGUIDI Thomas Brice
%=========================================================
N=length(X);
y1=zeros(N,1);
% y2=y1;
y2=0;
for j=1:N
if j~=k
y2=y2+1/(X(k)-X(j));
end
end
for i=1:N
if i==k
y1(i,1)=(du0k-y2)*(t-X(k))+1;
else
y1(i,1)=(t-X(k))/(X(i)-X(k));
end
for j=1:N
if j~=i
y1(i,1)=y1(i,1)*(t-X(j))/(X(i)-X(j));
end
end
end
y=y1';
end
19
1.5
N1 est de dérivée 1.5
première égale à N2 est de dérivée
5 en x0=0 première égale
1 1 à 2 en x1 = 0.25
0.5 0.5
0 0
-0.5 -0.5
N1 N1, N3, N4 et N5 sont
N2, N3, N4 et N5 N1
N2 de dérivées premières
sont de dérivées nulles en x1=0.25 N2
-1 N3 -1
premières nulles N3
en x0=0 N4
N4
N5
N5
-1.5 -1.5
0 0.2 0.4 0.6 0.8 1 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
Les dérivées
Pour 𝒊 ≠ 𝒌
𝑑 1 𝑥 − 𝑋𝑘 𝑑
𝑁𝑖 (𝑋, 𝑘, 𝑥) = 𝐿𝑖 (𝑋, 𝑥) + 𝐿 (𝑋, 𝑥)
𝑑𝑥 𝑋𝑖 − 𝑋𝑘 𝑋𝑖 − 𝑋𝑘 𝑑𝑥 𝑖
𝑁𝑋
𝑑 1 𝑥 − 𝑋𝑘 1
𝑁𝑖 (𝑋, 𝑘, 𝑥) = 𝐿𝑖 (𝑋, 𝑥) + ∑( 𝐿𝑖 (𝑋𝑗 , 𝑥))
𝑑𝑥 𝑋𝑖 − 𝑋𝑘 𝑋𝑖 − 𝑋𝑘 𝑋𝑖 − 𝑋𝑗
𝑗≠𝑖
𝑗=1
Pour 𝒊 = 𝒌
𝑁𝑋
𝑑 𝑑 𝑑 1
𝑁𝑖 (𝑋, 𝑘, 𝑥) = 𝑁𝑘 (𝑋, 𝑘, 𝑥) = 𝑑𝑢𝑘 − ∑ ( ) (𝑥 − 𝑋𝑘 ) + 1 𝐿𝑘 (𝑋, 𝑥)
𝑑𝑥 𝑑𝑥 𝑑𝑥 𝑋𝑘 − 𝑋𝑗
𝑗≠𝑖
[( 𝑗=1
) ]
𝑁𝑋
𝑑 1
𝑁 (𝑋, 𝑘, 𝑥) = 𝑑𝑢𝑘 − ∑ ( ) 𝐿𝑘 (𝑋, 𝑥)
𝑑𝑥 𝑘 𝑋𝑘 − 𝑋𝑗
𝑗≠𝑖
𝑗=1
( )
𝑁𝑋 𝑁𝑋
1 1
+ 𝑑𝑢𝑘 − ∑ ( ) (𝑥 − 𝑋𝑘 ) + 1 ∑ ( 𝐿 (𝑋𝑗 , 𝑥)) (3.14)
𝑋𝑘 − 𝑋𝑗 𝑋𝑘 − 𝑋𝑗 𝑘
𝑗≠𝑖 𝑗≠𝑘
[( 𝑗=1
) ] 𝑗=1
20
25
20 dN1/dx
dN2/dx
15 dN3/dx
dN4/dx
10 dN5/dx
-5
-10
-15
-20
-25
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
1.5
0.5
-0.5
N1
-1 N2
N3
N4
N5
-1.5
0 0.2 0.4 0.6 0.8 1
Généralisation
On pose ici
𝑁𝑖 (𝑋, 𝑘, 𝑥𝑗 ) = 𝛿𝑖𝑗
{ 𝜕𝑁𝑖 (𝑋, 𝑘, 𝑥) (3.15)
| = 𝑑𝑢𝑖 ,
𝜕𝑥 𝑥=𝑋 𝑘
Avec
𝑁𝑖 (𝑋, 𝑘, 𝑥) = (𝑎𝑖𝑘 𝑥 + 𝑏𝑖𝑘 )𝐿𝑖 (𝑋, 𝑥)
𝜕𝐿𝑖 (𝑋,𝑥)
En posant | = 𝑑𝐿𝑖 (𝑋, 𝑋𝑘 ), on obtient le système suivant
𝜕𝑥 𝑥=𝑋𝑘
21
𝑑𝑢𝑖 − 𝑑𝐿𝑖 (𝑋, 𝑋𝑘 ) 𝛿𝑖𝑘 + 𝑋𝑘 𝑑𝐿𝑖 (𝑋, 𝑋𝑘 ) − 𝑋𝑖 𝑑𝑢𝑖
𝑏𝑖𝑘 = 1 − 𝑋𝑖 =
𝛿𝑖𝑘 + (𝑋𝑘 − 𝑋𝑖 )𝑑𝐿𝑖 (𝑋, 𝑋𝑘 ) 𝛿𝑖𝑘 + (𝑋𝑘 − 𝑋𝑖 )𝑑𝐿𝑖 (𝑋, 𝑋𝑘 )
Pour 𝒊 ≠ 𝒌, 𝜹𝒊𝒌 = 𝟎 et on a
𝑑𝑢𝑖 − 𝑑𝐿𝑖 (𝑋, 𝑋𝑘 )
𝑎𝑖𝑘 =
(𝑋𝑘 − 𝑋𝑖 )𝑑𝐿𝑖 (𝑋, 𝑋𝑘 )
𝑋𝑘 𝑑𝐿𝑖 (𝑋, 𝑋𝑘 ) − 𝑋𝑖 𝑑𝑢𝑖
𝑏𝑖𝑘 =
(𝑋𝑘 − 𝑋𝑖 )𝑑𝐿𝑖 (𝑋, 𝑋𝑘 )
On obtient
𝑑𝑢𝑖 − 𝑑𝐿𝑖 (𝑋, 𝑋𝑘 ) 𝑑𝑢𝑖
𝑁𝑖 (𝑋, 𝑘, 𝑥) = [ (𝑥 − 𝑋𝑘 ) + ] 𝐿 (𝑋, 𝑥) (3.18)
(𝑋𝑘 − 𝑋𝑖 )𝑑𝐿𝑖 (𝑋, 𝑋𝑘 ) 𝑑𝐿𝑖 (𝑋, 𝑋𝑘 ) 𝑖
Avec le cas particulier 𝑑𝑢𝑖 = 0 , on retrouve la formule (3.11).
𝜕𝑁𝑖 (𝑋, 𝑘, 𝑥) 𝑑𝑢𝑖 − 𝑑𝐿𝑖 (𝑋, 𝑋𝑘 )
= 𝐿 (𝑋, 𝑥)
𝜕𝑥 (𝑋𝑘 − 𝑋𝑖 )𝑑𝐿𝑖 (𝑋, 𝑋𝑘 ) 𝑖
𝑑𝑢𝑖 − 𝑑𝐿𝑖 (𝑋, 𝑋𝑘 ) 𝑑𝑢𝑖
+[ (𝑥 − 𝑋𝑘 ) + ] 𝑑𝐿𝑖 (𝑋, 𝑥) (3.19)
(𝑋𝑘 − 𝑋𝑖 )𝑑𝐿𝑖 (𝑋, 𝑋𝑘 ) 𝑑𝐿𝑖 (𝑋, 𝑋𝑘 )
Pour 𝒊 = 𝒌, 𝜹𝒊𝒌 = 𝟏 et on a
𝑑𝑢𝑘 − 𝑑𝐿𝑘 (𝑋, 𝑋𝑘 )
𝑎𝑘𝑘 = = 𝑑𝑢𝑘 − 𝑑𝐿𝑘 (𝑋, 𝑋𝑘 )
1 + (𝑋𝑘 − 𝑋𝑘 )𝑑𝐿𝑘 (𝑋, 𝑋𝑘 )
1 + 𝑋𝑘 𝑑𝐿𝑘 (𝑋, 𝑋𝑘 ) − 𝑋𝑘 𝑑𝑢𝑘
𝑏𝑘𝑘 = = 1 + 𝑋𝑘 (𝑑𝐿𝑘 (𝑋, 𝑋𝑘 ) − 𝑑𝑢𝑘 )
1 + (𝑋𝑘 − 𝑋𝑘 )𝑑𝐿𝑖 (𝑋, 𝑋𝑘 )
On obtient
22
𝑁𝑘 (𝑋, 𝑘, 𝑥) = [(𝑑𝑢𝑘 − 𝑑𝐿𝑘 (𝑋, 𝑋𝑘 ))𝑥 + 1 + 𝑋𝑘 (𝑑𝐿𝑘 (𝑋, 𝑋𝑘 ) − 𝑑𝑢𝑘 )]𝐿𝑘 (𝑋, 𝑥)
𝑁𝑘 (𝑋, 𝑘, 𝑥) = [(𝑑𝑢𝑘 − 𝑑𝐿𝑘 (𝑋, 𝑋𝑘 ))(𝑥 − 𝑋𝑘 ) + 1]𝐿𝑘 (𝑋, 𝑥) (3.20)
𝜕𝑁𝑘 (𝑋, 𝑘, 𝑥)
= (𝑑𝑢𝑘 − 𝑑𝐿𝑘 (𝑋, 𝑋𝑘 ))𝐿𝑘 (𝑋, 𝑥)
𝜕𝑥
+[(𝑑𝑢𝑘 − 𝑑𝐿𝑘 (𝑋, 𝑋𝑘 ))(𝑥 − 𝑋𝑘 ) + 1]𝑑𝐿𝑘 (𝑋, 𝑥) (3.21)
Cette écriture discrétisée est valable pour tous les types d’éléments. Dans le cas particulier d’un
élément linéaire à deux nœuds, elle s’écrit comme suit :
𝑥2
𝑁1 𝑢
< 𝛿𝑢1 𝛿𝑢2 > { ∫ [ ] < 𝑑𝑁1 𝑑𝑁2 > 𝑑𝑥} [𝑢1 ] +
𝑁2 2
𝑥1
23
𝑥2
𝑁1 𝑢
< 𝛿𝑢1 𝛿𝑢2 > { ∫ [ ] 2𝑥 < 𝑁1 𝑁2 > 𝑑𝑥} [𝑢1 ] −
𝑁2 2
𝑥1
𝑥2
𝑁1
< 𝛿𝑢1 𝛿𝑢2 > { ∫ [ ] 2𝑥𝑑𝑥} = 0
𝑁2
𝑥1
On voit qu’il est possible de simplifier (𝛿𝑢𝑛 )𝑇 puisqu’il n’est pas nul et revient à chaque terme.
Au fait c’est les autres termes qui doivent être nuls ! on le voit bien avec cet exemple :
𝑣1 𝑤1
< 𝛿𝑢1 𝛿𝑢2 > [𝑣 ] +< 𝛿𝑢1 𝛿𝑢2 > [𝑤 ] = 0
2 2
Qui est un système d’équations linéaires 𝐾𝑒𝑈𝑒 = 𝐹𝑒 ; avec Ke et Fe sont appelés matrice et
vecteur élémentaires du système d’équation. Dans le cas de la présente équation différentielle
K est la somme de deux matrices : Ke = Ke1 + Ke2 tel que :
𝑥2 𝑥2
𝑁 𝑑𝑁 𝑁1 𝑑𝑁2 𝑁 2𝑥𝑁1 𝑁1 2𝑥𝑁2
𝐾𝑒1 = ∫ [ 1 1 ] 𝑑𝑥 ; 𝐾𝑒2 = ∫ [ 1 ] 𝑑𝑥
𝑁2 𝑑𝑁1 𝑁2 𝑑𝑁2 𝑁2 2𝑥𝑁1 𝑁2 2𝑥𝑁2
𝑥1 𝑥1
En remplaçant les fonctions de forme et leurs dérivées par leurs expressions respectives on
obtient :
𝑥2𝑥 − 𝑥2 1 𝑥 − 𝑥2 1
𝑥 − 𝑥2 𝑥1 − 𝑥2 𝑥1 − 𝑥2 𝑥2 − 𝑥1
𝐾𝑒1 = ∫ 1 𝑑𝑥
𝑥 − 𝑥1 1 𝑥 − 𝑥1 1
𝑥1
[𝑥2 − 𝑥1 𝑥1 − 𝑥2 𝑥2 − 𝑥1 𝑥2 − 𝑥1 ]
𝑥2 𝑥 − 𝑥2 𝑥 − 𝑥2 𝑥 − 𝑥2 𝑥 − 𝑥1
2𝑥 2𝑥
𝑥 −𝑥 𝑥1 − 𝑥2 𝑥1 − 𝑥2 𝑥2 − 𝑥1
𝐾𝑒2 = ∫ [ 𝑥1 − 𝑥 2 𝑥 − 𝑥 𝑥 − 𝑥 𝑥 − 𝑥1 ] 𝑑𝑥
1 2 1
𝑥1 2𝑥 2𝑥
𝑥2 − 𝑥1 𝑥1 − 𝑥2 𝑥2 − 𝑥1 𝑥2 − 𝑥1
Soit après intégration des composantes des deux matrices :
1 −1 1
𝐾𝑒1 = [ ]
2 −1 1
24
𝑥2 − 𝑥1 3𝑥1 + 𝑥2 𝑥1 + 𝑥2
𝐾𝑒2 = [ ]
6 𝑥1 + 𝑥2 𝑥1 + 3𝑥2
Le vecteur F est donné par :
𝑥2
2𝑥(𝑥 − 𝑥2 )/(𝑥1 − 𝑥2 )
𝐹𝑒 = ∫ [ ] 𝑑𝑥
2𝑥(𝑥 − 𝑥1 )/(𝑥2 − 𝑥1 )
𝑥1
soit :
𝑥2 − 𝑥1 2𝑥1 + 𝑥2
𝐹𝑒 = [ ]
3 𝑥1 + 2𝑥2
3.2.7 Remarque
Il est possible d’utiliser MATLAB pour intégrer analytiquement les matrices élémentaires, Le script
peut être le suivant :
syms x x1 x2 real % déclaration de variables symboliques
N = [(x-x2)/(x1-x2) (x-x1)/(x2-x1)] % fonctions de forme
dN = simple(diff(N,x)) % dérivées des fonctions de forme
Ke1 = simplify( int(N' * dN , x, x1, x2) ) % matrice Ke1
Ke2 = simplify( int(N' * 2*x * N , x, x1, x2) ) % matrice Ke2
Fe = simplify( int(N' * 2*x , x, x1, x2) ) % vecteur Fe
(1) − 1⁄2 1⁄ 1 1
2] ; 𝐾𝑒 (1) = ⁄2 − 0 [3 × 0 + ⁄2 0 + 1⁄2
𝐾𝑒1 = [ 2 ]
− 1⁄2 1⁄
2
6 0 + 1⁄2 0 + 3 × 1⁄2
1 −11 13 𝑢1 1 1
𝐾𝑒 (1) 𝑈𝑒 (1) = 𝐹𝑒 (1) ; [ ] [𝑢 ] = [ ]
24 −11 15 2 12 2
On notant par U les valeurs de la fonction u aux cinq nœuds, les valeurs du vecteur élémentaire
𝑈𝑒 (1) de l’élément 1 correspondent aux composantes 𝑢1 et 𝑢2 vecteur global U, celles de
𝑈𝑒 (2) de l’élément 2 correspondent à la seconde et troisième du vecteur global U, celles de
𝑈𝑒 (3) à la troisième et quatrième et celles de 𝑈𝑒 (4) à la quatrième et cinquième.
Elément 2 : x1 = 1/2 ; x2 = 1 ;
1 −7 15 −0.2917 0.6250
𝐾𝑒 (2) = [ ]=[ ]
24 −9 19 −0.3750 0.7917
25
1 4 0.3333
𝐹𝑒 (2) = [ ]=[ ]
12 5 0.4167
1 −7 15 𝑢1 1 4
𝐾𝑒 (2) 𝑈𝑒 (2) = 𝐹𝑒 (2) ; [ ] [𝑢 ] = [ ]
24 −9 19 2 12 5
Elément 3 : x1 = ; x2 = 3/2 ;
1 −3 17 −0.1250 0.7083
𝐾𝑒 (3) = [ ]=[ ]
24 −7 23 −0.2917 0.9583
1 7 0.5833
𝐹𝑒 (3) = [ ]=[ ]
12 8 0.6667
1 −3 17 𝑢1 1 7
𝐾𝑒 (3) 𝑈𝑒 (3) = 𝐹𝑒 (3) ; [ ] [𝑢 ] = [ ]
24 −7 23 2 12 8
Elément 4 : x1= 3/2 ; x2 = ;
1 1 19 −0.0417 0.7917
𝐾𝑒 (4) = [ ]=[ ]
24 −5 27 −0.2083 1.1250
1 10 0.8333
𝐹𝑒 (4) = [ ]=[ ]
12 11 0.9167
1 1 19 𝑢1 1 10
𝐾𝑒 (4) 𝑈𝑒 (4) = 𝐹𝑒 (4) ; [ ] [𝑢 ] = [ ]
24 −5 27 2 12 11
En réécrivant les systèmes élémentaires en fonction de toutes les composantes de U on obtient
:
Elément 1 :
−11 13 0 0 0 𝑢1 1
1 −11 15 0 0 0 𝑢 2 1 2
0 0 0 0 0 𝑢3 = 0
24 0 0 0 0 0 4 𝑢 12 0
[ 0 0 0 0 0] [𝑢5 ] [0]
Elément 2 :
0 0 0 0 0 𝑢1 0
1 0 −7 15 0 0 𝑢2 1 4
0 −9 19 0 0 𝑢3 = 5
24 0 0 0 0 0 4 𝑢 12 0
[0 0 0 0 0] [𝑢5 ] [0]
Elément 3 :
0 0 0 0 0 𝑢1 0
1 0 0 0 0 0 𝑢2 1 0
0 0 −3 17 0 𝑢3 = 7
24 0 0 −7 23 0 4 𝑢 12 8
[0 0 0 0 0] [𝑢5 ] [0]
Elément 4 :
26
0 0 0 0 0 𝑢1 0
1 0 0 0 0 0 𝑢2 1 0
0 0 0 0 0 𝑢3 = 0
24 0 0 0 1 19 4 𝑢 12 10
[0 0 0 −5 27] [𝑢5 ] [11]
En prenant maintenant la somme ( somme des intégrales), le système global s’écrit enfin :
−11 13 0 0 0 𝑢1 1
1 −11 15 − 7 15 0 0 𝑢2 1 2+4
0 −9 19 − 3 17 0 𝑢3 = 5 + 7 ≡ 𝐾𝑈 = 𝐹
24 0 0 −7 23 + 1 19 𝑢4 12 8 + 10
[ 0 0 0 −5 27] [𝑢5 ] [ 11 ]
On appel cette opération assemblage. En pratique, on ne procède pas de cette manière pour des
raisons d’économie de mémoire et de temps de calcul mais on fait un assemblage des matrices
élémentaires en utilisant les connectivités des éléments. La matrice globale K est d’abord
initialisée à la matrice nulle, ensuite à chaque construction de matrice élémentaire, on localise
avec une table là où il faut l’ajouter à la matrice globale. Dans le cas d’un degré de liberté par
nœud (ce cas présent) la table de localisation correspond à la table des connectivités. Exemple
; pour l’élément 1 la table de localisation est t = 1 2 on ajoute donc la matrice 𝐾𝑒 (1) à K(1,1)
, K(1,2) , K(2,1) et K(2,2) ; et pour l’élément 2 la table de localisation est t = 2 3 on ajoute la
matrice 𝐾𝑒 (2) à K(2,2) , K(2,3) , K(3,2) et K(3,3). Et ainsi de suite.
Le script MATLAB qui permet de faire ce type d’assemblage est simple :
%==========================================================================
% Programme pour la résolution des équations de
% la forme du/dx+a(x)u+b(x)=0 avec u(x0)=u0
% par la méthode des éléments finis sur
% l'intervalle [x0,xn]
% Fonctions de forme: polynôme d'interpolation
% de Lagrange
% Auteur: GBAGUIDI Thomas Brice
%==========================================================================
clc;
clear all;
% Intervalle
x0=-2;xn=2;
% Nombre de subdivision de l'intervalle [x0,xn] pour la MEF
27
n=20;
u0=2;
% Nombre de subdivision de l'intervalle [x0,xn] pour les intégrales
Nint=1000;
% Subdivision
X=linspace(x0,xn,n+1);
% Degré polynôme
nn=4; % Nombre de noeuds par élément
% Les fonctions a(t) et b(t)
a=@(t)(2*t); % Définition de la fonction a(t)
b=@(t)(0); % Définition de la fonction b(t)
% La matrice Ke et le vecteur Fe
Ke=zeros(n+1,n+1); % Initialisation de Ke à 0
Fe=zeros(n+1,1); % Initialisation de Fe à 0
XX=zeros(nn+1,n-nn+1);
for i=1:n-nn+1
for jj=1:nn+1
XX(jj,i)=X(i+jj-1);
end
ke=@(t)(LagMEF(XX(:,i),t)'*(dLagMEF(XX(:,i),t)+a(t)*LagMEF(XX(:,i),t)));
fe=@(t)(LagMEF(XX(:,i),t)'*b(t));
intke=integrale(ke,XX(1,i),XX(nn+1,i),Nint);
intfe=integrale(fe,XX(1,i),XX(nn+1,i),Nint);
Ke(i:i+nn,i:i+nn)=Ke(i:i+nn,i:i+nn)+intke; % Assemblage de Ke
Fe(i:i+nn,1)=Fe(i:i+nn,1)+intfe; % Assemblage de Fe
end
K=Ke(2:n+1,2:n+1);%exclusion de la première colonne et première ligne de Ke
F=Fe(2:n+1)-u0*Ke(2:n+1,1);% prise en compte de la condition aux limites
u=K\F;
X1=linspace(x0,xn,1001);y3=2*exp(-X1.^2+4);
f=@(s1,s2)[-a(s1)*s2+b(s1)];
[x2,y2]=RK4expSys(f,x0,xn,u0,15);
u=[u0;u];% Prise en compte de u(x0)=u0
plot(X1,y3,'r',X,u,'ro',x2,y2,'b+');%Représentation graphique
text(0,0,'du/dx+2x*u=0,x?[0,2],u(0)=2');
legend('Solution analytique','Solution MEF','Solution RK4');
grid on ;
28
120
100
80
60
40
20
0
-2 -1.5 -1 -0.5 0 0.5 1 1.5 2
29
La solution peut être maintenant calculée par un des algorithmes de résolution de système linéaires.
Notons que dans ce cas la matrice K est tridiagonale, mais avec MATLAB il suffit d’utiliser la division
gauche U = K \ F. Les résultats sont donnés dans le tableau et la figure suivants :
0.8
Solution exacte
0.6 Solution MEF
0.4
0.2
0
0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 2
30
for i = 1:n % boucle sur les éléments
j = i+1;
t = [i j];
x1 = x(i);
x2 = x(j);
[Ke, Fe] = MatElt2Nd(x1,x2);
K(t,t) = K(t,t) + Ke;
F(t) = F(t) + Fe;
end;
K(1,:) = []; % application des CAL
K(:,1) = [];
F(1,:) = [];
U = K\F; % résolution
U =[0;U]; % incorporation de la valeur initiale pour plot
Ue = 1-exp(-x.^2); % calcul de la solution exacte
Err = 100*(U-Ue)./Ue; % calcul de l’erreur relative
plot(x,U,x,Ue) % trace les deux solutions
end
31
𝑑𝑢
Avec les conditions aux limites 𝑢(0) = 0 et 𝑑𝑥 | =0
𝑥=1
1 1 −3𝑥
La solution exacte est : 𝑢 = (3𝑥 + 4)(1 − 𝑥) + 𝑒 (𝑥𝑒 3 + 8 − 12𝑥)
27 54
Le domaine sera subdivisé (maillé) en n éléments linéaires à 2 nœuds. La forme intégrale forte de
cette équation s’écrit :
1
𝑑2 𝑢 1
𝑑𝑢 1 1
∫ 𝛿𝑢 𝑑𝑥 + 6 ∫ 𝛿𝑢 𝑑𝑥 + 9 ∫ 𝛿𝑢𝑢𝑑𝑥 = ∫ 𝛿𝑢𝑥(1 − 𝑥)𝑑𝑥
0 𝑑𝑥 2 0 𝑑𝑥 0 0
Lorsqu’il est question d’équations différentielles du second ordre et plus, on est confronté à deux
difficultés. L’interpolation des dérivées et la satisfaction des conditions aux limites. En effet plus l’ordre
des dérivées est grand, plus fort doit être le degré des polynômes ou des fonctions d’interpolation à
utiliser. Un élément linéaire à deux nœuds ne peut donc être utilisé pour ce type d’équation. De plus, la
𝑑𝑢
forme intégrale forte ne fait pas apparaître la condition 𝑑𝑥 | =0
𝑥=1
Ces deux difficultés ont conduit à l’utilisation de la forme intégrale faible qu’on peut obtenir, dans le
cas présent avec intégration par partie du premier terme :
1
𝑑2 𝑢 1
𝛿𝑑𝑢 𝑑𝑢 𝑑𝑢 1
∫ 𝛿𝑢 2 𝑑𝑥 = − ∫ 𝑑𝑥 + [𝛿𝑢 ]
0 𝑑𝑥 0 𝑑𝑥 𝑑𝑥 𝑑𝑥 0
On voit immédiatement l’avantage majeur qu’offre cette expression. Elle réduit l’ordre des dérivées
𝑑𝑢
(d’où le terme faible) et permet de prendre en compte la condition aux limite |
𝑑𝑥 𝑥=1
=0
De plus puisque 𝑢 (0) = 0, le terme 𝛿𝑢 s’annule aussi à 𝑥 = 0 (il ne peut y avoir de perturbations
dans des valeurs connues ou nulles).
Ainsi la forme intégrale s’écrit avec la prise en compte des conditions aux limites comme suit :
1 1 1 1
𝛿𝑑𝑢 𝑑𝑢 𝑑𝑢
−∫ 𝑑𝑥 + 6 ∫ 𝛿𝑢 𝑑𝑥 + 9 ∫ 𝛿𝑢𝑢𝑑𝑥 = ∫ 𝛿𝑢𝑥(1 − 𝑥)𝑑𝑥
0 𝑑𝑥 𝑑𝑥 0 𝑑𝑥 0 0
Avec cette écriture il est possible d’utiliser un élément linéaire ; la matrice élémentaire Ke est la somme
de trois matrices : Ke = Ke + Ke2 + Ke3 , avec :
𝑥 − 𝑥2
𝑥2 1 𝑥 − 𝑥2 1
𝑥 − 𝑥2 𝑥1 − 𝑥2 𝑥1 − 𝑥2 𝑥2 − 𝑥1
𝐾𝑒1 = ∫ 1 𝑑𝑥
𝑥 − 𝑥1 1 𝑥 − 𝑥1 1
𝑥1
[𝑥2 − 𝑥1 𝑥1 − 𝑥2 𝑥2 − 𝑥1 𝑥2 − 𝑥1 ]
1
𝑥2 𝑥2
𝑥1 − 𝑥2 1 1 −1 1 −1
= −∫ < > 𝑑𝑥 = ∫ [ ] 𝑑𝑥
𝑥1
1 𝑥1 − 𝑥2 𝑥2 − 𝑥1 2
(𝑥1 − 𝑥2 ) 𝑥1 −1 1
[𝑥2 − 𝑥1 ]
32
1 −1 1
𝐾𝑒1 = [ ]
𝑥2 − 𝑥1 1 −1
𝑥 − 𝑥2
𝑥2 𝑥2
𝑥 −𝑥 1 1 6 𝑥 − 𝑥2 𝑥2 − 𝑥
𝐾𝑒2 = 6 ∫ [ 𝑥1 − 𝑥 2 ] < > 𝑑𝑥 = 2
∫ [𝑥 − 𝑥 𝑥 − 𝑥1 ] 𝑑𝑥
𝑥1
1 𝑥1 − 𝑥2 𝑥2 − 𝑥1 (𝑥1 − 𝑥2 ) 𝑥1 1
𝑥2 − 𝑥1
−3 3
𝐾𝑒2 = [ ]
−3 3
𝑥 − 𝑥2
𝑥2 𝑥 − 𝑥2 𝑥 − 𝑥1
𝑥 −𝑥
𝐾𝑒3 = 9 ∫ [ 𝑥1 − 𝑥 2 ] < > 𝑑𝑥
𝑥1
1 𝑥1 − 𝑥2 𝑥2 − 𝑥1
𝑥2 − 𝑥1
𝑥2
9 (𝑥 − 𝑥2 )2 −(𝑥 − 𝑥2 )(𝑥 − 𝑥1 )
= ∫ [ ] 𝑑𝑥
(𝑥1 − 𝑥2 )2 𝑥1 −(𝑥 − 𝑥2 )(𝑥 − 𝑥1 ) (𝑥 − 𝑥1 )2
(𝑥2 − 𝑥1 )3 (𝑥1 − 𝑥2 )3
9 3 6
=
(𝑥1 − 𝑥2 ) (𝑥1 − 𝑥2 )3
2 (𝑥2 − 𝑥1 )3
[ 6 3 ]
3(𝑥2 − 𝑥1 ) 2 1
𝐾𝑒3 = [ ]
2 1 2
et le vecteur élémentaire Fe est :
𝑥 − 𝑥2
𝑥2
𝑥 −𝑥
𝐹𝑒 = ∫ [ 𝑥1 − 𝑥 2 ] . 𝑥. (1 − 𝑥)𝑑𝑥
1
𝑥1
𝑥2 − 𝑥1
33
x2 = x(j);
[Ke,Fe] = MatElt2Nd(x1,x2);
K(t,t) = K(t,t) + Ke;
F(t) = F(t) + Fe;
end;
K(1,:) = [];
K(:,1) = [];
F(1) = [];
U = K\F;
U = [0.0;U];
t = 0:0.01:1;
Ue = 1/27*(1-t).*(3*t-4)+1/54*exp(-3*t).*(8+t*exp(3)-12*t);
plot(x,U,'-.',t,Ue)
end
12 12
10 10
8 8
6 6
4 4
2 2
0 0
-2 -2
-4 -4
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
34
𝑑2 𝑢
+𝑢−𝑥 =0
𝑑𝑥 2
𝑑𝑢
Avec les conditions aux limites 𝑢(0) = 0 et 𝑑𝑥 | = 0 pour la MEF et les conditions initiales 𝑢(0) =
𝑥=4𝜋
𝑑2 𝑢
0 et | = 0 pour l’intégration Pas à Pas
𝑑𝑥 2 𝑥=0
La solution exacte étant ue = x − sin x. La commande MATLAB qui permet d’avoir cette solution est :
>> ue = simplify(dsolve('D2u + u -t','u(0)=0','Du(4*pi)=0'))
La fonction MATLAB d’intégration pas à pas des systèmes à un degré de liberté avec la méthode
d’accélération linéaire est utilisée pour résoudre numériquement l’équation. Un exposé détaillé de cette
méthode peut être trouvé dans l’ouvrage de dynamique des structures de Penzien et Clough.
Les commandes MATLAB qui permettent de tracer les deux solutions sont les suivantes :
clear
clc
n = 20 % nombre de pas d’intégration ou d’éléments finis
dt = 4*pi/n; % pas de temps d’intégration
t = 0:dt:4*pi; % discrétisation du temps
acc = -t; % force d’inertie Fi = - m *acc
up = sdofth(1,0,1,acc,dt); % appel de la fonction d’intégration pas à pas
[um,xm] = EquadiffMEF(n); % solution par éléments finis
x = 0:0.01:4*pi; % coordonnées x pour tracer la solution exacte
ue= x-sin(x); % solution exacte
plot(t,up,'.',xm,um,'o', x,ue) % trace les trois solutions
36
end
end
N = expand(N); N = simplify(N); % réarrangement des termes de N
dN = simplify(diff(N,x)); % calcul des dérivée
end
Si le terme du second ordre de l’équation est multiplié par une fonction m(x) alors il est préférable de
diviser toute l’équation par ce terme sinon la formulation variationnelle faible fera intervenir un terme
intégrale de plus contenant la dérivée de m(x) par rapport à x.
Les paramètres de l’équation sont les fonctions k, c et f ainsi que les valeurs 𝑢0 et 𝑑𝑢𝑙 , ceux du domaine
(de la géométrie) sont 𝑥0 et 𝑥𝑙 et ceux propres à la méthode sont le type de l’élément caractérisé par
le nombre de nœud qu’il contient nne et le nombre d’éléments total net. Il est préférable de regrouper
tous ces paramètres dans une structure de données appelée Eq comme Equation.
Le programme d’éléments finis qu’on veut obtenir peut être appelé avec une préparation de données de
la manière suivante :
On voit clairement qu’avec ce type de script, il est facile de traiter des équations très diverses ; il suffit
de donner l’expression des coefficients dans les fonctions coef_k, coef_c et func_f, les bornes du
domaine ainsi que les conditions aux limites peuvent être changées à l’aide des valeurs de Eq.xi, Eq.xf,
37
Eq.u0 et Eq.Du. De plus nous avons maintenant le choix du type d’éléments et de leur nombre avec les
variables Eq.nne et Eq.net.
Remarque
La solution exacte de l’équation différentielle traitée comme exemple peut être obtenue avec ces
commandes :
>>ue = dsolve('D2u + 4* u = cos(t)','u(0)=1','Du(pi)=1');
>>ue = simplify(ue)
ue = 1/3*cos(t)+2/3*cos(2*t)+1/2*sin(2*t)
Pour arriver à une telle flexibilité, le programme doit être assez complet. Sa structure
générale est :
Début du programme
Géométrie (coordonnées et connectivités)
Initialisation des matrices
Début de boucle sur les éléments
Appel de fonction pour calculer dNT dN dx
Appel de fonction pour calculer NT c(x) dN dx
Appel de fonction pour calculer NT k(x) N dx
Appel de fonction pour calculer NT f(x) dx
Assemblage de la matrice K
Assemblage du vecteur F
Fin de boucle sur les éléments
Application des conditions aux limites
Résolution
Fin du programme
38
end
La première chose qu’on remarque dans cette version du programme est que le domaine est maillé avec
la fonction maillage1d qui permet de calculer à la fois les coordonnées des nœuds et les connectivités
des éléments. Cette façon de faire est particulièrement utile pour les cas de deux ou trois dimensions,
notamment lorsqu’on veut utiliser un fichier de maillage résultat d’un programme de maillage
automatique. Pour ce cas simple, on propose cette fonction comme suit :
function [t,p] = maillage1d(net,nne,xi,xf)
%=====================================================
% [t,p] = maillage1d(net,nne)
% t : table des connectivités des éléments linéiques
% p : table des coordonnées des noeuds
% net : nombre d'éléments total
% nne : nombre de noeuds par élément
% xi,xf : bornes du domaine d'intégration
%
%=====================================================
t(1,:) = 1:nne;
for i = 2:net
t(i,:) = t(i-1,:)+nne-1;
end;
n = (nne-1)*(net);
dx = (xf-xi)/n;
p = xi:dx:xf;
end
La deuxième remarque est plus importante, elle concerne le calcul des matrices élémentaires. La
fonction MatElt2N utilisée dans les versions précédentes est maintenant remplacée par quatre fonctions
dont trois : intdNTdN, intNTcxdN, intNTkxN retournent les matrices élémentaires après intégration et
la quatrième intNTfx fait le calcul du vecteur force élémentaire. Les arguments d’entrée sont un vecteur
X des coordonnées de l’élément, les pointeurs Eq.k, Eq.c et Eq.f qui prennent les adresses (ou handle)
des fonctions k(x), c(x) et f(x). La taille du vecteur X n’étant pas spécifiée, les fonctions prennent en
charge tout type d’élément linéique.
Il est à rappeler que c’est dans ces fonctions que s’effectue l’intégration des matrices, et c’est justement
ce qui a limité les versions précédentes, donc c’est ici qu’on s’attend à des modifications. En effet,
l’intégration exacte des composantes des matrices est remplacée par une somme pondérée des valeurs
de ces composantes en des points spécifiques selon la méthode d’intégration numérique de Gauss. Cette
méthode qui sera exposée plus loin, nous permet d’évaluer l’intégrale d’une fonction à l’aide d’une
somme, soit :
𝑏 𝑛
∫ 𝑓(𝑥)𝑑𝑥 = ∑ 𝑤𝑖 𝑓(𝑥𝑖 )
𝑎 𝑖=1
Avec f une fonction quelconque de x, n est le nombre de points xi dans lesquels on évalue la fonction et
𝑤𝑖 sont des valeurs de pondération. Les coordonnées xi ainsi que les poids 𝑤𝑖 sont calculés et la précision
de cette intégration numérique dépend du nombre de points n, le résultat est exacte si la fonction f est
39
un polynôme d’ordre 2n. On donne ci-dessous les points et poids pour l’intégration sur l’intervalle
−1,+1 :
n=3
x -0.34641016151378 0 0.34641016151378
w 0.55555555555556 0.88888888888889 0.55555555555556
n=4
x -0.861136311594053 0.861136311594053 -0.339981043584856
0.339981043584856
w 0.347854845137454 0.347854845137454 0.652145154862546
0.652145154862546
n=6
x -0.932469514203152 0.932469514203152 -0.661209386466265
0.661209386466265
w 0.171324492379170 0.171324492379170 0.360761573048139
0.360761573048139
x -0.238619186083197 0.238619186083197
w 0.467913934572691 0.467913934572691
La fonction MATLAB implémentée pour le programme est basée sur un nombre de point n = 6, ce qui
nous permet d’utiliser pratiquement sans perte de précision des éléments ayant jusqu’à 11 nœuds.
function [xsi,w] = wpgL6p
%====================================================================
% [xsi,w] = wpgL6p
% xsi, w : points et poids de Gauss entre -1 et +1 en vecteurs lignes
% nombre de poins : 6 points
%====================================================================
xsi = [ -0.932469514203152 , 0.932469514203152 , ...
-0.661209386466265 , 0.661209386466265 , ...
-0.238619186083197 , 0.238619186083197 , ...
];
w = [ 0.171324492379170 , 0.171324492379170 , ...
0.360761573048139 , 0.360761573048139 , ...
0.467913934572691 , 0.467913934572691 , ...
];
end
Avec cette méthode d’intégration, les expressions exactes des matrices élémentaires
ne sont plus nécessaires, d’autant plus qu’on ne connaît pas, à priori, les fonctions
à intégrer ; les coefficients de l’équation peuvent être quelconques.
Le dernier point qui reste consiste à faire le passage entre les bornes d’intégration de
l’élément réel et les bornes -1 et +1 de l’élément de référence. La transformation
géométrique :
𝑥 = 𝑁𝜉
40
𝑑𝑁 𝑑𝑁 𝑑𝑥
=
𝑑𝜉 𝑑𝑥 𝑑𝜉
𝑑𝑁 𝑑𝑁
Soit sous forme plus générale 𝑑𝜉
= 𝐽 𝑑𝑥 . (dans le cas de deux ou trois dimensions,
est une matrice jacobienne)
𝑑𝑥 𝑑 𝑑𝑁
𝐽= = (𝑁𝑥𝑛 ) = 𝑥
𝑑𝜉 𝑑𝜉 𝑑𝜉 𝑛
1 𝑑𝑁 1
Exemple d’un élément linéaire : 𝑁 = <1−𝜉 1+𝜉 > , = < −1 1 >
2 𝑑𝜉 2
1 𝑥1 1
et 𝐽 = 2 < −1 1 > [𝑥 ] = 2 (𝑥2 − 𝑥1 )
2
function Ce = intNTcxdN(cx,Xn)
%===================================
% integration de : N' * c(x) * dN
%===================================
[xsi, w] = wpgL4p;
npg = length(xsi);
nne = length(Xn);
41
Ce = zeros(nne);
for i =1:npg
[N, dN] = FF1D(xsi(i), nne);
x = N * Xn;
J = dN * Xn;
dN = dN * inv(J);
c = feval(cx,x);
Ce = Ce + det(J) * w(i) * c * (N' * dN);
end
end
function Ke = intNTkxN(kx,Xn)
%==================================
% intégration de : N' * k(x) * N
%==================================
[xsi, w] = wpgL4p;
npg = length(xsi);
nne = length(Xn);
Ke = zeros(nne);
for i =1:npg
[N, dN] = FF1D(xsi(i), nne);
x = N * Xn;
J = dN * Xn;
k = feval(kx,x);
Ke = Ke+det(J)*w(i)*k*(N'*N);
end
end
function Fe = intNTfx(fx,Xn)
%==================================
% integration de : N' * f(x)
%==================================
[xsi, w] = wpgL4p;
npg = length(xsi);
nne = length(Xn);
Fe = zeros(nne,1);
for i =1:npg
[N, dN] = FF1D(xsi(i), nne);
x = N * Xn;
J = dN * Xn;
f = feval(fx,x);
Fe = Fe + det(J) * w(i) * f * N';
end
end
Les fonctions de forme ainsi que leurs dérivées pour des éléments de référence d’ordre
n sont :
function [N,dN] = FF1D(x,n)
%=======================================================
% [N,dN] = FF1D(x,n)
% N : fonctions de forme d'éléments linéiques 1D
% dN : dérivées des fonctions de forme
% x : point d'evaluation des fonctions
% n : nombre de noeuds de l'élément
%
%
%=======================================================
42
if isa(x,'sym') % détermine si x est symbolique
one = sym(1);
zero = sym(0);
else
one = 1.0;
zero = 0.0;
if (x < -1) || (x > 1)
error('coordonné x erronée');
end
end
xn =-1:2/(n-1):1;
for i=1:n
p(i) = one;
q(i) = one;
s(i) = zero;
for j=1:n
if j~=i
p(i) = p(i) * (x - xn(j));
q(i) = q(i) * (xn(i) - xn(j));
r = one;
for k =1:n
if (k~=i && k~=j)
r = r*(x - xn(k));
end
end
s(i) = s(i) + r;
end
end
end
N = p./q;
dN = s./q;
end
Modifier les fonctions coef_k, coef_c et func_f, ainsi que les bornes du domaine et les
conditions aux limites. Faire une étude de convergence en type et en nombre
d’éléments.
2) Résoudre avec le programme MefEquaDiff l’équation :
𝑑2 𝑢 1 𝑑𝑢 1 + 𝑥 2
+ =
𝑑𝑥 2 𝑥 𝑑𝑥 𝑥
𝑑𝑢
avec les conditions aux limites : 𝑢(0) = 1 et 𝑑𝑥 | = −2
𝑥=4𝜋
3.14 Résolution des problèmes d’ordre 2 avec des conditions aux limites de type Robin
Il s’agit des problèmes de la forme
𝑑2 𝑢 𝑑𝑢
2
+ 𝑎(𝑥) + 𝑏(𝑥)𝑢 = 𝑐(𝑥), 𝑥 ∈ ]𝑥0 , 𝑥𝑛 [
𝑑𝑥 𝑑𝑥
𝛼1 𝑢(𝑥0 ) + 𝛽1 𝑢′(𝑥0 ) = 𝛾1 (𝛼1 , 𝛽1 ) ≠ (0,0)
{𝛼2 𝑢(𝑥𝑛 ) + 𝛽2 𝑢′(𝑥𝑛 ) = 𝛾2 (𝛼2 , 𝛽2 ) ≠ (0,0)
En suivant la démarche du paragraphe 3.8, on peut écrire :
(𝐾𝑒1 + 𝐾𝑒2 + 𝐾𝑒3 )𝑈𝑛 = 𝐹𝑒
Avec
43
𝑥2
𝑑𝑁 𝑇 𝑑𝑁
𝐾𝑒1 = − ∫ 𝑑𝑥
𝑥1 𝑑𝑥 𝑑𝑥
𝑥2
𝑑𝑁
𝐾𝑒2 = ∫ 𝑁 𝑇 𝑎(𝑥) 𝑑𝑥
𝑥1 𝑑𝑥
𝑥2
𝐾𝑒3 = ∫ 𝑁 𝑇 𝑏(𝑥) 𝑁𝑑𝑥
𝑥1
𝑥2
𝐹𝑒 = ∫ 𝑁 𝑇 𝑐(𝑥) 𝑑𝑥
𝑥1
L’assemblage pourra se faire suivant l’algorithme décrit au paragraphe 3.8
Discrétisation et application des conditions aux limites :
𝑛+1
44
⋯ ′
𝑘11 𝑘13 𝑘1 𝑛−1 𝑘1𝑛 𝑢1 𝐹1 𝐾12 𝐾1𝑛+1
𝑘31 𝑘33 ⋯ ′
𝑘3 𝑛−1 𝑘3𝑛 𝑢3 𝐹3 𝐾32 𝛾2 ℎ 𝐾3 𝑛+1
⋮ ⋮ ⋮ ⋮ = − 𝑢2 −
⋯ 𝑘𝑛−1𝑛−1 ′ 𝑢𝑛−1 𝐹𝑛−1 𝐾𝑛−1 2 𝛼2 ℎ + 𝛽2 𝐾
𝑘𝑛−11 𝑘𝑛−1 3 𝑘𝑛−1𝑛 𝑛−1 𝑛
[ 𝑘𝑛1 𝑘𝑛 3 ⋯ 𝑘𝑛 𝑛−1 ′
𝑘𝑛 𝑛 ] [ 𝑢 𝑛 ] [ 𝐹𝑛 ] [ 𝐾𝑛 2 ] [𝐾 𝑛 𝑛+1 ]
𝛽2
Où 𝑘𝑖′ 𝑛 = 𝑘𝑖 𝑛 + 𝛼 ℎ+𝛽 𝑘𝑖 𝑛+1 avec 𝑖 = 1,3,4, … , 𝑛
2 2
Après la résolution de ce système d’équation linéaire, les composantes 𝑢2 et 𝑢𝑛+1 du vecteur u,
dont les expressions sont connues (𝑢2 est connue directement, mais 𝑢𝑛+1 est fonction de 𝑢𝑛 ),
pourront être calculées et le vecteur u pourra être reconstitué.
• 3ème cas : 𝛼1 ℎ − 𝛽1 ≠ 0 et 𝛼2 ℎ + 𝛽2 = 0
On a
(𝛼 ℎ − 𝛽1 )𝑢1 + 𝛽1 𝑢2 = 𝛾1 ℎ
{ 1
(𝛼2 ℎ + 𝛽2 )𝑢𝑛+1 − 𝛽2 𝑢𝑛 = 𝛾2 ℎ
𝛽1 𝛾1 ℎ 𝛾 ℎ
𝑢1 = − 𝛼 ℎ−𝛽 𝑢2 + 𝛼 ℎ−𝛽 et 𝑢𝑛 = − 𝛽2
1 1 1 1 2
𝑛+1
𝛽1 𝛾1 ℎ
∑ 𝑘𝑖𝑗 𝑢𝑗 + (𝑘𝑖 2 − 𝑘𝑖 1 ) 𝑢2 = 𝐹𝑖 − 𝑘 − 𝑢𝑛 𝑘𝑖 𝑛
𝛼1 ℎ − 𝛽1 𝛼1 ℎ − 𝛽1 𝑖 1
𝑗=3
𝑗≠𝑛
𝛽1 𝛾1 ℎ 𝛽2 𝛾2 ℎ
𝑢1 = − 𝛼 𝑢2 + 𝛼 et 𝑢𝑛+1 = 𝛼 𝑢𝑛 + 𝛼
1 ℎ−𝛽1 1 ℎ−𝛽1 2 ℎ+𝛽2 2 ℎ+𝛽2
𝑛−1
𝛽1 𝛽2
∑ 𝑘𝑖𝑗 𝑢𝑗 + (𝑘𝑖 2 − 𝑘𝑖 1 ) 𝑢2 + (𝑘𝑖 𝑛 + 𝑘 )𝑢
𝛼1 ℎ − 𝛽1 𝛼2 ℎ + 𝛽2 𝑖 𝑛+1 𝑛
𝑗=3
𝛾1 ℎ 𝛾2 ℎ
= 𝐹𝑖 − 𝑘𝑖 1 − 𝑘
𝛼1 ℎ − 𝛽1 𝛼2 ℎ + 𝛽2 𝑖 𝑛+1
Ce qui donne le système suivant
𝑘22′
𝑘23 ⋯ 𝑘2 𝑛−1 𝑘2′ 𝑛 𝑢2
′
𝑘32 𝑘33 ⋯ 𝑘3 𝑛−1 𝑘3′ 𝑛 𝑢3
⋮ ⋮ ⋮ ⋮
′ ′ 𝑢𝑛−1
𝑘𝑛−1 2 𝑘𝑛−1 3 ⋯ 𝑘𝑛−1𝑛−1 𝑘𝑛−1 𝑛
′
[ 𝑘𝑛 2 𝑘𝑛 3 ⋯ 𝑘𝑛 𝑛−1 𝑘𝑛 𝑛 ] 𝑢𝑛 ]′ [
𝐹2 𝐾21 𝐾2 𝑛+1
𝐹3 𝛾1 ℎ 𝐾31 𝛾2 ℎ 𝐾3 𝑛+1
= − −
𝐹𝑛−1 𝛼1 ℎ − 𝛽1 𝐾 𝛼2 ℎ + 𝛽2 𝐾
𝑛−1 1 𝑛−1 𝑛+1
[ 𝐹𝑛 ] [ 𝐾𝑛 1 ] [ 𝐾𝑛 𝑛+1 ]
𝛽1 𝛽2
Où 𝑘𝑖′ 2 = 𝑘𝑖 2 − 𝛼 ℎ−𝛽 𝑘𝑖 1 et 𝑘𝑖′ 𝑛 = 𝑘𝑖 𝑛 + 𝛼 ℎ+𝛽 𝑘𝑖 𝑛+1 avec 𝑖 = 2,3, … , 𝑛
1 1 2 2
45
L’implémentation de cet algorithme donne le script suivant :
%==========================================================================
% Programme pour la résolution des problèmes aux limites
% la forme d^2u/dx^2+a(x)du/dx+b(x)u=c(x), x appartenant à ]x0,xn[
% avec des conditions de Robin:
% alpha1*u(x0)+beta1*u'(x0)=gama1
% alpha2*u(xn)+beta2*u'(xn)=gama2
% par la méthode des éléments finis sur
% Fonctions de forme: polynôme d'interpolation
% de Lagrange
% Auteur: GBAGUIDI Thomas Brice
%==========================================================================
clc;
clear all;
% Intervalle
x0=1;xn=10;
% Nombre de subdivision de l'intervalle [x0,xn] pour la MEF
nn=10; % Nombre de noeuds d'interpolation
ne=30; % Nombre d'élément
n=(nn-1)*ne;
%pas
h=(xn-x0)/n;
% Les conditions aux limites
alpha1=0;
beta1=1;
gama1=4*exp(-1);
alpha2=0;
beta2=1;
gama2=-221*exp(-10);
% Nombre de subdivision de l'intervalle [x0,xn] pour les intégrales
Nint=1000;
% Subdivision
X=linspace(x0,xn,n+1);
% Degré polynôme
% Les fonctions a(t) b(t) et c(x)
a=@(t)(1);
b=@(t)(2./t);
c=@(t)(2*(2-1./t)*exp(-t));
% La matrice Ke
Ke=zeros(n+1,n+1);
Fe=zeros(n+1,1);
XX=zeros(nn,ne);
for i=1:ne
k1=(i-1)*(nn-1)+1;k2=(i-1)*(nn-1)+nn;
for jj=1:nn
XX(jj,i)=X(k1+jj-1);
end
dNTdN=@(t)(dLagMEF(XX(:,i),t)'*dLagMEF(XX(:,i),t));
NTdN=@(t)(LagMEF(XX(:,i),t)'*dLagMEF(XX(:,i),t));
NTN=@(t)(LagMEF(XX(:,i),t)'*LagMEF(XX(:,i),t));
ke=@(t)(-dNTdN(t)+a(t)*NTdN(t)+b(t)*NTN(t));
fe=@(t)(LagMEF( XX(:,i),t )'*c(t));
intke=integrale(ke,XX(1,i),XX(nn,i),Nint);
intfe=integrale(fe,XX(1,i),XX(nn,i),Nint);
Ke(k1:k2,k1:k2)=Ke(k1:k2,k1:k2)+intke;
Fe(k1:k2,1)=Fe(k1:k2,1)+intfe;
end
K=Ke;
F=Fe;
test1=alpha1*h-beta1;test2=alpha2*h+beta2;
46
if(test1==0)
u2=gama1*h/beta1;
if(test2==0)
unm1=-gama2*h/beta2;
F=F-u2*Ke(:,2)-unm1*Ke(:,n);
K(:,2)=[];
K(:,n-1)=[];
K(2,:)=[];
F(2)=[];
K(n-1,:)=[];
F(n-1)=[];
u=K\F;
u=[u(1);u2;u(2:n-2);unm1;u(n-1)];
else
F=F-u2*Ke(:,2)-gama2*h/test2*Ke(:,n+1);
K(:,n)=K(:,n)+beta2/test2*K(:,n+1);
K(:,2)=[];
K(:,n)=[];
K(2,:)=[];
F(2)=[];
K(n,:)=[];
F(n)=[];
u=K\F;
un=(beta2*u(end)+gama2*h)/test2;
u=[u(1);u2;u(2:n-1);un];
end
else
if(test2==0)
unm1=-gama2*h/beta2;
F=F-gama1*h/test1*Ke(:,1)-unm1*Ke(:,n);
K(:,2)=K(:,2)-beta1/test1*K(:,1);
K(:,1)=[];
K(:,n-1)=[];
K(1,:)=[];
F(1)=[];
K(n-1,:)=[];
F(n-1)=[];
u=K\F;
u1=(-beta1*u(1)+gama1*h)/test1;
u=[u1;u(1:n-2);unm1;u(n-1)];
else
F=F-gama1*h/test1*Ke(:,1)-gama2*h/test2*Ke(:,n+1);
K(:,n)=K(:,n)+beta2/test2*K(:,n+1);
K(:,2)=K(:,2)-beta1/test1*K(:,1);
K(:,1)=[];
K(:,n)=[];
K(1,:)=[];
F(1)=[];
K(n,:)=[];
F(n)=[];
u=K\F;
u1=(-beta1*u(1)+gama1*h)/test1;
un=(beta2*u(n-1)+gama2*h)/test2;
u=[u1;u(1:n-1);un];
end
end
uexact=(3*X.^2-2*X-1).*exp(-X);
plot(X,u,'ro',X,uexact); % Représentation graphique de la solution
legend('Solution MEF','Solution exacte');
grid on ;
47
Ce programme a été exécuté :
1.4 1.4
Solution MEF d2y/dt 2+dy/dt+2/t*y=2*(2-1/t)exp(-t) Solution MEF
d2y/dt 2+dy/dt+2/t*y=2*(2-1/t)exp(-t)
Solution exacte alpha1*y(t0)+beta1*y'(t0)=gama1 Solution exacte
alpha1*y(t0)+beta1*y'(t0)=gama1 1.2
1.2 alpha2*y(tn)+beta2*y'(tn)=gama2 alpha2*y(tn)+beta2*y'(tn)=gama2
0.2 0.2
0 0
1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10
-3
x 10
0.08 10
d2y/dt 2+dy/dt+2/t*y=2*(2-1/t)exp(-t) erreure absolue
d2y/dt 2+dy/dt+2/t*y=2*(2-1/t)exp(-t) erreure absolue
0.07 alpha1*y(t0)+beta1*y'(t0)=gama1 alpha1*y(t0)+beta1*y'(t0)=gama1
alpha2*y(tn)+beta2*y'(tn)=gama2 8 alpha2*y(tn)+beta2*y'(tn)=gama2
0.06 ° Nombre d'élément n=10 ° Nombre d'élément n=30
° Nombre de noeuds ° Nombre de noeuds
0.05 d'interpolation par élément: 6 d'interpolation par élément:
n=5 n=10
° alpha1=0 ° alpha1=0
0.04 ° beta1=1 ° beta1=1
° gama1=4/e 4 ° gama1=4/e
0.03 ° alpha2=0 ° alpha2=0
° beta2=1 ° beta2=1
0.02 ° gama2=-221/e10 2 ° gama2=-221/e10
0.01
0
0
-0.01 -2
1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10
0.35
0.12
d2y/dt 2+dy/dt+2/t*y=2*(2-1/t)exp(-t) erreure relative
d2y/dt 2+dy/dt+2/t*y=2*(2-1/t)exp(-t) erreure relative
alpha1*y(t0)+beta1*y'(t0)=gama1
0.3 alpha1*y(t0)+beta1*y'(t0)=gama1
alpha2*y(tn)+beta2*y'(tn)=gama2 alpha2*y(tn)+beta2*y'(tn)=gama2
0.1
° Nombre d'élément n=10 ° Nombre d'élément n=30
0.25 ° Nombre de noeuds ° Nombre de noeuds
d'interpolation par élément: d'interpolation par élément:
0.08
n=5 n=10
0.2 ° alpha1=0 ° alpha1=0
° beta1=1 ° beta1=1
° gama1=4/e 0.06 ° gama1=4/e
0.15 ° alpha2=0 ° alpha2=0
° beta2=1 ° beta2=1
° gama2=-221/e10 ° gama2=-221/e10
0.04
0.1
0.05 0.02
0 0
1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10
48