[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