ECP Math´ematiques 2 : Analyse 2e Ann´ee 2005-2006
Analyse, s´eance 3 : exercices corrig´es LA MISE EN OEUVRE
Question 1
Rappeler les principes de construction du syst`eme : K U=F qui d´etermineuh.
Il faut calculer, en effectuant une boucle sur les ´el´ements, les int´egrales Ki,j =a(wi, wj) =
Z
Ω
k∇wi∇wj dΩ + Z
Ω
c wiwjdΩ
et calculer, en effectuant une boucle sur les ´el´ements et sur les segments du bord, les int´egrales Fi=L(wi) =
Z
Ω
q(x)wi(x)dΩ + Z
Γ
λ wi(x)ds Principe
Une int´egrale sur un segment est calcul´ee par une formule d’int´egration (la formule des trap`ezes par exemple ou la formule de Simpson). Une int´egrale sur un bord est ensuite calcul´ee en effectuant la somme, sur tous les segments du bord, de la contribution d’un segment `a cette int´egrale.
Une int´egrale sur un triangle est calcul´ee par une formule d’int´egration. Une int´egrale sur un domaine plan est ensuite calcul´ee en effectuant la somme sur tous les triangles de la contribution d’un triangle `a cette int´egrale.
Noter qu’en utilisant les commandes particuli`eres de MatLab pour traiter les matrices on peut ´ecrire le programme d’assemblage de mani`ere plus condens´ee :
function K=assemblage(ELEM,COORD);
global c
[ne,aux] = size(ELEM);
[np,aux] = size(COORD);
K = zeros(np,np);
for e=1:ne,
NOEUD = ELEM(e,:); % NOEUD : num´erotation globale Ke = Raideur_elem(NOEUD,COORD);
K(NOEUD,NOEUD) = K(NOEUD,NOEUD) + Ke;
end;
2 Math´ematiques 2 : Analyse
• Soit un domaine Ω carr´e, de cˆot´e 2h, d´ecoup´e en 4 triangles rectangles isoc`eles `a partir de son centre. On a doncne= 4, np= 5, pr´eciser les tableaux COORD, ELEM et BORD.
Si 1 est le noeud milieu, 2,3,4,5 les sommets du carr´e de cˆot´e 2h, Le noeud 2 ´etant l’origine des coordonn´ees :
COORD=
h h
0 0
2h 0 2h 2h
0 2h
ELEM =
2 1 3 1 4 3 1 5 4 1 2 5
BORD=
2 3 3 4 4 5 5 2
• Faire “tourner” `a la main le programme ci-dessus sur cet exemple.
La matrice de raideur ´el´ementaire du triangle rectangle isoc`ele 2,1,3 est
Ke=ch2 12
2 1 1 1 2 1 1 1 2
La matrice de raideurK est
K =ch2 12
8 2 2 2 2
2 4 1 0 1
2 1 4 1 0
2 0 1 4 1
2 1 0 1 4
Question 2
Ecrire un programme de calcul des matrices de raideur ´el´ementaire associ´ees au terme :´ Z
Ω
k∇u .∇v dΩ
Voir polycopi´e page 87.
Question 3
Ecrire un programme de calcul des termes du second membre´ F associ´es `a RΩqv dΩ. En d´eveloppant q dans la base wj on pourrait ´ecrire q(x) = Pjqjwj et utiliser le r´esultat de
S´eance 3 3
la premi`ere question. On peut aussi suivre la m´ethode g´en´erale, calculer la contribution F e d’un triangle `a F, puis sommer ces contributions. Le programme ci-dessous utilise la mˆeme formule d’int´egration que dans la premi`ere question, apr`es interpolation de la fonction q(x) par des fonctions affines, d’o`u pour un triangle de noeuds i, j, k
Z
T e
qwidΩ = (2Q(i) +Q(j) +Q(k))/4∗Se/3
On range dans un vecteur Qles valeurs de la fonction q(x) aux noeuds.
function Fe = charge_elem(NOEUD,COORD,Q)
% contribution d’un triangle `a F for i = 1:3,
Qe(i) = Q(NOEUD(I));
X(i) = COORD(NOEUD(i),1);
Y(i) = COORD(NOEUD(i),2); % coordonn´ees des sommets end;
Se = abs((X(2)-X(1))*(Y(3)-Y(1)) - (X(3)-X(1))*(Y(2)-Y(1)))/2;
aux = Qe(1)+Qe(1)+Qe(3);
for i = 1:3,
Fe(i) = (Qe(i) +aux)*Se/12;
end;
function F = assemblage(ELEM,COORD,Q);
[np,aux]=size(COORD);
[ne,aux]=size(ELEM);
F = zeros(np,1);
for e = 1:ne,
for i=1:3, % i : num´erotation locale
NOEUD(i) = ELEM(e,i); % NOEUD : num´erotation globale end;
Fe = charge_elem(NOEUD,COORD,Q);
for i=1:3,
F(NOEUD(i)) = F(NOEUD(i)) + Fe(i);
end;
end;
En pratique il est pr´ef´erable d’initialiserF `a 0 hors de cette fonction pour pouvoir assembler diff´erentes contributions.
Question 4
Ecrire un programme de calcul des termes du second membre´ F associ´es `aR∂Ωλ v ds.
On calcule la contribution F e d’un segment `a F, puis on somme ces contributions. Le pro- gramme ci-dessous utilise la formule des trap`ezes pour calculer les int´egrales sur un segment,
4 Math´ematiques 2 : Analyse
d’o`u pour un segment de noeuds i, j Z
Be
λwidΩ =λ∗Le/2
o`u Le est la longueur du segment.
function Fe = chargeb_elem(NOEUD,COORD);
% contribution d’un segment `a F global lambda
for i = 1:2,
X(i) = COORD(NOEUD(i),1);
Y(i) = COORD(NOEUD(i),2);
end;
Le = sqrt((X(2)-X(1))^2 + (Y(2)-Y(1))^2);
for i = 1:2,
Fe(i) = lambda*Le/2;
end;
function F = assemblage(F,BORD,COORD);
[np,aux]=size(BORD);
for e = 1:nb,
for i=1:2, % i : num´erotation locale
NOEUD(i) = BORD(e,i); % NOEUD : num´erotation globale end;
Fe = chargeb_elem(NOEUD,COORD);
for i=1:3,
F(NOEUD(i)) = F(NOEUD(i)) + Fe(i);
end;
end;
On ajoute les contributions du bord au vecteurF qui a d´ej`a ´et´e initialis´e.
S.L