|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité de passage
![]() Inscription : août 2011 Messages : 7 ![]() |
Bonsoir,
je suis étudiant et je dois faire un programme sur la diffusion. voici ce qu'on a codé pour l'instant (le programme marche bien). Pourriez vous s'il vous plait m'aider à l'améliorer en vitesse ou autre, je suis ouvert à toutes vos propositions. je vous remercie. Code :
|
||
|
|
00
|
|
|
#2 |
|
Membre chevronné
![]() Olivier PlanchonChercheur Inscription : avril 2007 Messages : 644 ![]() |
J'ai essayé de regarder ton code pour voir si je pouvais te donner un coup de main. En fait, je n'ai trouvé qu'un seul conseil pour l'instant :
ton code fait 80 lignes. avant de le faire lire à quelqu'un d'autre, écris 160 lignes de commentaire en plus pour expliquer ce que tu fais. 2 lignes de commentaire pour une ligne de code, c'est à peu près le minimum que tu peux trouver dans un code normal.
__________________
Quelque soit sa maigreur, les couilles de l'éléphant remplissent toujours la marmite (proverbe africain) Matlab 7.4.0.287 (R2007a). Je ne réponds pas aux messages privés techniques. Merci de poster les questions techniques sur les forums, comme c'est recommandé ICI |
|
|
00
|
|
|
#3 | ||
|
Invité de passage
![]() Inscription : août 2011 Messages : 7 ![]() |
Merci pour votre conseil.
Dans ce message l'explication du programme ainsi que le code détaillé étape par étape. Tout d'abord je suis étudiant en école d'ingénieur Le but de ce TD est de nous apprendre les rudiments de MATLAB tout en étudiant un phénomène physique particulier, ici la diffusion des atomes (migration des atomes sous l'effet de l'agitation thermique) Voila le principe: On crée une matrice de zéros qui sera l'espace de référence dans lequel les atomes diffusent. Pour modéliser les atomes, on ajoute des 1 dans la ligne centrale de la matrice. Tous les atomes se déplacent l'un après l'autre, une fois, soit en haut, à droite, bas ou gauche dans la matrice (déplacement aléatoire). Puis ça recommence... Conditions: Il ne peut pas y avoir deux atomes a une même position dans la matrice. Les atomes ne peuvent pas sortir de la matrice. Pour finir le programme édite un profil de l'espace avec la position finale des atomes et un graphe de répartition des atomes selon leur positions avec un lissage de courbe pour obtenir une belle gaussienne. Code :
|
||
|
|
00
|
|
|
#4 |
|
Membre chevronné
![]() Olivier PlanchonChercheur Inscription : avril 2007 Messages : 644 ![]() |
Si tu veux optimiser ton code spécifiquement pour matlab, il faut virer toutes le boucles for...next. C'est un peu compliqué à imaginer quand on n'a pas l'habitude. Dans ton cas, l'idée est de séparer ton tableau d'atomes en 4 tableaux selon la direction où ils vont. Dans un des tableaux, tu peux faire tous les déplacement en une seule opération en faisant un shift sur les lignes ou les colonnes, selon la direction définie.
En plus, ton code ne simule pas un mouvement brownien car tu exclu la possibilité qu'un atome reste dans sa case. Soit ta case a une dimension physique très petite par rapport au déplacement moyen d'un atome dans un pas de temps, dans ce cas là tu dois envisager qu'un atome puisse parcourir plusieurs cases. Soit ta case est grande et tu dois accepter que ton atome puisse ne pas en sortir. Bref, ce que tu as simulé, c'est plus proche du jeu des chaises musicales que de la diffusion. Perso, il m'arrive de bosser sur la diffusion (celle des grains de sable quand ils sont impactés par des gouttes de pluie) et je n'utiliserai jamais un code comme le tiens. Autre point discutable : Le fait qu'un atome ne puisse pas atteindre les cases diagonales est également très discutable. Pour respeter le sens physique, tu devrais faire alternativement des mouvement aléatoires en X et en Y, et pas l'un ou l'autre dans le même pas de temps.
__________________
Quelque soit sa maigreur, les couilles de l'éléphant remplissent toujours la marmite (proverbe africain) Matlab 7.4.0.287 (R2007a). Je ne réponds pas aux messages privés techniques. Merci de poster les questions techniques sur les forums, comme c'est recommandé ICI |
|
|
00
|
|
|
#5 |
|
Membre chevronné
![]() Olivier PlanchonChercheur Inscription : avril 2007 Messages : 644 ![]() |
Voici un code qui fait à peu près ce que tu as décrit sans jamais boucler sur les lignes et les colonnes de la matrice.
Ne jamais boucler sur les lignes et les colonnes de la matrice, C'est LA grande règle d'optimisation des codes matlab. Si il y a des trucs que tu ne comprends pas dans mon petit code, explore l'aide de matlab ou repique les morceaux de code que tu comprends pas dans des bouts d'essai pour voir ce qu'ils font. Si le code te plait, à toi de l'adapter à tes besoins (je le ferai pas pour toi
__________________
Quelque soit sa maigreur, les couilles de l'éléphant remplissent toujours la marmite (proverbe africain) Matlab 7.4.0.287 (R2007a). Je ne réponds pas aux messages privés techniques. Merci de poster les questions techniques sur les forums, comme c'est recommandé ICI |
|
|
00
|
|
|
#6 | ||
|
Membre chevronné
![]() Olivier PlanchonChercheur Inscription : avril 2007 Messages : 644 ![]() |
et avec le code c'est mieux !
Code :
__________________
Quelque soit sa maigreur, les couilles de l'éléphant remplissent toujours la marmite (proverbe africain) Matlab 7.4.0.287 (R2007a). Je ne réponds pas aux messages privés techniques. Merci de poster les questions techniques sur les forums, comme c'est recommandé ICI |
||
|
|
10
|
|
|
#7 |
|
Invité de passage
![]() Inscription : août 2011 Messages : 7 ![]() |
ok Merci beaucoup pour le code, je vais regarder ça.
En ce qui concerne mon modèle de déplacement aléatoire des atomes, j'obtiens des résultats qui sont très proches du modèle théorique de la 2ème loi de Fick: C(x,t)=C0/√πDt*e^(-(x^2/Dt)) Puisque quand je fit mes résultats avec cette loi normale, voici ce que j'obtiens (avec en ordonnées le nombre d'atomes par ligne dans le tableau et en abscisse le numéro de la ligne du tableau). D'autre part le fait que les sauts dans les diagonales soit impossible me paraît justifiable dans le cas où on limite les déplacements aux cases contiguës. L'atome a une énergie qui peut le faire déplacer au maximum de la longueur qui le sépare d'une case adjacente. Mais c'est vrai que il manque qq chose dans le programme... |
|
|
00
|
|
|
#8 | |
|
Membre chevronné
![]() Olivier PlanchonChercheur Inscription : avril 2007 Messages : 644 ![]() |
Citation:
![]() pas besoin de chercher très loin une prévision un peu plus forte de X, que Y ne respecte pas. X = le mouvement brownien Y = ton code D'une manière générale il est difficile de prouver que un code Y respecte un modèle théorique X. Le mieux qu'on puisse faire est de montrer qu'on a passé beaucoup de temps à essayer de montrer que X ~= Y et que on n'y est pas arrivé. Toi, tu trouves LA prédiction théorique que Y est capable de simuler correctement.... pas tout à fait la bonne approche.
__________________
Quelque soit sa maigreur, les couilles de l'éléphant remplissent toujours la marmite (proverbe africain) Matlab 7.4.0.287 (R2007a). Je ne réponds pas aux messages privés techniques. Merci de poster les questions techniques sur les forums, comme c'est recommandé ICI |
|
|
|
10
|
|
|
#9 |
|
Invité de passage
![]() Inscription : août 2011 Messages : 7 ![]() |
Bonsoir,
effectivement, l'erreur réside dans le fait que j'applique une loi macroscopique (Loi de Fick) à un problème qui est microscopique. En poussant un peu ma machine et après de longues minutes d'attentes, voila le profil que j'obtient avec 3000 déplacements pour chaque atome. On est assez loin modèle théorique (la courbe) ! Pour améliorer ça il faut tenir compte de l'environnement de chaque atome c'est à dire si l'atome est entouré ou non d'un autre atome. En principe cela ramène le problème à l'échelle microscopique et cela nous rapproche plus de la réalité. Nous avons aussi décidé d'ajouter une fonction pdepe (résolution d'une nouvelle équation différentielle). En gros ça devrait nous permettre de fixer un paramètre (D, coefficient de diffusion ou t, temps total de la diffusion) et d'utiliser notre programme pour simuler la diffusion d'atome dans des matériaux bien précis. Désolé si il y a des redite par rapport au code que vous avez envoyé. |
|
|
00
|
|
|
#10 | |
|
Membre chevronné
![]() Olivier PlanchonChercheur Inscription : avril 2007 Messages : 644 ![]() |
Citation:
Faites attention à ne pas réinventer le mur mittoyen : il y a des étagères complètes de livres sur la diffusion. Je bosse avec un collègue du CEA qui a passé 15 ans rien que sur cette équation... Il y a donc fort à douter que vous puissiez créer du nouveau en quelques heures. => ces quelques heures vous seront plus profitables à feuilleter les bons livres d'une bibliothèque scienifique digne de ce nom (Eyrolles à Paris) où à piocher Google avec les mots clé qui vont bien. Quand vous aurez trouvé une solution déja publiée et proche de votre problème, codez-la et le tour est joué. Pour répondre plus près de ta question : * vision cartésienne : admettre plus que un atome par case et itérer sur chaque atome de chaque case. * vision lagrangienne : pas de case : tu ne gères que des atomes et leur position. Note : le mouvement brownien ne tiens pas nécéssairement compte des colisions. Le mouvement de la poussière en suspension dans l'air est brownien, et on peut le décrire en ignorant les colisions. Les chocs entre particules doivent être pris en compte uniquement si tu veux relier mouvement brownien et chaleur.
__________________
Quelque soit sa maigreur, les couilles de l'éléphant remplissent toujours la marmite (proverbe africain) Matlab 7.4.0.287 (R2007a). Je ne réponds pas aux messages privés techniques. Merci de poster les questions techniques sur les forums, comme c'est recommandé ICI |
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com