M2R ASEP 2014-2015 / UE 33 - TP1 M´ethodes num´eriques
Boris Dintrans (IRAP/CNRS, boris.din[email protected])
Ce TP1 se fera sous Python et un petit m´emento Python est disponible `a la fin de cet
´enonc´e (section 3). Vous aurez besoin d’un ´editeur de texte et pourrez par exemple utiliser
gedit.Le compte-rendu de ce TP est not´e et sera rendu `a la fin de la s´eance. Pour commencer
le TP :
1. Ouvrir un navigateur Firefox et r´ecup´erer les scripts Python `a partir de la page web
(section Enseignement) :
http://www.ast.obs-mip.fr/dintrans
2. Lancer un ´editeur de texte pour ouvrir chaque fichier :
gedit &
1 Equation de la chaleur
On se propose de r´esoudre num´eriquement l’´equation de la chaleur `a 1-D sur un domaine
x= [0, L] :
T
t =χ2T
x2,
T(0, t) = T(L, t)=0,
T(x, 0) = sin πx
L,
(1)
o`u Test la temp´erature et χla diffusion radiative. La solution exacte de ce syst`eme est donn´ee
au temps tpar :
T(x, t) = sin πx
Lexp χπ2t
L2.(2)
1.1 Un scema explicite
a) Compl´eter les “ ?” dans le script python chaleur explicite.py qui calcule num´eriquement
la solution du syst`eme (1) `a l’aide d’un sch´ema FTCS explicite centr´e d’ordre 2 de CFL
variable avec :
CFL = χt
(∆x)2,(3)
appel´ee condition de Courant-Friedrichs-Lewy (cf. cours). Pour d´emarrer l’´etude de la stabilit´e
du sch´ema 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´eration en temps (ou toutes les pit´erations, avec e.g. p= 500), on
visualisera la solution obtenue et on la comparera au temps final `a la solution th´eorique.
Conseils de programmation : Python est optimis´e pour effectuer rapidement des op´erations sur
les matrices et vecteurs. Il est donc fortement conseill´e d’effectuer vos op´erations directement
1
sur des vecteurs et non sur les ´el´ements de ces vecteurs. Ainsi, il est beaucoup plus rapide (et
clair) d’effectuer
v+w,
pour additionner les deux vecteurs vet w, que d’effectuer une boucle explicite
for i in range(len(v)):
u[i]=v[i]+w[i]
De mˆeme, il vaut mieux effectuer l’op´eration
u[2:10]=v[1:9]
que
for i in range(1,10):
u[i+1]=v[i]
pour d´ecaler un vecteur sur la droite. En particulier, pour le travail demand´e dans ce TP, seule
la boucle sur la variable en temps sera n´ecessaire et on utilisera la fonction Python roll()
pour d´ecaler les vecteurs de +1 ou 1 sur les points de grille xi.
b) V´erifier num´eriquement que la condition CFL :
CFL = χt
(∆x)21
2,(4)
est n´ecessaire et suffisante pour assurer la stabilit´e du scema.
1.2 Un scema implicite
Le sch´ema explicite pr´ec´edent a le d´esavantage de n´ecessiter l’usage de pas de temps d’au-
tant plus petits que la discr´etisation en espace est fine. Afin de s’affranchir de cette contrainte,
une solution consiste `a utiliser un sch´ema implicite centr´e.
Reprendre toutes les questions pr´ec´edentes avec un sch´ema implicite centr´e du type Crank-
Nicolson (fichier Python chaleur implicite.py `a compl´eter). V´erifier en particulier la sta-
bilit´e du sch´ema mˆeme lorsque la condition CFL du sch´ema explicite n’est pas v´erifi´ee.
Conseils de programmation : les remarques pr´ec´edentes sont toujours valables. De plus, la
matrice du syst`eme implicite est tridiagonale. Cette particularit´e doit absolument ˆetre ex-
ploit´ee car elle permet d’´economiser de mani`ere drastique les besoins en temps de calcul et
en m´emoire. Pour la construction de la matrice, utilisez la fonction ones() et la r´esolution
du syst`eme lin´eaire se fera avec le solveur tridag() pour des conditions de bord fix´ees (i.e.
u= 0 sur les bords). Ce solveur est d´ej`a cod´e dans le script Python tridag.py.
2 Equation d’advection
On se propose de r´esoudre num´eriquement l’´equation d’advection toujours `a 1-D et avec
des conditions p´eriodiques aux bords :
u
t +Vu
x = 0,
u(0, t) = u(L, t),
u(x, 0) = cos(2π
Lx).
(5)
2
On choisira de travailler sur le mˆeme domaine que pr´ec´edemment, soit L= 1 et N= 100
points de grille.
a) Quelle est la solution exacte de ce probl`eme avec advection ?
2.1 Trois scemas explicites (fichier advection explicite.py)
a) Impl´ementer le scema FTCS explicite centr´e pour l’´equation d’advection. V´erifier qu’il
est inconditionnellement instable quelque soit la valeur de la CFL = V×t/x.
b) Impl´ementer les scemas explicites du type Lax-Friedrichs et upwind. Etudiez leur stabilit´e
et convergence. Lequel de ces deux sch´emas est le plus diffusif ?
2.2 Un scema implicite (fichier advection implicite.py)
a) Impl´ementer un scema implicite centr´e du type Crank-Nicolson. Cette fois-ci, la matrice
n’est pas strictement tridiagonale mais cyclique du fait des conditions aux limites p´eriodiques.
On r´esoudra alors le syst`eme lin´eaire en utilisant la subroutine cyclic() qui est d´ej`a cod´ee
dans le script Python tridag.py. V´erifiez que l’on s’affranchit une fois de plus (mais pas
totalement...) de la contrainte CFL des scemas explicites.
3 M´emento Python
Python peut ˆetre utilis´e soit int´eractivement en tapant les commandes en ligne (en se met-
tant dans un shell ipython), soit en lan¸cant 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´ecute le script toto.py
run toto.py : ex´ecute le script toto.py quand on est dans un shell ipython
n%5: calcule nmodulo 5
for i in range(0,10): : d´eclaration d’une boucle sur i de 0 `a 9 (10 it´erations)
int() : retourne la partie enti`ere
exit() : pour quitter Python quand on est dans un shell ipython
3.2 Op´erations sur les vecteurs et matrices
linspace(x1,x2,n) : cr´eation d’un vecteur colonne aux valeurs ´equir´eparties
:: op´erateur 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´eation d’un tableau de r´eels de taille n
u=zeros like(v) : u est d´efini comme le tableau v
ones(n,val) : cr´eation d’un vecteur de taille nayant partout la valeur val
roll(u,-1) : d´ecale le vecteur ud’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´eation d’une matrice diagonale
Exemple : diag([1,2,3],0) cr´ee une matrice d’ordre 3 avec 1,2,3 sur la diagonale principale
tridag(A,B,C,RHS) : solution du syst`eme lin´eaire tridiagonal o`u Aest la diagonale inf´erieure,
Bla diagonale principale,Cla diagonale sup´erieure et
RHS le membre de droite (un vecteur)
cyclic(A,B,C,alpha,beta,RHS) : solution du syst`eme lin´eaire M~
X=
RHS o`u la matrice
Mest 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´esultat `a l’´ecran
4
1 / 4 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !