[Users-fr] Conduction dans une plaque sur Scilab

Seb seb_bd at live.fr
Jeu 15 Mai 21:38:56 CEST 2014


Bonjour,

Je suis en 2e année d'école d'ingé et j'ai un projet d'analyse numérique 
à faire sur Scilab.
Le but est de déterminer la chaleur en tout point d'une plaque de 
sommets (0,0); (2,0) ; (1,1) ; (0;1) (un carré avec un triangle 
rectangle isocèle à côté en somme) et de l'afficher dans un graphique 
(avec une animation en fonction du temps dans le meilleur des cas!)
Les conditions aux limites (sur les côtés) sont assez variables (un côté 
avec une température constante, deux avec un flux entrant ou sortant, et 
une paroi adiabatique). Pour commencer simplement, j'ai récupéré d'un 
prof un programme un peu similaire, qui concerne une plaque carrée avec 
des conditions aux limites simples (températures uniquement). Voici le 
code :

q=20;
h=1/(q-1)

function N=conduction(M)
N=M;       //ainsi N a les memes bords que M
c=1/4;

for i=2:(q-1)
     for j=2:(q-1)
     //equation de la chaleur discrete
     N(i,j)=M(i,j)+c*(M(i+1,j)+M(i-1,j)+M(i,j+1)+M(i,j-1)-4*M(i,j));
     end;
end;

endfunction




// Le programme thermo prend une matrice initiale puis applique le programme conduction conduction n fois.

function thermo(n)
//Initialisation. Differentes matrices initiales sont proposees en bas du fichier.
M=A;

for i=1:n
M=conduction(M);
end;

x=0:0.1:1;
y=0:0.1:1;
clf();
plot3d(x,y,M)
endfunction;





// Le programme animation fait la meme chose que thermo mais represente chacune des etapes de l'evolution de la plaque.
  
function animation(X)
   clf()
   f=gcf()//handle figure courante
   toolbar(f.figure_id,'off')//supprime la barre d'outils
   //rect=[-1.2,-1.2,1.2,0.2];//taille de la fenetre
   
   x=0:h:1;
   y=0:h:1;

//Initialisation.
   M=X
   plot3d(x,y,M)

   
   for t=0:100//la boucle de l'animation
      drawlater();
      //xpause(50000);
       M=conduction(M);
       clf()//efface le buffer
       plot3d(x,y,M)
      
       xinfo('t='+string(t))//voir le temps
       drawnow();
   end
   
endfunction






//Initialisation possibles avec des conditions au bord differentes.

//La temperature est nulle partout au bord. A t=0, elle est a 9 degres a l'interieur.
A=zeros(q,q);
A(2:(q-1),2:(q-1))=9*ones((q-2),(q-2));
  
//Le bord est a 0 degres d'un cote et a 10 degres de l'autre. La temperature initiale dans la plaque est nulle.
B=zeros(q,q);
B(1:q,q)=10;
B(1,1:q)=linspace(0,10,q);
B(q,1:q)=linspace(0,10,q);

//Deux cotes opposes a 0 degres et les deux autres a 10 degres. La temperature initilae est aleatoire.
C=zeros(q,q);
C(1,2:(q-1))=10;
C(q,2:(q-1))=10;
C(2:(q-1),2:(q-1))=10*rand((q-2),(q-2));

// La temperature au bord oscille partout entre 0 degres et 2 degres.
D=zeros(q,q);
D(1,2:2:(q-1))=2;
D(q,2:2:(q-1))=2;
D(2:2:(q-1),1)=2;
D(2:2:(q-1),q)=2;
  
// Bord et temperature aleatoires. Reexecuter le programme pour modifier la generateur aleatoire.
rand('seed',getdate('s'));
E=zeros(q,q);
v=abs((1:q)-6);
E(1,1:q)=10*rand(1,q);
E(q,1:q)=10*rand(1,q);
E(1:q,1)=10*rand(q,1);
E(1:q,q)=10*rand(q,1);
E(2:(q-1),2:(q-1))=10*rand((q-2),(q-2));

animation(A)


(Il y a plusieurs conditions aux limites possibles, il suffit de changer 
la matrice dans la dernière ligne (animation(A,B,C,D ou E))

Pour faire le rapprochement avec mon projet, il faut que ma surface soit 
polygonale (le polygone que j'ai décrit plus haut). Évidemment, la 
discrétisation change, vu qu'en fonction de la "hauteur" selon y, le 
nombre de points sur une même ligne change.

Là arrive mon problème. Comment tracer (avec plot3d je présume) une 
surface avec une base polygonale et où la valeur de z est donnée par la 
matrice des chaleurs (dans mon cas, elle s'appelle M)

J'ai essayé en donnant comme arguments de plot3d trois vecteurs x,y,z, 
avec le i-ème point de chaque vecteur étant la coordonnée (ou la chaleur 
pour z),mais ça n'a pas marché. J'ai ensuite essayé en utilisant les 
"facet" (cf aide de Scilab [help.scilab.org 
<http://help.scilab.org/docs/5.5.0/fr_FR/plot3d.html>]); j'arrive à 
tracer une surface polygonale, mais je ne peux donner les valeurs de z 
que pour les sommets de ce polygone...

Je suis donc à l'écoute de toute proposition qui pourrait m'aider à 
résoudre ça, merci beaucoup!
-------------- section suivante --------------
Une pièce jointe HTML a été nettoyée...
URL: <https://lists.scilab.org/pipermail/users-fr/attachments/20140515/3751fc42/attachment.htm>


Plus d'informations sur la liste de diffusion users-fr