Vous êtes sur la page 1sur 12

P.-Y.

Lagre, Rsolution Numrique de lEquation de la Chaleur e e e

Rsolution Numrique de e e lEquation de la chaleur


Nous avons dj` fait une introduction aux mthodes numriques pour ea e e rsoudre lquation de la chaleur dans le cas des syst`mes minces: e e e cp V T (t) = hS(T (t) Tair ), t T (0) = T0 .

o` T (t) tait la temprature suppose uniforme dans le corps considr. On u e e e ee va ici calculer un cas o` la temprature varie dans le corps. On va avoir la u e temprature fonction de lespace et du temps: T (x, t). e Pour rsoudre, on avait crit la drive sous forme discr`te de mani`re ` e e e e e e a n+1 en fonction de calculer la nouvelle temprature au temps t + t note T e e la temprature T n au temps prcdent t : e e e T n+1 T n hS = (T n Tair ), t cp V pas de temps apr`s pas de temps en partant de T 0 = T0 on peut calculer la e temprature ` tous les temps. Nous allons voir dans ce chapitre comment e a discrtiser les drives en x. e e e

1
1.1

Le probl`me e
Echelon de temprature e

Nous examinons un cas simple: la lamelle 1D soumise ` un choc thermique a (sans source de chaleur volumique). Nous rappelons les quations ` rsoudre: e a e quation de la chaleur dans un milieu immobile isotrope homog`ne, e e avec des coecients thermodynamiques constants, lquation est crite sans e e dimensions: T 2T = t x2 conditions aux limites en x = 1 et x = 1 on se donne T (1, t) = 0 et au temps t = 0, on se donne T (x, 0) = 1 temprature paritale impose. e e e

-7.1-

P.-Y. Lagre, Rsolution Numrique de lEquation de la Chaleur e e e

Figure 1: une lamelle innie de temprature uniforme au temps initial. e

1.2

Probl`me discret e

On se place aux points xi appels points du maillage. e xi = 1 + 2 i/n lindice i varie de 0 ` n (par exemple 100, soit 101 points et 100 segments). a On appelle x = 2/n le pas de discrtisation spatiale. On cherche la valeur e T (xi , tk ) la temprature en ces points aux temps tk discrets eux aussi. On e a pour le temps: tk+1 = tk + t le pas de temps de discrtisation est t. e Dans chaque tranche i, la variation dnergie par rapport au temps T /t e est par dnition des accroissements e T (x, t) T (xi , t + t) T (xi , t) t t la densit de ux venant de i 1 vers i est de mme: e e T (xi , t) T (xi , t) T (xi1 ) x x la densit de ux allant de i vers i + 1 est de mme: e e T (xi+1 , t) T (xi+1 , t) T (xi ) x x la drive de la densit de ux est donc bien: e e e T (xi+1 , t) T (xi , t) ) ( ) /x x x -7.2-

P.-Y. Lagre, Rsolution Numrique de lEquation de la Chaleur e e e

ce qui donne la forme approche discrtise de la drive seconde de la e e e e e temprature e T (xi+1 , t) 2T (xi , t) + T (xi1 , t) x On en dduit donc la forme discr`te de lquation de la chaleur, e e e T (xi , t + t) T (xi+1 , t) 2T (xi , t) + T (xi1 , t) = t x ou, puisque lon veut faire une itration en temps et trouver la nouvelle e distribution de chaleur au temps t+t connaissant la temprature au temps e t aux points xi . T (xi , t + t) = T (xi , t) + t T (xi+1 , t) 2T (xi , t) + T (xi1 , t) . x

1.3

Mise en oeuvre

A laide dun diteur de texte, on tape les lignes suivantes de lentte C: e e #include #include #include #include <stdio.h> <stdlib.h> <math.h> <string.h>

puis, on programme tel quel, dans un premier temps, les param`tres e sont cods en dur. La dimension des tableaux est xe ` 100, on dnit e e a e le tableau des tempratures T et des nouvelles tempratures Tn. On dnit e e e un chier de sortie. int main ( ) { int Nmax=100; int i,it; double x[Nmax+1]; // dimension des tableaux double T[Nmax+1]; double Tn[Nmax+1]; double L=1; double dx=2*L/Nmax,dt=0.00001,t=0; // parametres FILE *f; On dit bonjour, et on initialise les points du maillage: les xi qui sont les valeurs du tableau x[i].

-7.3-

P.-Y. Lagre, Rsolution Numrique de lEquation de la Chaleur e e e

printf(" Resolution de lequation de la Chaleur MECAVENIR fev 08\n"); for (i=0; i<=Nmax; i++) { /*RAZ */ x[i] = -L + i*2*L/Nmax; T[i]=1; Tn[i]=1; } on peut maintenant avancer en temps avec la boucle sur puis, ` chaque a temps, rsoudre en espace suivant la formule dmontre. On veille ` bien e e e a mettre les conditions aux limites ` 0. a // Calcul, avancee en temps for(it=0;it<100000;it++) { t=t+dt; // le temps augmente T[0]=0; // on force les conditions aux limites T[Nmax]=0; Tn[0]=0; Tn[Nmax]=0; for (i=1; i<Nmax; i++) { Tn[i]=T[i]+(dt/dx/dx)*(T[i+1]-2*T[i]+T[i-1]);} // equation chaleur dicretisee On swape les tableaux, T devient Tn for (i=0; i<=Nmax; i++) {T[i]=Tn[i];} //echange le nouveau devient lancien On ache le temps, on sauve dans un chier (syntaxe spciale fprintf, et le e FILE *f au dbut et attention au %lf du format long oat) et on attend e que lon fasse retour chariot getchar() pour passer au temps suivant. On ferme les derni`res accolades. e printf("t=%lf\n",t); // sauvegarde dans un fichier pour tracer avec gnuplot f= fopen("resultat.dat","w"); for (i=0; i<=Nmax;i++) { fprintf(f,"%lf %lf \n",x[i], T[i]); } fclose(f); getchar(); -7.4-

P.-Y. Lagre, Rsolution Numrique de lEquation de la Chaleur e e e

} return 1; } Le programme est prt, on ouvre deux fentres de terminal, dans une il e e sut de compiler: gcc chaleur.c -o chaleur, cela cre lexcutable. On e e le lance. Chaque fois que lon appuie sur enter, le temps augmente. Dans le deuxi`me terminal que lon a lanc, on lance gnuplot. On peut tracer au e e fur et ` mesure lvolution de la temprature. a e e

Figure 2: Les dirents terminaux. e

1.4

Stabilit e

On remarquera que ce programme est assez lent, on peut faire des sorties uniquement tous les 100 pas de temps. On pourrait penser augmenter le pas de temps pour aller plus vite. Mais, si on augmente trop le pas de temps, le calcul explose. Vrier que e 2 /2 est la limite suprieure ` ne pas franchir. Au del`, le prot = x e a a gramme devient instable, il explose. Le schma que lon a crit est explicite, pour pouvoir rsoudre avec un e e e pas de temps plus grand, il faudrait faire un schma dit implicite. Cela e complique un peu la rsolution. e -7.5-

P.-Y. Lagre, Rsolution Numrique de lEquation de la Chaleur e e e

Rsolution numrique sur le Web e e

On peut rsoudre en direct par un calcul en dirences nies lquation de e e e la chaleur. Il sagit dun programme plus complet que celui prsent ici en e e C, il est en Java. On change ` la vole les conditions aux limites, le lien est a e
http://www.lmm.jussieu.fr/ lagree/ SOURCES/Appliquette-JavaChal/guiChalomega v implicite/index.html

Figure 3: chaleur.

Rsolution en direct par dirences nies de lquation de la e e e

-7.6-

P.-Y. Lagre, Rsolution Numrique de lEquation de la Chaleur e e e

Bibliographie

I. Danaila , F. Hecht , O. Pironneau (2003) Simulation numrique en C++ Cours et exercices corrigs, Dunod . e e W. H. Press, S. A. Teukolsky, W.T. Vetterling, B. P. Flannery () Numerical Recipes in C/C++: The Art of Scientic Computing D. Euvrard (1994) Rsolution numrique des quations aux drives partielles de la physique, e e e e e de la mcanique et des sciences de lingnieur : Dirences nies, lments e e e ee nis, probl`mes en domaines non borns Masson e e

Consulter aussi http://www.lmm.jussieu.fr/lagree/COURS/MECAVENIR le cours complet de thermique de P.-Y. Lagre. e

-7.7-

P.-Y. Lagre, Rsolution Numrique de lEquation de la Chaleur e e e

Annexe 1
On remet le programme en entier

#include #include #include #include

<stdio.h> <stdlib.h> <math.h> <string.h>

// gcc chaleur.c -o chaleur // cree lexecutable "chaleur"

int main ( ) { int Nmax=100; int i,it; double x[Nmax+1]; // dimension des tableaux double T[Nmax+1]; double Tn[Nmax+1]; double L=1; double dx=2*L/Nmax,dt=0.00001,t=0; // parametres FILE *f; printf(" Resolution de lequation de la Chaleur MECAVENIR fev 08\n"); for (i=0; i<=Nmax; i++) /*RAZ */ x[i] = -L + i*2*L/Nmax; T[i]=1; Tn[i]=1; //printf(" x[%d]=%lf T=%lf \n",i,x[i],T[i]);

// Calcul, avancee en temps for(it=0;it<100000;it++) { t=t+dt; // le temps augmente T[0]=0; // on force les conditions aux limites -7.8-

P.-Y. Lagre, Rsolution Numrique de lEquation de la Chaleur e e e

T[Nmax]=0; Tn[0]=0; Tn[Nmax]=0; for (i=1; i<Nmax; i++) { Tn[i]=T[i]+(dt/dx/dx)*(T[i+1]-2*T[i]+T[i-1]);} // equation chaleur dicretisee for (i=0; i<=Nmax; i++) {T[i]=Tn[i];} //echange le nouveau devient lancien printf("t=%lf\n",t); // sauvegarde dans un fichier pour tracer avec gnuplot f= fopen("resultat.dat","w"); for (i=0; i<=Nmax;i++) { fprintf(f,"%lf %lf \n",x[i], T[i]); } fclose(f); getchar(); } return 1; }

-7.9-

P.-Y. Lagre, Rsolution Numrique de lEquation de la Chaleur e e e

Annexe 2
On remet le programme en entier en mettant la lecture dun chier de donnes, et linterfaage avec gnuplot et des pointeurs autorisant un die c mensionnement dynamique des tableaux.

#include <stdio.h> #include <stdlib.h> #include <math.h> #include <string.h> // PYL 02/08 // gcc chaleur2.c -o chaleur2 // cree lexecutable "chaleur2" //#define GNUPLOT_PATH "/usr/local/bin/gnuplot" #define GNUPLOT_PATH "gnuplot"

int main ( ) { int Nmax=100; int i,it=0; double *x,*T,*Tn; //pointeurs double L=1,tmax=1; double dx=2*L/Nmax,dt=0.00001,t=0; // parametres FILE *gp; // pour gnuplot FILE *f;

printf(" Resolution de lequation de la Chaleur MECAVENIR fev 08\n"); f =fopen("D.IN","r"); fscanf(f,"dt=%lf \n",&dt); fscanf(f,"tmax=%lf \n",&tmax); fscanf(f,"Nmax=%d \n",&Nmax); fclose(f); printf("dt=%lf tmax=%lf Nmax=%d \n",dt,tmax,Nmax); printf("\n"); //getchar(); dx=2*L/Nmax;

-7.10-

P.-Y. Lagre, Rsolution Numrique de lEquation de la Chaleur e e e

x = T = Tn= //

(double*)calloc(Nmax+1,sizeof(double)); (double*)calloc(Nmax+1,sizeof(double)); (double*)calloc(Nmax+1,sizeof(double)); dimension dynamique des tableaux

for (i=0; i<=Nmax; i++) /*RAZ */ x[i] = -L + i*dx; T[i]=1; Tn[i]=1;

// ouverture dun tuyau pour gnuplot!!! gp = popen(GNUPLOT_PATH, "w"); if(gp == NULL){ fprintf(stderr, "Aye pas de %s.", GNUPLOT_PATH); exit(EXIT_FAILURE); }else{ fprintf(gp, "set xlabel \"x\";set ylabel \"T(x,t)\";set

title \"chaleur PYL\" \n");

// Calcul, avancee en temps while(t<tmax) { it++; t=t+dt; // le temps augmente T[0]=0; // on force les conditions aux limites T[Nmax]=0; Tn[0]=0; Tn[Nmax]=0; for (i=1; i<Nmax; i++) { Tn[i]=T[i]+(dt/dx/dx)*(T[i+1]-2*T[i]+T[i-1]);} // equation chaleur dicretisee for (i=0; i<=Nmax; i++) {T[i]=Tn[i];} //echange le nouveau devient lancien

// sauvegarde dans un fichier pour tracer avec gnuplot int dtt= .01/dt; -7.11-

P.-Y. Lagre, Rsolution Numrique de lEquation de la Chaleur e e e

if(it%dtt==0){ printf("t=%lf \r",t); f= fopen("resultat.dat","w"); for (i=0; i<=Nmax;i++) { fprintf(f,"%lf %lf \n",x[i], T[i]); } fclose(f); fprintf(gp,"p [][0:1]resultat.dat fflush(gp);} } return 1; } } dans le chier D.IN, il y a dt=0.000001 tmax=5 nx=520 u 1:2 not w l \n");

-7.12- version March 11, 2010