1 Equation de la chaleur

publicité
M2R ASEP 2014-2015 / UE 33 - TP1 Méthodes numériques
Boris Dintrans (IRAP/CNRS, [email protected])
Ce TP1 se fera sous Python et un petit mémento Python est disponible à la fin de cet
énoncé (section 3). Vous aurez besoin d’un éditeur de texte et pourrez par exemple utiliser
gedit. Le compte-rendu de ce TP est noté et sera rendu à la fin de la séance. Pour commencer
le TP :
1. Ouvrir un navigateur Firefox et récupérer les scripts Python à partir de la page web
(section Enseignement) :
http://www.ast.obs-mip.fr/dintrans
2. Lancer un éditeur de texte pour ouvrir chaque fichier :
gedit &
1
Equation de la chaleur
On se propose de résoudre numériquement l’équation de la chaleur à 1-D sur un domaine
x = [0, L] :

∂ 2T
∂T


=
χ
,

2

∂t
∂x



(1)
T (0, t) = T (L, t) = 0,






 T (x, 0) = sin πx ,
L
où T est la température et χ la diffusion radiative. La solution exacte de ce système est donnée
au temps t par :
πx χπ 2 t
exp − 2 .
T (x, t) = sin
(2)
L
L
1.1
Un schéma explicite
a) Compléter les “ ?” dans le script python chaleur explicite.py qui calcule numériquement
la solution du système (1) à l’aide d’un schéma FTCS explicite centré d’ordre 2 de CFL
variable avec :
CFL =
χ∆t
,
(∆x)2
(3)
appelée condition de Courant-Friedrichs-Lewy (cf. cours). Pour démarrer l’étude de la stabilité
du schéma FTCS, on prendra une valeur de CFL conservative , soit CFL = 0.25.
On prendra L = 1, N = 100 points de grille, une diffusion radiative χ = 1 et un temps final
tend = 0.1. A chaque itération en temps (ou toutes les p itérations, avec e.g. p = 500), on
visualisera la solution obtenue et on la comparera au temps final à la solution théorique.
Conseils de programmation : Python est optimisé pour effectuer rapidement des opérations sur
les matrices et vecteurs. Il est donc fortement conseillé d’effectuer vos opérations directement
1
sur des vecteurs et non sur les éléments de ces vecteurs. Ainsi, il est beaucoup plus rapide (et
clair) d’effectuer
v+w,
pour additionner les deux vecteurs v et w, que d’effectuer une boucle explicite
for i in range(len(v)):
u[i]=v[i]+w[i]
De même, il vaut mieux effectuer l’opération
u[2:10]=v[1:9]
que
for i in range(1,10):
u[i+1]=v[i]
pour décaler un vecteur sur la droite. En particulier, pour le travail demandé dans ce TP, seule
la boucle sur la variable en temps sera nécessaire et on utilisera la fonction Python roll()
pour décaler les vecteurs de +1 ou −1 sur les points de grille xi .
b) Vérifier numériquement que la condition CFL :
CFL =
1
χ∆t
≤ ,
2
(∆x)
2
(4)
est nécessaire et suffisante pour assurer la stabilité du schéma.
1.2
Un schéma implicite
Le schéma explicite précédent a le désavantage de nécessiter l’usage de pas de temps d’autant plus petits que la discrétisation en espace est fine. Afin de s’affranchir de cette contrainte,
une solution consiste à utiliser un schéma implicite centré.
Reprendre toutes les questions précédentes avec un schéma implicite centré du type CrankNicolson (fichier Python chaleur implicite.py à compléter). Vérifier en particulier la stabilité du schéma même lorsque la condition CFL du schéma explicite n’est pas vérifiée.
Conseils de programmation : les remarques précédentes sont toujours valables. De plus, la
matrice du système implicite est tridiagonale. Cette particularité doit absolument être exploitée car elle permet d’économiser de manière drastique les besoins en temps de calcul et
en mémoire. Pour la construction de la matrice, utilisez la fonction ones() et la résolution
du système linéaire se fera avec le solveur tridag() pour des conditions de bord fixées (i.e.
u = 0 sur les bords). Ce solveur est déjà codé dans le script Python tridag.py.
2
Equation d’advection
On se propose de résoudre numériquement l’équation d’advection toujours à 1-D et avec
des conditions périodiques aux bords :

∂u
∂u


+V
= 0,



∂t
∂x



(5)
u(0, t) = u(L, t),






2π

 u(x, 0) = cos( x).
L
2
On choisira de travailler sur le même domaine que précédemment, soit L = 1 et N = 100
points de grille.
a) Quelle est la solution exacte de ce problème avec advection ?
2.1
Trois schémas explicites (fichier advection explicite.py)
a) Implémenter le schéma FTCS explicite centré pour l’équation d’advection. Vérifier qu’il
est inconditionnellement instable quelque soit la valeur de la CFL = V × ∆t/∆x.
b) Implémenter les schémas explicites du type Lax-Friedrichs et upwind. Etudiez leur stabilité
et convergence. Lequel de ces deux schémas est le plus diffusif ?
2.2
Un schéma implicite (fichier advection implicite.py)
a) Implémenter un schéma implicite centré du type Crank-Nicolson. Cette fois-ci, la matrice
n’est pas strictement tridiagonale mais cyclique du fait des conditions aux limites périodiques.
On résoudra alors le système linéaire en utilisant la subroutine cyclic() qui est déjà codée
dans le script Python tridag.py. Vérifiez que l’on s’affranchit une fois de plus (mais pas
totalement...) de la contrainte CFL des schémas explicites.
3
Mémento Python
Python peut être utilisé soit intéractivement en tapant les commandes en ligne (en se mettant dans un shell ipython), soit en lançant directement le code via python ./code.py. Pour
connaı̂tre la fonction d’une commande Python, se mettre sous ipython et taper nom commande?.
Par exemple, pour avoir de l’aide sur la fonction max :
max?
3.1
Commandes diverses
python toto.py : exécute le script toto.py
run toto.py : exécute le script toto.py quand on est dans un shell ipython
n % 5 : calcule n modulo 5
for i in range(0,10): : déclaration d’une boucle sur i de 0 à 9 (10 itérations)
int() : retourne la partie entière
exit() : pour quitter Python quand on est dans un shell ipython
3.2
Opérations sur les vecteurs et matrices
linspace(x1,x2,n) : création d’un vecteur colonne aux valeurs équiréparties
: : opérateur d’extraction de sous-matrice ou sous-vecteur
Exemple : u[1:10]=v[5:15] copie le vecteur (v5 , · · · , v15 ) dans le vecteur (u1 , · · · , u10 )
u=zeros(n,float) : création d’un tableau de réels de taille n
u=zeros like(v) : u est défini comme le tableau v
ones(n,val) : création d’un vecteur de taille n ayant partout la valeur val
roll(u,-1) : décale le vecteur u d’un indice vers la gauche. Exemple : si u = [0, 1, 2], alors
3
roll(u, −1) = [1, 2, 0]
diag([], 0 ou +1 ou -1) : création d’une matrice diagonale
Exemple : diag([1, 2, 3], 0) crée une matrice d’ordre 3 avec 1,2,3 sur la diagonale principale
tridag(A,B,C,RHS) : solution du système linéaire tridiagonal où A est la diagonale inférieure,
−−−→
B la diagonale principale, C la diagonale supérieure et RHS le membre de droite (un vecteur)
−−→
~ =−
cyclic(A,B,C,alpha,beta,RHS) : solution du système linéaire MX
RHS où la matrice
M est tridiagonale cyclique (coefficients α et β dans les coins)
3.3
Commandes graphiques
plot(x,f) : trace la courbe f (x)
plot(x,g) : trace la courbe g(x) en surimpression
show() : affiche le résultat à l’écran
4
Téléchargement