[Users-fr] Conduction dans une plaque sur Scilab

classic Classic list List threaded Threaded
2 messages Options
Seb Seb
Reply | Threaded
Open this post in threaded view
|

[Users-fr] Conduction dans une plaque sur Scilab

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]); 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!
_______________________________________________
users-fr mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users-fr
Samuel GOUGEON Samuel GOUGEON
Reply | Threaded
Open this post in threaded view
|

Re: Conduction dans une plaque sur Scilab

Bonjour,

Le 15/05/2014 21:38, Seb a écrit :
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 : 
.../...
(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]); j'arrive à tracer une surface polygonale, mais je ne peux donner les valeurs de z que pour les sommets de ce polygone...
Une carte thermique "à plat" comparable à un thermogramme est aussi possible, la couleur du "pixel" étant fonction de la température (voir Matplot, Matplot1, ou la famille des.. grayplot())
Mais cela ne résoudra pas votre problème de limites de grille d'échantillonnage spatial. Pour traiter celui-ci, quelques remarques :
 - si une des coordonnées d'un tracé a la valeur spéciale %nan, le "pixel" correspondant n'est pas tracé (ou les traits reliant ce noeud à ses voisins). Cela permet de masquer les noeuds (et les arêtes) situés hors du périmètre du polygone qui vous intéresse.
 - le module externe SciFreeFEM devrait vous aider. Il propose des démonstrations.   http://atoms.scilab.org/toolboxes/SciFreeFEM
Il existe quelques modules externes qui travaillent eux directement avec des éléments finis (au moins en 2D, ce qui est ici le cas). Voir sur ATOMS et dans les archives.

Salutations
Samuel Gougeon


_______________________________________________
users-fr mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users-fr