Vous êtes sur la page 1sur 21

Projets éléments nis 2 avec MATLAB

Mathématiques Mini-Projet de semestre (hiver 2007-2008)

Professeur : Alo Quarteroni


Assistant : Benjamin Stamm
Étudiants :

Claudio Messina & Abdelaziz Belqhuadi


19 décembre 2007

1
Partie 1
Soit Ω = (0, 1) nous considérons le problème de diusion non-stationnaire
suivant :
2 u(x, t) = 0,

 ∂t u(x, t) − µ∂xx (x, t) ∈ Ω × (0, 1),
u(0, t) = 0, u(1, t) = 1, t ∈ (0, 1), (1)
u(x, 0) = u0 (x) x ∈ Ω,

étant µ > 0 une constante et u0 ∈ L2 (Ω) une fonction données.


Ce problème décrit l'évolution de la température u(x, t), au point x et à
l'instant t, d'une barre métallique de longueur 1 avec conductivité thermique
µ, où on impose aux extrémités une température de 0 et 1 degrés respec-
tivement. La fonction u0 décrit la température initiale de la barre, tandis
que la fonction f = 0 représente la source de chaleur (par unité de longueur)
fournie à la barre. Le problème (1) est connu comme l'équation de la chaleur.

1 Formulation faible
Dans le problème (1) les conditions au bord ne sont pas homogènes, pour se
ramener au cas des conditions au bord homogènes, on dénit une fonction
aussi simple que possible R ∈ L(Ω × R∗ ), R(x, t) = x, dite relèvement, qui
satisfait les conditions au bord données. Avec ceci on récrit u = u
e + R où u
e
appartient à V , et V = {v ∈ H 1 (Ω)|v = 0 si x = 1}.
Ensuite nous multiplions l'équation par une fonction test v ∈ V et nous
calculons l'intégral sur le domaine (0, 1).
Z 1
2
(∂t u(x, t) − µ∂xx u(x, t))vdx = 0
0
Z 1
2
u(x, t) + R(x, t)) − µ∂xx
(∂t (e (e
u(x, t) + R(x, t)))vdx = 0
0
Z 1
2
u(x, t) + x) − µ∂xx
(∂t (e (e
u(x, t) + x))vdx = 0
0
Z 1
2
u(x, t)v − µ∂xx
(∂t (e (eu(x, t))vdx = 0
0
Z 1 Z 1
e(x, t)vdx − [µv∂x u
∂t u e(x, t)]10 + µ ∂x u
e(x, t)∂x vdx = 0
0 0
Z 1 Z 1
e(x, t)vdx + µ
∂t u ∂x u
e(x, t)∂x vdx 0 . (2)
= |{z}
|0 {z } | 0 {z } F (v)
(∂t u
e(x,t),v) a(e
u(x,t),v)

2
Donc la forme faible du problème s'écrit :

Pour t ∈ (0, 1), chercher u e(t) ∈ V , tel que



(3)
(∂t u u(t), v) = F (v) ∀v ∈ V,
e(t), v) + a(e

avec u(0) = u0 ; où a(·, ·) est une forme bilinéaire et F est la fonctionnelle


linéaire dépendant de f et des conditions au bord.

2 Système d'équations diérentielles


Nous introduisons maintenant l'approximation de Galerkin du problème (3) :

Pour t ∈ R+ , chercher uh (t) ∈ Vh , tel que



(4)
(∂t uh (t), vh ) + a(uh (t), vh ) = F (vh ) ∀vh ∈ Vh ,

avec uh (0) = u0,h , Vh ⊂ V est un sous-espace de dimension nie et u0,h est


une approximation appropriée de u0 dans Vh .
Nous dénissons la base {ϕi }Ni=1 de l'espace Vh avec :
 x−x
i−1
 xi −xi−1
 si xi−1 ≤ x ≤ xi
xi+1 −x
ϕi (x) = x −x si xi ≤ x ≤ xi+1
 i+1 i
sinon.

0

Puisque pour tout t > 0 la solution uh du problème Pde Galerkin appartient


au sous-espace Vh nous pouvons exprimer uh (x, t) = nj=1 uj (t)ϕj (x), où les
coecients {uj (t)} sont les inconnues du problème (4).
En remplaçant uh (x, t) ainsi déni et en prenant vh = ϕj (t) dans (4) nous
obtenons pour i = 1, · · · , N :
Z 1 XN Z 1 XN
∂t ( uj (t)ϕj (x))ϕi (x)dx + µ∂x ( uj (t)ϕj (x))∂x ϕi (x)dx = 0
0 j=1 0 j=1
N
X Z 1 N
X Z 1
u̇j (t) ϕj (x)ϕi (x)dx + uj (t) µϕ0j (x)ϕ0i (x)dx = 0.
j=1 |0 {z } j=1 |0 {z }
mij aij

Dans la série 6 exercice 2 nous avons déjà calculé les coecients aij , mij ,
nous avons trouvé :
Z 1
aij = a(ϕj , ϕi ) = µϕ0j (x)ϕ0i (x)dx
0
 µ
− si i=j−1
 2µh

si i = j

= h
µ
− si i = j + 1
 h


0 sinon,

3
et donc la matrice A s'écrit :
 2µ −µ 
h h
 −µ 2µ −µ 
h h h
−µ 2µ −µ
 
 
h h h
A= .. .. .. .
 
 . . . 
−µ −µ
 2µ

 
h h h
−µ 2µ
h h

Pour les coecients de M :


Z 1
mij = ϕj (x)ϕi (x)dx
0
h
si i = j − 1

 6
2h
si i = j


= 3


h
6 si i = j + 1
sinon,

0
et donc la matrice M s'écrit :
 2h h 
3 6
 h 2h h 
 6 3 6 
 h 2h h 
6 3 6
M = .. .. .. .
 

 . . . 

 h 2h h 
6 3 6
h 2h
6 3

Avec ceci le problème (4) peut s'écrire de façon équivalente comme un sys-
tème d'équations diérentielles :

 Chercher u(t) ∈ RN tel que :


M u̇(t) + Au(t) = f(t) = 0, t ∈ (0, 1), (5)


u(0) = u0 ,

Avec la notation u̇(t) = u0 (t) et u(t) = (uj (t))N


j=1 , u0 = (u0j )j=1 les coor-
N

donnés de uh (t) et u0h dans la base {ϕj }j=1 . On appelle M la matrice de


N

masse, A la matrice de raideur et f = (f1 (t), f2 (t), · · · , fNh (t))T le vecteur


des termes connues.

3 La θ-méthode
Puisque la matrice M est inversible, nous pouvons récrire le système d'équa-
tions diérentielles ordinaires (5) sous la forme normale

u̇(t) = −M −1 Au(t).

4
Pour résoudre ce système nous pouvons utiliser la θ-méthode, qui introduit
une discrétisation de la dérivée temporelle par un rapport incrémental et
remplace les autres termes par une combinaison linéaire, dépendante du pa-
ramètre réel θ (0 ≤ θ ≤ 1) et des valeurs au temps tk , tk+1 :

uk+1 − uk h i
M + A θuk+1 + (1 − θ)uk = 0. (6)
∆t

Le paramètre ∆t = tk+1 − tk , k = 0, 1, · · · , dénote le pas de discrétisation


temporelle, et l'index k indique que la quantité considérée est évaluée au
temps tk .

Explicitation de la θ-méthode pour des valeurs de θ xés


Cas 1, θ=0 :

uk+1 − uk
M + Auk = 0 ⇔ uk+1 = (I − ∆tM −1 A)uk . (7)
∆t

Méthode explicite car M est diagonale et donc M −1 se calcule facilement.


On identie se schéma avec la méthode d'Euler Progressif (EP).
1
Cas 2, θ =
2 :

uk+1 − uk
 k+1
+ uk

u
M +A = 0
∆t 2
m
∆t −1 ∆t −1
(I + M A)uk+1 = (I − M A)uk . (8)
2 2

Méthode implicite car on ne peut pas obtenir explicitement uk+1 à partir de


uk vu que le calcul de uk+1 nécessite la résolution d'un système linéaire dont
la matrice n'est pas diagonale.
Nous identions dans ceci le schéma de Crank-Nicolson (CN).
Cas 3, θ = 1 :

uk+1 − uk
M + Auk+1 = 0 ⇔ (I + ∆tM −1 A)uk+1 = uk (9)
∆t

Méthode implicite, même motivation du cas précédent Nous identions dans


ceci le schéma d'Euler Rétrograde (ER).

5
Analyse de stabilité de la θ-méthode
Dans ce paragraphe nous allons rappeler des résultat de convergence qui ont
été démontrés au cours et qui sont expliqués en détail dans le polycopié au
chapitre (6.7).
Résultat 1 En appliquant la θ -méthode au problème de Galerkin dans le
cas f = 0 et θ = 1, nous avons montré que

lim kukh kL2 (Ω) = 0,


k→+∞

c'est-à-dire que la méthode d'Euler rétrograde est absolument stable sans


aucune hypothèse sur le pas ∆t.
Résultat 2 Rappelons que λ est une valeur propre de la forme bilinéaire
a(·, ·) : V × V 7→ R et que w ∈ V est la fonction propre correspondante si
a(w, v) = λ(w, v), ∀v ∈ V . Avec la théorie développée au cours, nous somme
arrivé à la conclusion que la stabilité absolue de la θ-méthode est garantie
si :
2
− − θ < θ − 1 < θ.
λi ∆t
La deuxième inégalité est toujours vraie, tandis que la première peut être
récrite comme :
2
2θ − 1 > − .
λi ∆t
Si θ > 1/2, le terme de gauche est positif ou nul, tandis que celui de droite
est toujours négatif donc l'inégalité est vraie pour tout ∆t. Si par contre
θ < 1/2, l'inégalité est satisfaite et, par conséquent la méthode est stable si
et seulement si :
2 2
∆t < ≤ .
(1 − 2θ)λi (1 − 2θ)λmax

Donc, en conclusion nous avons que (CR) et (ER) sont inconditionnellement


stable, tandis que (EP) est stable seulement pour ∆t < (1−2θ)λ
2
max
.

4 Code MATLAB pour résoudre le système


d'EDOs
1 function [v] = EDOsys(mu,theta,h,dt,u0)
% Definition de la largeur des subdivisions
n=1/h;
nt=1/dt

% Mu' + Au = f =0 : calcul de M et A
m=n-1;

6
% Calcul de la matrice A
10 A=diag(ones(m,1),0)*(2*mu/h)+diag(ones(m-1,1),1)*(-mu/h)
+diag(ones(m-1,1),-1)*(-mu/h);

% Calcul de la matrice M
M=diag(ones(m,1),0)*(2*h/3)+diag(ones(m-1,1),1)*(h/6)
+diag(ones(m-1,1),-1)*(h/6);

% Condition intiale lorsque t=0 pour tout x


for j=1:n-1
u(j,1)=feval(u0,j*h)-j*h;
20 end

% Theta-methode pour resoudre le systeme d'EDO


for i=1:nt
u(:,i+1)=((M+A*theta*dt)\(M-A*(1-theta)*dt))*u(:,i);
end

% Retour à notre solution avec l'ajout


% de la fonction de relevement
for i=1:n-1
30 u(i,:)=u(i,:)+i*h;
end

u_ini=zeros(1,nt+1);
u_fin=ones(1,nt+1);
v=vertcat(u_ini,u,u_fin);
x=linspace(0,1,n+1);
return

La fonction Edosys prend comme arguments :


 mu représente la constante dans la formulation forte du problème
 theta représente la valeur pour la θ-méthode
 h est la longueur de la subdivision spatiale
 dt est la longueur de la subdivision temporelle
 u0 est la condition initiale u(x, 0)
 t est la valeur associée à uh (x, t), on fait une section de la solution
pour obtenir la solution en espace avec un temps xé

5 Exécution du programme exemple 1


Nous allons utiliser le programme qu'on a écrit dans la partie précédente pour
déterminer les solutions numériques uh (x, 21 ) et uh (x, 1) pour le problème

7
de diusion non-stationnaire en prenant comme condition initiale et para-
mètres : µ = 61 , u0 (x) = 1 − cos(3π x2 ). Nous allons également faire varier le
paramètre θ en lui attribuant les valeurs 0, 12 et 1, ainsi que la longueur de la
subdivision temporelle. Par souci de commodité, nous allons représenter les
solutions en fonction de la méthode, c'est à dire pour les diérentes valeurs de
θ, nous avons respectivement la méthode d'Euler progressive, Crank-Nicolson
et Euler rétrograde. On donne le code pour une exécution du programme :
1 mu=1/6; u0=inline('1-cos(3*pi*x/2)'); h=1/10
theta=1; dt=h;
[u] = EDOsys(mu,theta,h,dt,u0)
x=linspace(0,1,n+1);
y=0.5/dt+1;
plot(x,u(:,y),'b');hold on;

5.0.1 Euler progressive

Fig. 1  Solution avec ∆t = h Fig. 2  Solution avec ∆t = h2

Fig. 3  Solution avec ∆t = h Fig. 4  Solution avec ∆t = h2


Fig. 5  Représentation graphique de uh (x, 12 ) et uh (x, 1) en variant ∆t

8
Pour ∆t = h, la solution présente de très fortes oscillations, tandis que pour
∆t = h2 , elle est régulière et stable. Rappelons que la méthode d'Euler
progressive est conditionnellement stable, et la condition est : ∆t ≤ λmax2
. Il
semble qu'ici dans un cas elle est dans le domaine de stabilité, et dans l'autre
en dehors. Pour ce faire, il faudrait calculer λmax
2
.

5.0.2 Euler rétrograde

Fig. 6  Solution avec ∆t = h Fig. 7  Solution avec ∆t = h2

Fig. 8  Solution avec ∆t = h Fig. 9  Solution avec ∆t = h2


Fig. 10  Représentation graphique de uh (x, 12 ) et uh (x, 1) en variant ∆t

On constate qu'en faisant varier ∆t, on ne change pas la stabilité des solu-
tions, ceci est du au fait que la méthode d'Euler rétrograde est incondition-
nellement stable, donc stable pour tout ∆t.

9
5.0.3 Crank-Nicolson

Fig. 11  Solution avec ∆t = h Fig. 12  Solution avec ∆t = h2

Fig. 13  Solution avec ∆t = h Fig. 14  Solution avec ∆t = h2


Fig. 15  Représentation graphique de uh (x, 21 ) et uh (x, 1) en variant ∆t

La méthode de Crank-Nicolson donne la plus petite valeur de θ pour laquelle


on a la stabilité inconditionnelle, donc le comportement est comme celui de
la méthode d'Euler rétrograde.

6 Exécution du programme exemple 2


On change cette fois-ci la condition initiale, en prenant :

si x < 0.2

 0
u0 (x) = 2 si x ≥ 0.2 si x ≤ 0.6
1 si x > 0.6

10
Le code de la fonction sur MATLAB donne :

1 function f = u1(x)
if(x<0.2)
f=0;
end
if( (x>=0.2) & (x<=0.6) )
f=2;
end
if( x > 0.6)
f=1;
10 end
return

6.0.4 Euler progressive

Voici un exemple de code pour l'application :

1 mu=1/6; u0=inline('u1(x)'); h=1/10


theta=0; dt=h;
[u] = EDOsys(mu,theta,h,dt,u0)
x=linspace(0,1,n+1);
y=0.5/dt+1;
plot(x,u(:,y),'b');hold on;

Fig. 16  Solution avec ∆t = h Fig. 17  Solution avec ∆t = h2

11
Fig. 18  Solution avec ∆t = h Fig. 19  Solution avec ∆t = h2
Fig. 20  Représentation graphique de uh (x, 21 ) et uh (x, 1) en variant ∆t

Comme précédemment, la stabilité conditionnelle est violée lorsque ∆t = h


et vériée pour ∆t = h2 .

6.0.5 Euler rétrograde

Fig. 21  Solution avec ∆t = h Fig. 22  Solution avec ∆t = h2

12
Fig. 23  Solution avec ∆t = h Fig. 24  Solution avec ∆t = h2
Fig. 25  Représentation graphique de uh (x, 12 ) et uh (x, 1) en variant ∆t

Comme avant, on a la stabilité inconditionnelle.

6.0.6 Crank-Nicolson

Fig. 26  Solution avec ∆t = h Fig. 27  Solution avec ∆t = h2

13
Fig. 28  Solution avec ∆t = h Fig. 29  Solution avec ∆t = h2
Fig. 30  Représentation graphique de uh (x, 21 ) et uh (x, 1) en variant ∆t

Nous constatons que lorsque ∆t = h, nous n'avons pas la stabilité. Ceci


s'explique par l'irrégularité de notre condition initiale en t = 0, on a donc
une propagation de cette irrégularité au cours du temps. Lorsque ∆t = h2 ,
on retrouve la stabilité. La méthode de Crank-Nicolson est moins stable
localement qu'Euler rétrograde.

7 Représentation graphique de la norme L2


de la solution numérique
1 mu=1/6; u0=inline('1-cos(3*pi*x/2)'); h=1/10;
theta=1; dt=h; N=1/dt;

[v] = EDOsys(mu,theta,h,dt,u0)

for i=1:N+1
plot(i-1,sqrt((1/6*(v(N+1,i)^2+4*v(N/2+1,i)^2+v(1,i)^2))),'-');
hold on;
end
10
theta=0;
[w] = EDOsys(mu,theta,h,dt,u0)

for i=1:N+1
plot(i-1,sqrt((1/6*(w(N+1,i)^2+4*w(N/2+1,i)^2+w(1,i)^2))),'b*');
hold on;
end

14
Fig. 31  Norme L2 pour Euler rétrograde et progressive

Dans le premier graphe, qui correspond à la méthode d'Euler rétrograde,


nous avons une décroissance de la norme L2 de la solution numérique, ce
qui est un résultat qu'on avait vu dans la théorie, où on bornait ||un+1h || par
une constante multipliée par ||unh ||, ce qui nous assurait la stabilité absolue.
Le deuxième graphe, qui correspond à la méthode d'Euler progressive, laisse
supposer l'instabilité de la méthode par la violation de la décroissance de la
norme L2 de la solution. On voit même que celle-ci croit pour les 3 derniers
termes. Ceci était attendu car pour ∆t = h, nous avons bien que la mé-
thode d'Euler progressive est instable, la condition de stabilité n'étant pas
respectée.

Partie 2
Soit Ω = (0, 1) nous considérons le problème de diusion-advection non-
stationnaire suivant :
2 u(x, t) + b∂ u(x, t) = 0, (x, t) ∈ Ω × (0, 1)


 ∂t u(x, t) − µ∂xx x
u(0, t) = u(1, t) = 0 t ∈ (0, 1) (bc1)

(10)

 u(0, t) = ∂x u(1, t) = 0 t ∈ (0, 1) (bc2)
u(x, 0) = u0 (x) x∈Ω

avec µ, b > 0 des constantes et u0 ∈ L2 (Ω) une fonction donnée ; où nous


pouvons choisir alternativement les conditions au bord (bc1) ou (bc2).

8 Formulation faible
Nous multiplions l'équation (10) par une fonction test v ∈ V et nous cal-
culons l'intégrale sur le domaine (0, 1). Nous dénissons deux espaces V

15
diérentes pour le deux conditions au bord :
V = H01 pour (bc1) et V = {v ∈ L2 (0, 1)|v(0) = 0} pour (bc2).
Z 1
2
(∂t u(x, t) − µ∂xx u(x, t) + b∂x u(x, t)vdx = 0
0

Nous intégrons par partie le deuxième terme ce qui nous donne :


Z 1 Z 1
[µv∂x u(x, t)]10 − µ ∂x u(x, t)∂x vdx = −µ ∂x u(x, t)∂x vdx
0 0

Il faut remarquer qu'on obtient le même résultat pour le deux type des
conditions au bord. Finalement nous obtenons :
Z 1 Z 1 Z 1
∂t u(x, t)vdx + µ ∂x u(x, t)∂x vdx + b ∂x u(x, t)vdx = |{z}
0
0 0 0
| {z } | {z } F (v)
(∂t u(x,t),v) a(u(t),v)

Donc la forme faible du problème (10) est :

Pour t ∈ (0, 1), chercher u(t) ∈ V , tel que



(11)
(∂t u(t), v) + a(u(t), v) = F (v) ∀v ∈ V,

avec u(0) = u0 ; où a(·, ·) est une forme bilinéaire et F est la fonctionnelle


linéaire dépendant de f et des conditions au bord.
La seul diérence entre le problème (1) et (10) et que dans le deuxième
laR forme bilinéaire possède un terme en plus, plus précisément le terme
1
b 0 ∂x u(x, t)vdx.

9 Système d'équations diérentielles


Nous introduisons maintenant l'approximation de Galerkin du problème (11) :

Pour t ∈ R+ , chercheruh (t) ∈ Vh , tel que



(12)
(∂t uh (t), vh ) + a(uh (t), vh ) = F (vh ) ∀vh ∈ Vh ,

avec uh (0) = u0,h , Vh ⊂ V est un sous-espace de dimension nie et u0,h est


une approximation appropriée de u0 dans Vh .
Nous dénissons la base {ϕi }Ni=1 de l'espace Vh avec :
 x−x
i−1
 xi −xi−1
 si xi−1 ≤ x ≤ xi
xi+1 −x
ϕi (x) = x −x si xi ≤ x ≤ xi+1
 i+1 i
sinon

0

Puisque pour tout t > 0 la solution uh du problème P


de Galerkin appartient
au sous-espace Vh nous pouvons exprimer uh (x, t) = nj=1 uj (t)ϕj (x), où les

16
coecients {uj (t)} sont les inconnues du problème (12).
En remplaçant uh (x, t) ainsi déni et en prenant vh = ϕj (t) dans (12) nous
obtenons pour i = 1, · · · , N :
XN Z 1 N
X Z 1
u̇j (t) ϕj (x)ϕi (x)dx + uj (t) [µϕ0j (x)ϕ0i (x) + bϕ0j (x)ϕi (x)]dx = 0
j=1 |0 {z } j=1 |0 {z }
mij aij

Nous voyons tout suite que la matrice M ne change pas par rapport à la
matrice M du problème (1), nous allons donc calculer la matrice de raideur
A qui est la seul chose qui change par rapport au première problème.
Z 1
aij = a(ϕj , ϕi ) = [µϕ0j (x)ϕ0i (x) + bϕ0j (x)ϕi (x)]dx
0
 µ b

 2µh 2
 + si i = j − 1
si i = j

= h
µ
− − b
si i=j+1
 h 2


0 sinon,
et donc la matrice A s'écrit :
 2µ −µ b 
h h + 2
 −µ − b 2µ −µ b
h + 2

 h 2
−µ
h
2µ −µ

b b
h − 2 +
 
h h 2
A= .. .. .. .
 
 . . . 
−µ −µ
 2µ

b b
h − h + 2
 
2 h
−µ b 2µ
h − 2 h
Enn avec ceci le problème (12) peut s'écrire de façon équivalente comme
un système d'équations diérentielles :
 Chercher u(t) ∈ RN tel que :

M u̇(t) + Au(t) = f(t) = 0, t ∈ (0, 1), (13)


u(0) = u0 ,

Avec la notation u̇(t) = u0 (t) et u(t) = (uj (t))N


j=1 , u0 j=1 les coor-
= (u0j )N
donnés de uh (t) et u0h dans la base {ϕj }j=1 .
N

10 Crank-Nicolson pour le système (13)


En utilisant la θ-méthode pour la résolution numérique du système (13),
nous trouvons en prenant θ = 21 la méthode de Crank-Nicolson qui s'écrit :
uk+1 − uk
 k+1
+ uk

u
M +A = 0
∆t 2
m
∆t ∆t
(M + A)uk+1 = (M − A)uk , (14)
2 2

17
en posant C = I + ∆t
2 M
−1 A et D = I − ∆t M −1 A, la méthode s'écrit alors :
2

uk+1 = C −1 Duk .

11 Code MATLAB pour résoudre (14)


1 function [v] = EDO_CrankNicol(mu,b,h,dt,u0,bc)
% Definition de la largeur des subdivisions
n=1/h;
nt=1/dt;
if(bc==1)
% si l'utilisateur choisi d'utiliser cb1 le programme faira:
% Mu' + Au = f =0 : calcul de M et A
m=n-1;

10 % Calcul de la matrice A
A=diag(ones(m,1),0)*(2*mu/h)+diag(ones(m-1,1),1)
*(-mu/h+b/2)+diag(ones(m-1,1),-1)*(-mu/h-b/2);

% Calcul de la matrice M
M=diag(ones(m,1),0)*(2*h/3)+diag(ones(m-1,1),1)
*(h/6)+diag(ones(m-1,1),-1)*(h/6);

% Condition intiale lorsque t=0 pour tout x


for j=1:n-1
20 xval=j*h;
u(j,1)=feval(u0,xval);
end

% Crank-Nicolson pour resoudre le systeme d'EDO


for i=1:nt
B=M+A.*dt/2;
C=(M-A.*dt/2)*u(:,i);
D=inv(B)*C;
u(:,i+1)=D;
30 end

% Condition initiale lorsque x=0, x=1


% qu'on raccorde à notre solution
u_ini=zeros(1,nt+1);
u_fin=zeros(1,nt+1);

18
% Solution avec les conditions initiales en espace
v=vertcat(u_ini,u,u_fin);

40 else
% si l'utilisateur choisi d'utiliser bc2 le programme faira:
% Mu' + Au = f =0 : calcul de M et A
m=n;

% Calcul de la matrice A
A=diag(ones(m,1),0)*(2*mu/h)+diag(ones(m-1,1),1)
*(-mu/h+b/2)+diag(ones(m-1,1),-1)*(-mu/h-b/2);

% Calcul de la matrice M
50 M=diag(ones(m,1),0)*(2*h/3)+diag(ones(m-1,1),1)
*(h/6)+diag(ones(m-1,1),-1)*(h/6);

% Condition intiale lorsque t=0 pour tout x


for j=1:n
xval=j*h;
u(j,1)=feval(u0,xval);
end

% Crank-Nicolson pour resoudre le systeme d'EDO


60 for i=1:nt+1
B=M+A.*dt/2;
C=(M-A.*dt/2)*u(:,i);
D=inv(B)*C;
u(:,i+1)=D;
end

% Condition initiale lorsque x=0, x=1 qu'on raccorde


% à notre solution
u_ini=zeros(1,nt+2);
70 % Solution avec les conditions initiales en espace
v=vertcat(u_ini,u);
end
return

Cette fonction prend les mêmes arguments de la fonction expliquée à la


section 4 ; il prend en plus le paramètre bc qui sert à indiquer au programme
s'il doit utiliser les conditions au bord du type 1 (bc1) ou les conditions au
bord du type 2 (bc2).

19
12 Application de la fonction précédent
Nous allons enn résoudre avec le programme de la section précédent un der-
nier système d'EDO's avec b = 0.5, u0 (x) = 1 − cos(2πx), h = 1/n = 1/100
et ∆t = h. Ensuite nous allons faire varier µ = 1/60, 1/600 et les conditions
au bord. Pour chaque cas possible nous allons représenter graphiquement les
diérentes solutions pour uh (x, 0.5) et uh (x, 1).

Voici un exemple d'application de notre méthode de résolution avec Crank-


Nicolson.

1 mu=1/60; u0=inline('1-cos(3*pi*x/2)'); h=1/100;


b=0.5; n=1/h; dt=h;

[u] = EDO_CrankNicol(mu,b,h,dt,u0,0)
x=linspace(0,1,n+1);
y=0.5/dt+1;
plot(x,u(:,y),'b');hold on;

Résultat pour µ = 1
60

Fig. 32  Solution t = 0.5 xé Fig. 33  Solution t = 1 xé

Les deux graphes, représentant la solution uh pour les deux types de condi-
tions aux bords, sont stables et ont la même allure (ils se chevauchent même
jusqu'à x = 0.9). Calculons le nombre de Péclet pour justier sa stabilité :

1 1
bh
Pe = = 2 100
1 = 0.3,
2µ 2 60

il est plus petit que 1, d'ou la stabilité.

20
Résultat pour µ = 1
600

Fig. 34  Solution t = 0.5 xé Fig. 35  Solution t = 1 xé

On constate qu'il y a présence d'une couche limite en 1, et des oscillations


pour les 2 conditions au bord, ce qui peut être expliqué par le choix de notre
paramètre µ, qui va violer la condition de stabilité. Calculons le nombre de
Péclet pour justier sa stabilité :
1 1
bh
Pe = = 2 100
1 = 1.5,
2µ 2 600

il est plus grand que 1, d'ou l'instabilité.

Références
Cours élément ni hiver 2007, donné par Alo Quarteroni.
adresse web : http ://iacs.ep.ch/cmcs/Teaching/FEM.php3

21

Vous aimerez peut-être aussi