Résolution de l'equation de chaleur

Résolu/Fermé
mirinda - 27 avril 2008 à 02:33
 dhekra88 - 19 déc. 2012 à 11:39
Bonjour,je suis un nouveau membre ,j'espère que vous m'accepterez parmi vous .j'ai un projet en analyse numérique qui porte sur la résolution de l'equation de chaleur et sa programmation en scilab en utilisant la méthode de différence finie pour l'eqution en dimension 1 puis 2 ,mais malheureusement je n'ai pas compris cette méthode, c'est pour cela que je demande votre aide pour résoudre cette equation en traitant tous les cas particuliers et générals ,j'attend vos réponce ,merci d'avance.

53 réponses

Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
3 juin 2008 à 15:06
Salut
J'ai regardé ton code, il y a une erreur pour ta matrice B, il faut que tu lui ajoutes la matrice identité.
Après il faut que t'adaptes la taille des matrices et le vecteur u que tu cherches en fonction des ddl.

*Pour une condition de type périodique, il y a 2*nx degrés de liberté, ton vecteur u est donc de taille 2*nx, la valeur à l'une des extrémités est fixée par la valeur à l'autre extrémité. Tes matrices A et B sont de taille 2*nx x 2*nx.

*Pour une condition de type Dirichlet ou de type Neumann, il y a 2*nx-1 degrés de liberté, ton vecteur u est donc de taille 2*nx-1, les valeurs aux extrémités sont fixées par la condition considérée. Tes matrices A et B sont de taille 2*nx-1 x 2*nx-1.

Relis le message 19, c'est dans le même genre en fait.
A plus
0
mirinda Messages postés 51 Date d'inscription dimanche 27 avril 2008 Statut Membre Dernière intervention 4 mai 2009 38
4 juin 2008 à 13:01
salut Sacabouffe
je n'ai pas bien compris, j'ai du mal avec la taile des matrices, taille de vecteur u... Est ce que tu peux m'expliquer ça avec des lignes d'instructions? j'ai ajouté la matrice identité mais le programme n'a pas changé, je reçoit toujours l'erreur suivant :
error u=W*u inconsistent multiplication.

D=inv(A);
W=D*B;
u=W*u;
plotframe([-lg,-0.8,lg,1.6],tics);
plot2d(x,u,[1,1],"100","schema implicite 8")
plot2d(x,u0,[2,2],"100","donnee initiale ")
xtitle('schema implicite 8, cfl=2.',' ',' ');
end
autre question comment je peux vérifier que le schéma obtenue est correct dans ce cas du schéma de Crank-Nicolson?
merci d'avance .
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
5 juin 2008 à 02:24
Salut
Il restait une erreur dans la matrice A en fait, j'avais pas vu...
inconsitent multiplication : c'est normal, il faut que u soit un vecteur colonne pour le multiplier par W.

Condition de Dirichlet:
u=u0.';
mat = 2*dt/(dx*dx)*eye(2*nx-1,2*nx-1)...
    - dt/(dx*dx)*diag(ones(2nx-2,1),1) ...
    - dt/(dx*dx)*diag(ones(2*nx-2,1),-1);
mat = inv(eye(2*nx-1,2*nx-1)+theta*mat)*(eye(2*nx-1,2*nx-1)-(1-theta)*mat);
for n=1:nt
u(2:2*nx) = mat*u(2:2*nx);
u(1)=0;
u(2*nx+1)=0;
etc, etc, etc...
end


Condition de périodicité:
u=u0.';
mat = 2*dt/(dx*dx)*eye(2*nx,2*nx)...
    - dt/(dx*dx)*diag(ones(2nx-1,1),1) ...
    - dt/(dx*dx)*diag(ones(2*nx-1,1),-1);
mat(1,2*nx) = - dt/(dx*dx);
mat(2*nx,1) = - dt/(dx*dx);
mat = inv(eye(2*nx,2*nx)+theta*mat)*(eye(2*nx,2*nx)-(1-theta)*mat);
for n=1:nt
u(1:2*nx) = mat*u(1:2*nx);
u(2*nx+1)=u(1);
etc,etc,etc...
end


Qu'est-ce que tu veux dire par vérifier qu'il est correct? Tu peux commencer par vérifier que les résultats obtenus concordent avec ceux des autres schémas.
A plus
0
mirinda Messages postés 51 Date d'inscription dimanche 27 avril 2008 Statut Membre Dernière intervention 4 mai 2009 38
6 juin 2008 à 16:07
salut Sacabouffe
merci beaucoup ,je n'ai pas encore testé ça car je suis occupé par les examens mais comme meme j'ai compris .je veux savoir est ce que c'est obligatoire de traiter les conditions de périodicité car mon problème est donnée seulement avec des conditions de Dirichlet. merci
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mirinda Messages postés 51 Date d'inscription dimanche 27 avril 2008 Statut Membre Dernière intervention 4 mai 2009 38
8 juin 2008 à 17:52
salut Sacabouffe
merci beaucoup pour ton aide, j'ai testé ca et ça bien marché.Ce que je veux savoir maintenant c'est comment exprimer la solution exacte pour pouvoir la comparer avec la solution numérique,ce que je sais c'est la solution fondamentale qui est :
p(x,t)=exp(-x**2/(4*a*t))/sqrt(4*%pi*a*t);
et la solution générale qui est donnée par :

u(x,t)=1/racine(4*pi*a*t) * integrale(u0(y)*exp(-(x-y)²/4*a*t)dy (l'integrale sur R)
d'une part, je ne sais pas comment approcher l'integrale par une somme d'une autre part je ne sais pas comment faire la comparaison puisque j'ai deux solutions l'une est fondamentale, l'autre est générale .
je veux aussi savoir comment utiliser la factorisation lu en scilab pour résoudre le système obtenu. merci
l
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
12 juin 2008 à 01:33
Salut

Je savais pas que tu devais faire juste le cas de la condition de Dirichlet. Dans ce cas traite juste cette condition...
La solution fondamentale, tu l'utilises quand tu travailles sur R. Là utilises un développement en série de Fourier, je t'ai déjà donné le lien, c'est ce paragraphe sous Wikipédia:
https://fr.wikipedia.org/wiki/Conduction_thermique#Cas_d.27un_domaine_limit.C3.A9_par_deux_plans_parall.C3.A8les

Pour la factorisation LU, si tu veux l'utiliser pour calculer ta solution numérique, t'as juste à utiliser deux fois un algorithme de substitution. Si ça peut t'aider:
https://dms.umontreal.ca/fr/page-non-trouvee

A plus
0
mirinda Messages postés 51 Date d'inscription dimanche 27 avril 2008 Statut Membre Dernière intervention 4 mai 2009 38
17 juin 2008 à 13:22
salut Sacabouffe
j'ai utilisé une somme sous forme :
uexacte=zeros(1,2*nx+1);
for i=1:2*nx
for j=1:2*nx
uexacte(i)=u0(j)*dx*k((i-j)*dx,nt*dt);
end
end
plot2d(x,uexacte,.....);

avec k(x,t)=exp(-x**2/(4*t))/sqrt(4*%pi*t)
mais ca na pas marché, je ne sais pas pourquoi.
pour la factorisation lu je sais c'est quoi , ce que je veux c'est comment l'appeler par scilab
j'ai un schéma sous forme
Un+1=Un-1 +A Un
qui est un schéma à trois niveaux(n+1,n-1,n), je ne sais pas comment le programmer puisque j'ai c'est trois niveaux.
j'attend ta réponse, merci d'avance.
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
17 juin 2008 à 19:35
Salut

Tu ne travailles pas sur R, tu travailles en domaine borné.
La solution exacte se calcule à l'aide d'une série de Fourier:
https://fr.wikipedia.org/wiki/Conduction_thermique#Cas_d.27un_domaine_limit.C3.A9_par_deux_plans_parall.C3.A8les

Pour calculer la décomposition LU de ta matrice mat, la commande c'est tout simplement:
[L,U]= lu(mat)
A plus
0
mirinda Messages postés 51 Date d'inscription dimanche 27 avril 2008 Statut Membre Dernière intervention 4 mai 2009 38
18 juin 2008 à 19:49
salut Sacabouffe
merci beaucoup, je n'avais pas fais attention au message 38.
en utilisant le développement en série de fourier , j'obtient u(x,t)=somme sur k (ak*exp(-k²*pi²*c*t)*sin(k*pi*x)

avec ak=2*integrale(u0(x)*sin(k*pi*x)dx sur un intervalle]0,1[*[0,T], ceca n'est ce pas ?
je veux savoir comment programmer ca puisque j'ai un integrale et une somme de k=0 jusqu'à infini.est ce que tu peux m'expliquer juste la démarche à suivre?

comment on peut programmer un schéma à trois niveaux comme celui là (schéma de Richardson) càd ou il y a n, n+1, n-1
Un+1=Un-1 +A Un
merci
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
24 juin 2008 à 14:01
Salut

J'y comprends plus rien, les données de ton problème changent au fur et à mesure, les noms de tes constantes aussi...

D'après tes messages précédents, la longueur de ton domaine c'est [-lg,lg] (donc de longueur 2*lg) et ta diffusivité thermique c'est a.

La température initiale que t'as écrite dans tes premiers messages est symétrique par rapport à l'origine donc:
u(x,t)=∑ ak*cos((k*pi*x)/lg)*exp(-a*k²*pi²*t/(2*lg)^2) (somme de 0 à +∞).
L'expression de tes ak est donnée par:
a0=1/(2*lg)*∫u0(x)dx (intégrale prise sur [-lg,lg])
ak=1/lg*∫u0(x)*cos((k*pi*x)/lg)dx pour k≥1 (intégrale prise sur [-lg,lg])

Pour ta somme infinie, tu t'arrêtes à un moment donné.
L'intégrale, tu la calcules en faisant une somme de Riemann.
Si pour ta somme infinie tu t'arrêtes à 100, le calcul des ak donne un truc du genre:
matu0=mtlb_repmat(u0.',1,101);
matx=mtlb_repmat(x.',1,101);
matk=mtlb_repmat((0:100),2*nx+1,1);
matkx=matk.*matx;
matcos=cos((%pi*matkx)/lg);
ak=sum(1/nx*matu0.*matcos,1);
ak(1)=ak(1)/2;
A plus
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
24 juin 2008 à 15:08
Concernant, le schéma de Richardson: totalement inutile, il est inconditionnellement instable.
Si tu veux un schéma à trois pas de temps, prends plutôt le schéma de Dufort-Frankel, il est inconditionnellement stable mais conditionnellement consistant (dt/dx → 0)
Comme c'est un schéma à trois pas de temps, il te faut un schéma de démarrage, c'est tout...
0
mirinda Messages postés 51 Date d'inscription dimanche 27 avril 2008 Statut Membre Dernière intervention 4 mai 2009 38
24 juin 2008 à 17:42
salut , merci
oui tu as raison à chaque fois je change des paramètres et des noms mais c'est à cause des données chaque fois il me donne des données différents maintenant il me demande de travailler sur un domaine de [0,1] avec une condition initiale sin(pi*x) ou x=j*dx...je doit tester des valeurs pour obtenir les cas stable et instable ...
pour le schéma de Richardson je ne vais pas le faire , j'ai déjà beaucoup de travail
c'est pour cela je t'ai demandé la solution analytique sur [0,1]
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
24 juin 2008 à 17:50
Quoi???
C'est ça ta température initiale???
Mais fallait le dire plus tôt !!!
Dans ce cas ta solution exacte c'est:
u(x,t)=sin(pi*x)*exp(-a*pi²*t)
C'est tout... Pas besoin de chercher midi à quatorze heures !!! :-DDD
0
mirinda Messages postés 51 Date d'inscription dimanche 27 avril 2008 Statut Membre Dernière intervention 4 mai 2009 38
25 juin 2008 à 10:36
salut
merci beaucoup
désolé, il me fallait te dire ça plus tot mais tu sais quelque fois on oublie des choses très important qu'on on est pressé par le temps.je sais que tu as fais un grand effort avec moi ,je n'ai qu'à te remercier mille fois 1000*1000*...
ne t'inquiète pas je vais traité les deux cas.
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
25 juin 2008 à 12:17
Salut
De rien mirinda, bonne chance pour la suite.
Ciao
0
mirinda Messages postés 51 Date d'inscription dimanche 27 avril 2008 Statut Membre Dernière intervention 4 mai 2009 38
30 juin 2008 à 17:31
Salut
j'ai écrit mon rapport à l'aide de Scientific Word , je veux maintenant créer des diapositives, est ce qu' il ya un logiciel qui permet de créer facilement ces derniers.
merci
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
2 juil. 2008 à 20:26
Salut
Fais plutôt un nouveau post pour ça, c'est un problème différent. Je sais pas trop où tu devras mettre ton post. À mon avis ça peut aller dans Logiciels/Pilotes, Bureautique ou Programmation peut-être...
Si t'utilisais LaTeX directement, je t'aurais dit Beamer mais là...
Il me semble qu'il y a la possibilité d'utiliser la classe Beamer avec Scientific Word mais j'en suis pas sûr et j'ai aucune idée de comment ça marche, désolé...
A plus
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
8 juil. 2008 à 02:16
Salut
Je comprends pas... Tracer des courbes 2D en 3D?
Si c'est des courbes 2D je vois pas comment tu veux les tracer en 3D... Tu veux que la troisième dimension des courbes soit relative au temps?
Explique mieux ce que tu veux faire.
A plus
0
elotmany hammou
24 juin 2009 à 01:24
la reponse:
ecrire le developpement limité de f(x) jusqu'à l'ordre 4 en x=xindice i et remplacer x par xindice(i+1) dans la premiere fois et 2 xpar xindice(i-1) et faire f(xindice(i+1))+f(xindice(i-1))=-2f(xindice i)+ un erreur d'ordre 4 bonne chance à tout le monde pour plus d'info:elotmany licmath@gmail.com
0
bonjour, en cherchant une solution pour mon problème, j'étais tellement chanceux en tombant par hasard sur ce site et lisant cette discussion fructueuse que vous êtes en train de mener (Mirinda et Sacabouffe) félicitations ^^
ma question et la suivante:
je cherche à résoudre l'équation de la diffusion en dimension 1:
Ut - uxx =0 pour (x,t) dans ]0,1[*R+*
U(x,0)= 2x pour 0=<x=<1/2
U(x,0)= 2(1-x) pour 1/2=<x=<1
U(0,t)=u(1,t)=0 pour t dans R+* condition de Dirichlet

( mais ce qui m'a stoppé c'est que notre cher professeur nous a imposé de résoudre le système linéaire obtenu en utilisant le schéma de Crank- Nicolson par la méthode de résolution du système tridiagonale communément connue sous le nom : méthode de thomas (algorithme)
j ai obtenu l'écriture matricielle suivante:
A* Un+1=B*Un
si j inverse la matrice A j obtenirai une matrice non tridiagonale ce qui m empêchera d'utiliser la méthode de thomas :)
veuillez m'aider SVP
merci d'avance
0