UNIVERSITE DE RENNES 1 U.F.R. S.P.M. Campus de Beaulieu Licence de Physique Rapport de stage mai­juin 2008 Simulation sous MatLab d'une collision classique d'un ion positif soumis à un champ de potentiel et à un champ magnétique Par SUHARD Jérôme Organisme d'accueil : Nom du responsable : Equipe SIMPA Launay Jean­Michel Institut de Physique de Rennes (IPR) 02­23­23­56­63 Université de Rennes 1 Jean­Michel.Launay@univ­rennes1.fr Campus de Beaulieu ­ Bat 11B 35042 Rennes Cedex – France http://www.ipr.univ­rennes1.fr/SIMPA/ Avant toute chose, je tenais à remercier toute l'équipe SIMPA ainsi que les 2 stagiaires présent en même temps que moi pour leur amabilité et leur professionnalisme et en particulier à : Jean Michel LAUNAY, professeur et responsable de l'équipe SIMPA au sein de l'Institut de Physique de Rennes, de m'avoir accueilli dans son équipe et d'avoir su me guider à me poser les vraies questions physiques Franck THIBAULT, maître de conférence à l'université de Rennes 1, de ses propositions d'améliorations et de ses explications quant au fonctionnement des revues scientifiques Alexandra VIEL, chargée de recherche à l'Institut de Physique de Rennes, de sa patience à l'égard de mes (nombreuses) questions quant à l'environnement UNIX et au fonctionnement de la publication des recherches Sommaire CV .................................................................................................................................4 Lettre de motivation ......................................................................................................5 1. Présentation du laboratoire ......................................................................6 1.1. Activités ............................................................................................................................6 1.2. Equipe ...............................................................................................................................6 1.3. Moyens informatiques .......................................................................................................8 1.4. Publications .......................................................................................................................9 1.5. Collaborations ...................................................................................................................9 2. Travail effectué : Modèle numérique de collision .................................10 2.1. Aspects théoriques du modèle ....................................................................10 2.2. Programmation sous MATLAB ................................................................12 2.2.1. Résolution de α et β pour un puits de potentiel donné ...................................12 2.2.2. Application du Principe Fondamental de la Dynamique sur la particule .........14 2.2.3. Algorithme .......................................................................................................17 2.3. Confrontation du modèle avec la Physique ...............................................18 2.3.1. Champ magnétique seul ...................................................................................18 2.3.2. Potentiel seul ....................................................................................................20 2.3.3. Champ magnétique plus potentiel ....................................................................21 2.3.4. Amélioration de la précision ............................................................................22 3. Conclusions et perspectives ..................................................................27 4. Annexes ................................................................................................29 4.1. Fonction collision ......................................................................................29 4.2. Fonction etape_collision .........................................................................34 4.3. Fonction solve_potentiel ......................................................................... 35 4.4. Fonction potentiel .................................................................................... 36 4.5. Fonction graph_potentiel ..........................................................................38 5. Bibliographie .........................................................................................40 Jérôme SUHARD 23 Cité des Noyers 53250 Javron les Chapelles 06.21.65.31.53 [email protected]­rennes1.fr 21 ans Expérience professionnelle Du 04/01/2005 au 23/08/2005 et vacances scolaires 2006/2007 : Lyreco , Mayenne Préparateur en fournitures de bureau Du 03/11/2004 au 17/11/2004 : Immunia (Paris), Mayenne Manoeuvres sur un chantier d’épuration Du 18/10/2004 au 27/10/2004 : MPO , Mayenne Approvisionneur dans une entreprise de conditionnement Formation 2007/2008 : 3ième année de licence Physique, Rennes 2004 : Bac S spécialité SVT, Mayenne Compétences techniques 2007 : certificat du C2I ( Certificat Informatique et Internet ), Rennes bonne connaissance des environnements Windows et Linux codage régulier en PHP, HTML et java script, gestion de base de données Quelques connaissances serveur Apache ( principalement htaccess ) 4 à Jean­Michel Launay <jean­michel.launay@univ­rennes1.fr> Objet : Stage de Simulation du 28 avril au 21 juin 2008 Monsieur, Suite à la visite de votre laboratoire plus qu'intéressante, je sollicite auprès de vous un stage de simulation en Physique de 2 mois du 28 avril au 21 juin 2008 dans le cadre de ma 3ème année de licence . En effet, mes diverses expériences tant professionnelles que personnelles m'ont amené à acquérir des compétences variées comme l'intégration à une équipe, le travail collectif, la rigueur . J'aimerais donc poursuivre ce chemin en y ajoutant mes passions complémentaires que sont la Physique et la Programmation pour enrichir mon parcours professionnel dans votre laboratoire . Je vous remercie de l'attention que vous porterez a ma demande tout en restant à votre disposition, je vous prie d'agréer, Monsieur, mes salutations distinguées, Jérôme SUHARD 23 Cité des Noyers 53250 Javron les Chapelles 06.21.65.31.53 5 1. Présentation du laboratoire 1.1. Activités L'équipe de Simulation des Interactions entre Molécules, Photons et Atomes ( SIMPA ) de l'Institut de Physique de Rennes ( IPR ) s'intéresse à l'étude théorique et à la simulation numérique de processus élémentaires en Physique Atomique et Moléculaire . Leurs domaines de recherche concernent la dynamique quantique des réactions moléculaires, les processus atomiques en champs laser intenses et les processus moléculaires à ultra­basse température . Les applications concernent la physique des plasmas, l'astrophysique, la physico­chimie de l'atmosphère, la spectroscope moléculaire et la physique des condensats de Bose­Einstein . 1.2. Equipe Personnel permanent : Bourhis Gilles, Ingénieur de recherche Dunseath Kevin, Chargé de recherche Dunseath­Terao Mariko, Professeur Launay Jean­Michel, Professeur Lebreton Yveline, Astronome Magnier Sylvie, Professeur Simoni Andrea, Maître de conférence Thibault Franck, Maître de conférence Viel Alexandra, Chargée de recherche Postdoctorants : Lara Manuel Leino Markku Doctorants : Zanchet Alexandre Stagiaires : Milcent Sylvain, M1 Physique­chimie Le Cam Cédric, L3 Physique 6 De gauche à droite : Franck Thibault, Alexandra Viel, Jean­Michel Launay, Gilles Bourhis, Andrea Simoni, Alexandre Zanchet, Manuel Lara, Yveline Lebreton, Markku Leino, Mariko Dunseath­Terao, Kevin Dunseath 7 1.3. Moyens informatiques Le laboratoire est équipé d'un serveur de calcul appelé « SIMPATIX » ( en mémoire des anciens serveurs appelés Asterix, Obelix etc .. et du nom de l'équipe ) contenant : 25 noeuds 100 Go de RAM 7 To de stockage sur disque 850 GFlops ( 850 milliards d'opérations à virgule flottante – un entier n'est pas un nombre à virgule flottante – par seconde ) 2 PC serveurs LINUX 1 PC serveur Windows 12 terminaux X Nous nous connectons sur les terminaux X à l'aide d'un compte crée pour la durée du stage qui eux se connectent sur les serveurs LINUX . La puissance et la mémoire ­ tant vive ( RAM ) que disque – est donc partagée entre tous les utilisateurs du laboratoire, il convient donc de les utiliser avec parcimonie . Arrière du Serveur SIMPATIX 8 1.4. Publications 77 publications entre 2004 et 2007 dans les principales revues : European Physical Journal D Journal of Molecular Spectroscopy Journal of Physics B, Physical Review A Physical Review Letters Chemical Physics Letters Journal of Chemical Physics Journal of Physical Chemistry Physical Chemistry and Chemical Physics 1.5. Collaborations L'équipe est très tournée vers l'international en accueillant des chercheurs étrangers toute l'année comme le professeur K. Birgitta WHALEY ( de l'université de Berkeley ) durant mon stage . Elle a collaboré entre autre avec : Chine, Department of Physics, Tsinghua University, Beijing (L. Li) Allemagne, Technical University, Munich (W. Domcke) Espagne, Department of Chemical Physics, Universidad Complutense de Madrid (F.J. Aoiz, L. Banares) Etats­Unis, Department of Chemistry, University of Berkeley (K.B. Whaley) Russie, Institute of Physics, University of Saint­Petersbourg (V. B. Sovkov) Le laboratoire propose actuellement 3 thèses : Dynamique non­adiabatique de systèmes moléculaires Collisions ultra­froides dans les réseaux optiques Etude théorique de l’ionisation multiphotonique d’atomes en champ EUV de laser à électrons libres 9 2. Travail effectué : Modèle numérique de collision 2.1. Aspects théoriques du modèle L'objectif de ce stage est de simuler une collision dite « classique » entre un ion positif soumis à un champ de potentiel et à un champ magnétique . Pour ce faire, nous prendrons pour l'ion ( qui sera un proton ) : sa masse à 1,6524 E­27 kg ( 1836 * me kg) sa charge à 1,6 E­19 C ( 1 * (+e) C) Il aura comme conditions initiales : une vitesse initiale positive variable suivant l'axe y ( de l'ordre du mètre par seconde) , nulle pour les autres une distance ion – centre du potentiel de 100 Å suivant l'axe des x négatifs, le centre du potentiel étant situé à l'origine Il sera soumis à : un champ magnétique de 1 Tesla suivant l'axe des z positifs un potentiel du type α / r 8 – β / r 4 Ce potentiel aura une « profondeur » D de 1,6 E­19 J à son minimum r0 de 2 Å . Nous négligerons la force gravitationnelle dans cette simulation, en effet, à l'échelle de ce modèle ( ~100 Å ) , nous avons G∗m² ≈ 10 −48 N r² F lorentz = q∗v∗b = 1,6∗10 −19∗1∗1 ≈ 10−19 N 8∗α 4∗β F potentielle = 9 – 5 ≈ 10 −17 N r r F potentielle ≈ F lorentz ≫ F gravitationnelle F gravitationnelle = 10 L'élaboration du programme se fera en 3 temps : 1. Force de Lorentz F lorentz =q ∗ v ∧ b 2. Force potentielle F potentielle = − dV 8∗α 4∗β ∗ e r = – ∗ e r 9 dr r r5 3. Force de Lorentz et force potentielle Appliquons le principe fondamental de la dynamique en présence des 2 forces : m ∗ ̈r = q ∗ ̇ r ∧ b m ∗ ẍ = q ∗ b ∗ ẏ 8∗α r 8∗α r9 m ∗ ÿ = −q ∗ b ∗ ẋ m ∗ z̈ = 8∗α r 9 – 4∗β r 5 – 9 – 8∗α r 9 ∗ z 4∗β r5 4∗β r5 – ∗ e r 4∗β r 5 ∗ x x2 +y2 +z 2 ∗ y x2 +y 2 +z 2 x 2 +y 2 +z 2 11 2.2. Programmation sous MATLAB Version utilisée tout au long de ce stage : 7.0.4.352 (R14) Service Pack 2 tournant sous Linux . Bien que notre problème est bien défini dès le départ ( masse, charge fixées ; choix du potentiel ..), je m'efforcerais de coder des fonctions les plus générales possibles ( passage en paramètre de la masse, charge, champ magnétique, forme du potentiel..) pour accroître leurs potentiels d'action . En effet, on peux remarquer que d'autres potentiels très utilisés comme le potentiel de Lennard­Jones sont de la même forme que celui étudié : r012 r0 6 α β V r = 4V0∗ 12 − 6 = puissancealpha − puissancebeta r r r r 2.2.1. Résolution de α et β pour un puits de potentiel donné Connaissant la profondeur du puits D et la distance r0 associée, nous pouvons déterminer α et β . α β V r = 8 − 4 r r dV 8∗α 4∗β =− 9 5 dr r r à r = r0 , le potentiel est à son minimum : dV r=r 0 = 0 dr 8∗α 4∗β = 5 9 r0 r0 4 α = r 09 −5 ∗β 8 V r 0 = D = β= 8D 4r 0 9−5−8 8 −4 −8r 0 ∗β 4r 09−5 −8 −8r 0−4 ( D est inférieur à 0 Joule et r en mètres ) 12 %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ % FONCTION : SOLVE_POTENTIEL % AUTEUR : SUHARD Jérôme % DATE de dernière mise à jour : 04/06/08 %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ % Objectif : % Solve_potentiel calcule alpha et beta pour un potentiel de type % alpha / r^puissance_alpha ­ beta / r^puissance_beta % grâce à la distance r où il y a un minimum de potentiel ainsi que cette % valeur minimum d'énergie rentrées en paramètres %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ % Entrées : % * distance r qui correspond au potentiel minimum (réel positif) [ m ], % * profondeur du puit (réel négatif) [ J ], % * puissance pour le 'r' du terme alpha / r ( réel ), % * puissance pour le 'r' du terme beta / r ( réel ), %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ % Sorties : % * [alpha,beta] : renvoie les valeurs de alpha et beta calculées % ou % * vide : renvoie un graphique représentant le potentiel avec alpha et % beta calculés %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ % Usage : % solve_potentiel(2E­10,­1.6E­19,8,4) % [alpha,beta]=solve_potentiel(2E­10,­1.6E­19,8,4) %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ % Nécessite la fonction graph_potentiel pour fonctionner en mode graphique %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ ( Voir annexe 3 ) >> [alpha,beta]=solve_potentiel(2E­10,­1.6E­19,8,4) alpha = 4.0960e­97 beta = 5.1200e­58 Grâce à la commande solve_potentiel(2E­10,­1.6E­19,8,4) utilisant la fonction graph_potentiel ( Voir annexe 5 ), nous obtenons : 13 Figure 1 : potentiel en fonction de la distance r séparant la particule du « centre » du potentiel 2.2.2. Application du Principe Fondamental de la Dynamique ( PFD ) sur la particule m ∗ ẍ = q ∗ ẏ b z −b y ż m ∗ ÿ = q ∗ ż b x −b z ẋ m ∗ z̈ = q ∗ ẋ b y −b x ẏ 8∗α r 9 8∗α r9 8∗α r 9 – – – 4∗β r 5 4∗β r5 4∗β r 5 ∗ ∗ ∗ x x2 +y 2 +z 2 y x2 +y 2 +z 2 x z 2 +y 2 +z 2 Toute équation du n­ième ordre peux se mettre sous la forme de n équations du premier ordre 14 m ∗ ẍ = q ∗ ẏ b z −b y ż 8∗α – 4∗β ∗ x r r x +y 2 +z 2 devient: du 1 = u 4 dt du 4 u 1 8∗α 4∗β = q ∗ u 5 b z −b y u 6 – ∗ 9 5 2 dt r r u 1 +u 2 2 +u 3 2 9 5 2 u 4 x y u 5 du z avec u = et = u 6 ẋ dt ẍ ẏ ÿ ż z̈ Il en est de même pour les équations du second ordre pour y et z . Cette étape est nécessaire pour pouvoir résoudre numériquement ces équations à l'aide de la routine ode45 basée sur la méthode de Runge­Kutta à pas adaptatif . Ce « PFD à l'instant t » est modélisé par la fonction etape_collision %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ % FONCTION : ETAPE_COLLISION % AUTEUR : SUHARD Jérôme % DATE de dernière mise à jour : 05/06/08 %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ % Objectif : % etape_collision simule la position et la vitesse de la % particule en fonction de la position et vitesse antèrieures % pour un instant t donné %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ % Entrées : % * instant t, % * vecteur collonne y représentant [x; y; z; vx; vy; vz], %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ % Sortie : % * vecteur collonne ypoint représentant les nouvelles positions et vitesses % après la simulation du PFD sur la particule %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ % Usage : % ypoint=etape_collision(0,[­100E­10; 0; 0; 0; 5; 0]) %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ % Nécessite que les variables m,b,alpha,beta,cte_lorentz, % global_puissance_alpha et global_puissance_beta soient déclarées !! % A utiliser de préférence en tant que sous­routine %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ ( Voir annexe 2 ) Il sera utilisé avec la routine ode45 de la façon suivante : [t,y]=ode45(@etape_collision,[0 temps_simulation],[­100E­10; 0; 0; 0; vy; 0]); 15 sorties : vecteur colonne t contenant les différents instants t et vecteur colonne y contenant pour chaque point, un vecteur ligne [x y z vx vy vz] tous ces points simulés seront traités par la fonction collision : %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ % FONCTION : COLLISION % AUTEUR : SUHARD Jérôme % DATE de dernière mise à jour : 10/06/08 %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ % Objectif : % collision simule pour un temps donné les interactions entre une particule % et un potentiel le tout placé dans un champ magnétique %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ % Entrées : % * masse (réel positif) [ kg ], % * charge (réel) [ C ], % * champ magnétique ( vecteur [Bx By Bz] réel) [ T ], % * distance r qui correspond au potentiel minimum (réel positif) [ m ], % * profondeur du puit (réel positif) [ J ], % * "rayon" de la sphère virtuelle représentant le potentiel (réel positif) [ m ], % * puissance pour le 'r' du terme alpha / r ( réel ), % * puissance pour le 'r' du terme beta / r ( réel ), % * temps maximum (réel positif) [ s ], % * position et vitesse initiales ( vecteur [ x_initial y_initial z_initial vx_initial % vy_initial] vz_initial ) [ m & m/s ] %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ % Sorties : % * nb_collisions : renvoie le nombre de collisions dans l'intervalle de % simulation % ou % * vide : renvoie un graphique représentant : % % ** la trajectoire de la particule % ** le moment cinétique en fonction du temps % ** les énergies (cinétique, potentielle et totale) en % fonction du temps % ** le potentiel et l'énergie totale en fonction de la % distance séparant la particule du potentiel % %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ % Usage : % collision(1836*0.9E­30,1.6E­19,[0 0 1],2E­10,1.6E­19,3E­10,8,4,5E­9,[­100E­10 0 0 0 5 0]) %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ % Nécessite les fonctions solve_potentiel, etape_collision, potentiel et % graph_potentiel %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ % Quelques résultats : % * collision(1836*0.9E­30,1.6E­19,[0 0 1],2E­10,1.6E­19,3E­10,8,4,10E­9,[­100E­10 0 0 0 7.015 0]) % => 5 'pétales' : trajectoire fermée %­­­­ B > 10 T ­­­­­­­ % * collision(1836*0.9E­30,1.6E­19,[0 0 10],2E­10,1.6E­19,3E­10,8,4,50E­9,[­100E­10 0 0 0 18.06 0]) %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ 16 Passage en paramètre des données Résolution de alpha et bêta pour avoir la forme du potentiel Simulation de la vitesse et de la position de la particule en appliquant le PFD à chaque instant Début boucle traitement de tous les points obtenus Calcul de l'Energie Cinétique à l'instant t Calcul de l'Energie Potentielle à l'instant t Calcul de l'Energie Totale à l'instant t Vérification s'il y a collision ou pas Fin boucle traitement des points Affichage des différentes données simulées ou calculées Figure 2 : Algorithme de la simulation de la trajectoire de la particule 17 2.3. Confrontation du modèle avec la conservation de l'Energie totale Maintenant que nos fonctions sont crées et qu'il n'y a plus de bug informatique (plus aucun message d'erreur...), nous allons tester la fonction 'collision' du point de vue 'physique' à savoir dans un premier temps en présence d'un champ magnétique seul puis dans un deuxième uniquement en présence du potentiel pour finalement simuler cette trajectoire en présence de ces 2 forces . 2.3.1. Champ magnétique seul Nous prendrons pour cette simulation un champ de 1 Tesla suivant l'axe des z, une profondeur D du puits de potentiel égale à 0 Joule et une vitesse initiale selon l'axe y égale à 7 m/s (Ec = 4.04838E­ 26 J): >> collision(1836*0.9E­30,1.6E­19,[0 0 1],2E­10,0,3E­10,8,4,75E­9,[­100E­10 0 0 0 7 0]) ( Voir Figure 2 ) Nous pouvons voir ­ malgré le fait que l'image de la trajectoire est étirée – que la particule suit un mouvement circulaire de rayon 700 Å et que son énergie cinétique ­ donc totale ­ bien que non constante (sic!) est égale à l'Ec théorique pour un temps proche de 0 . 18 Figure 3 : Simulation de la trajectoire de la particule en présence d'un champ magnétique seul 19 2.3.2. Potentiel seul Figure 4 : Simulation de la trajectoire de la particule en présence du potentiel ( Le point vert symbolise le point de départ contrairement au rouge, le dernier point simulé ) Obtenue grâce à la commande : >> collision(1836*0.9E­30,1.6E­19,[0 0 0],2E­10,1.6E­19,3E­10,8,4,5E­9,[­100E­10 0 0 0 7 0]) Nous pouvons voir que la particule subit une collision qui l'éjecte hors de portée du potentiel lui conférant une vitesse supérieure à sa vitesse initiale 20 2.3.3 Champ magnétique plus potentiel Figure 5 : Trajectoire de la particule en présence du champ magnétique plus potentiel 21 Nous pouvons voir sur ce graphique que l'énergie se conserve mais est­ce totalement vrai ? Figure 6 : Zoom sur l'énergie totale au niveau de la collision Au fur et à mesure que nous centrons le graphique sur la collision, des irrégularités apparaissent . Comme nous pouvons le voir sur la figure 6, l'énergie potentielle est devenu positive d'où une énergie totale elle aussi positive ( signifiant une trajectoire non fermée ) et de surcroît non constante au cours du temps engendrant un gain d'énergie à chaque collision . 2.3.4. Amélioration de la précision J'ai de suite pensé à une erreur de programmation dans mon code de par sa taille – il faisait déjà 5 pages – mais après quelques jours de remaniement et de tests en tout genres et le fait que je n'avais toujours pas trouvé la cause de cette erreur, mon maître de stage M. Launay m'orienta vers la précision intrinsèque de la routine ode45 utilisée dans mon programme . Pour ce faire, il me conseilla de simuler un problème simple ­ dont le résultat est parfaitement connu ­ avec cette même routine . Il s'agissait de l'oscillateur harmonique : m ∗ ẍ k ∗ x = 0 k avec ω = m 2π et T = ω 22 En posant ω = 1 rad/s , nous devrions trouver T = 6.283 s et x max = x (t=0) . Pour ce faire, nous créons une routine appelée 'test.m' contenant : ẏ 1 = y 2 ẏ 2 = −ω² ∗ y 1 où y 1 = x et y 2 = ẋ et ω = 1 Elle est appelée avec : [t,y]=ode45(@test,[0 9],[7 0]); subplot(2,1,1); hold on plot(t(:),y(:,1),'bs') subplot(2,1,2); for i=1:length(y) cine(i) = 1/2*1836*0.9E­30*y(i,2)^2; pot(i) = 1/2*1836*0.9E­30*y(i,1)^2; tot(i) = cine(i) + pot(i); end plot(t,tot,'rs') Ce qui nous rend : Figure 7 : courbe du haut : abscisse x en fonction du temps de l'oscillateur harmonique courbe du bas : énergie mécanique en fonction du temps 23 La période simulée est donc correcte mais l'énergie totale n'est pas conservée or le programme cette fois ci est des plus simples, le soucis vient donc de ode45 comme M. Launay m'avait conseillé de regarder dès les débuts . Après quelques petites recherches dans l'aide de MatLab, il s'avère que ode45 a la meilleure précision parmi toutes les routines ode de résolution d'équations différentielles et que l'on peux agir sur cette précision . Cette précision est définie selon 3 paramètres : Refine : divise à chaque étape en n plus petits intervalles(4 par défaut pour ode45) AbsTol : erreur absolue, c'est elle qui détermine la précision lorsque le point est proche de l'origine RelTol : erreur relative, elle détermine le nombre de chiffres après la virgule Nous réessayons donc en jouant sur ces paramètres de précision : options = odeset('AbsTol',1E­20,'RelTol',1E­15); [t,y]=ode45(@test,[0 9],[7 0],options); subplot(2,1,1); hold on plot(t(:),y(:,1),'b') subplot(2,1,2); for i=1:length(y) cine(i) = 1/2*1836*0.9E­30*y(i,2)^2; pot(i) = 1/2*1836*0.9E­30*y(i,1)^2; tot(i) = cine(i) + pot(i); end plot(t,tot,'r') Figure 8 : courbe du haut : abscisse x en fonction du temps de l'oscillateur harmonique courbe du bas : énergie mécanique en fonction du temps ces 2 courbes sont obtenues avec une meilleur précision 24 MatLab zoom automatiquement ce qui signifie que la courbe du bas est une droite signifiant la conservation de l'énergie totale au cours du temps . Maintenant, nous pouvons revenir à notre fonction 'collision' pour lui appliquer ces nouveaux paramètres . >>collision(1836*0.9E­30,1.6E­19,[0 0 1],2E­10,1.6E­19,3E­10,8,4,15E­9,[­100E­10 0 0 0 7 0]) Figure 9 : Trajectoire de la particule soumis à un champ de potentiel et à un champ magnétique 25 Figure 10 : agrandissement de l'énergie totale L'erreur numérique est donc acceptable pour un nombre de collisions très faible ( si l'on suppose que l'on gagne uniformément 1.4% de l'énergie totale à l'origine à chaque collision, on gagne 14% de l'énergie totale à l'origine au bout de 10 collisions ) Notre système champ magnétique ( constant au cours du temps ) – potentiel est un système isolé signifiant donc la conservation exacte de l'Energie totale au cours du temps . Bien que non constante sur la figure 10, nous avons réduit l'erreur relative par 60 entre la figure 6 et la figure 10 ( représentant la même simulation, seule la précision a été modifiée ) . Cette non constance au cours du temps de l'Energie totale peux encore être réduite en augmentant la précision de la routine ode45 entraînant un temps de calcul proportionnel 26 3. Conclusions et perspectives Lors de ce stage, j'ai découvert la démarche scientifique du métier de chercheur . La difficulté principale a été de créer un modèle informatique en se basant uniquement sur l'application du Principe Fondamental de la Dynamique tout en ne connaissant pas le résultat final . En effet, le travail de recherche n'est que remise en question des résultats acquis antérieurement, ce que j'ai découvert avec les soucis liés à la précision de la routine de simulation de Runge­Kutta . L'apparente satisfaction de mes premières trajectoires ne fut que de courte durée puisqu'une analyse plus approfondie a mis en évidence des discordances entre ma simulation informatique et la réalité physique ( non conservation de l'Energie totale ) ce que je me suis forcé d'améliorer tout au long du stage . Dans cette optique, il aurait été intéressant d'améliorer ce modèle pour mieux rendre compte de la réalité physique pour un proton soumis à un champ magnétique et à un potentiel . Pour ce faire, il aurait fallu vérifier la conservation du moment cinétique au cours du temps et de prendre en considération la force centrifuge, mais par manque de temps je n'ai pu ajouté cela à mon code informatique . L = m∗r × v d L d v = m∗v × v m∗r × dt dt dL −dU = r × er q∗ v× B dt dr 2 − q∗r ∗B L = Cte 2 1 2 m Ṙ U eff 2 2 2 2 2 Λ q ∗B ∗R q× B U eff = U R − 2 8∗m 2∗m 2∗m∗R 2 qBR avec Λ = mR 2 Θ̇ 2 1 qBR 2 Θ̇ = Λ− 2 2 mR E= J'ai aussi le regret de ne pas avoir amélioré le programme en tant que tel, bien qu'il n'y a à rentrer les paramètres qu'une seule fois, l'usage en ligne de commande n'est pas aisée pour un novice . Il aurait été préférable de passer par une interface ( appelé GUI sous MatLab ) claire munie de boutons et de cases pré­remplies parfaitement adapté pour une utilisation en tant que démonstration pour des étudiants par exemple . Paradoxalement, le programme actuel n'est pas destiné à une utilisation plus poussée par un programme externe, en effet, aucun mode de sortie n'est prévu rendu l'exploitation des points simulés impossible par un programme externe comme VMD ( Visual Molecular Dynamics, http://www.ks.uiuc.edu/Research/vmd/ ) . 27 Toutefois, je garderais de cette expérience de très bons souvenirs, en effet, mon maître de stage m'a toujours placé dans le cas d'un client me confiant une mission en totale autonomie, aucune indication au sujet de la méthode à suivre, je ne connaissais que les conditions initiales ( choix du potentiel , méthode Runge­Kutta ..) et l'objectif ( afficher la trajectoire, vérifier la constance de l'énergie totale ) . Je devais donc analyser le problème, trouver le moyen de le coder puis vérifier si les objectifs étaient atteints tout en développant une vision « physique » du problème me confirmant mon choix de poursuivre mes études dans la simulation physique . 28 Annexes Annexe 1 : Fonction collision function [nb_collisions] = collision(masse,charge,champ,r_min_pot,profondeur_puit,rayon_potentiel,puissance_alpha,puissance_beta,t,x,vmin_y,v max_y,prec_vitesse_y); %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ % FONCTION : COLLISION % AUTEUR : SUHARD Jérôme % DATE de dernière mise à jour : 10/06/08 %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ % Objectif : % collision simule pour un temps donné les interactions entre une particule % et un potentiel le tout placé dans un champ magnétique %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ % Entrées : % * masse (réel positif) [ kg ], % * charge (réel) [ C ], % * champ magnétique ( vecteur [Bx By Bz] réel) [ T ], % * distance r qui correspond au potentiel minimum (réel positif) [ m ], % * profondeur du puit (réel positif) [ J ], % * "rayon" de la sphère virtuelle représentant le potentiel (réel positif) [ m ], % * puissance pour le 'r' du terme alpha / r ( réel ), % * puissance pour le 'r' du terme beta / r ( réel ), % * temps maximum (réel positif) [ s ], % * position et vitesse initiales ( vecteur [ x_initial y_initial z_initial vx_initial % vy_initial] vz_initial ) [ m & m/s ] %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ % Sorties : % * nb_collisions : renvoie le nombre de collisions dans l'intervalle de % simulation % ou % * vide : renvoie un graphique représentant : % % ** la trajectoire de la particule % ** le moment cinétique en fonction du temps % ** les énergies (cinétique, potentielle et totale) en % fonction du temps % ** le potentiel et l'énergie totale en fonction de la % distance séparant la particule du potentiel % %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ % Usage : % collision(1836*0.9E­30,1.6E­19,[0 0 1],2E­10,1.6E­19,3E­10,8,4,5E­9,[­100E­10 0 0 0 5 0]) %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ % Nécessite les fonctions solve_potentiel, etape_collision, potentiel et % graph_potentiel %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ 29 % Quelques résultats : % * collision(1836*0.9E­30,1.6E­19,[0 0 1],2E­10,1.6E­19,3E­10,8,4,10E­9,[­100E­10 0 0 0 7.015 0]) % => 5 'pétales' : trajectoire fermée %­­­­ B > 10 T ­­­­­­­ % * collision(1836*0.9E­30,1.6E­19,[0 0 10],2E­10,1.6E­19,3E­10,8,4,50E­9,[­100E­10 0 0 0 18.06 0]) %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ global m; global q; global b; global alpha; global beta; global cte_lorentz; global global_puissance_alpha; global global_puissance_beta; % FIN de définition des constantes globales %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ % vérification des variables entrées en paramètre(masse et temps positifs par ex) m = abs(masse); q = charge; b = champ; cte_lorentz = q/m; r_min_pot = abs(r_min_pot); profondeur_puit = abs(profondeur_puit); % D est mis positif puis sera multiplié par ­1 pour la recherche de alpha et beta temps_simulation = abs(t); rayon_potentiel = r_min_pot; % FIN vérification variables %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ global_puissance_alpha = puissance_alpha; global_puissance_beta = puissance_beta; %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ % Initialisation variables pour boucles collision = 0; % pas de collision au départ nb_collisions = 0; energie_cinetique = []; distance_minimum_pot = rayon_potentiel; liste_points_collision = [0 0 0 0 0 0 0]; l = []; % def du moment cinétique taille_liste_collision = 0; % FIN init. variables pour boucles %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ [alpha,beta]=solve_potentiel(r_min_pot,­1*profondeur_puit,puissance_alpha,puissance_beta); % calcul de alpha et beta vis à vis des conditions du potentiel if ( alpha ~= 0 | beta ~= 0 ) % si potentiel (attractif, répulsif ou les deux) rayon_potentiel = abs(rayon_potentiel); else rayon_potentiel = 0; % pas de potentiel = pas de collision = sphère representant le potentiel n'existe pas end options = odeset('Refine',8,'AbsTol',1E­20,'RelTol',1E­9); % modification du nombre de point pour un 'pas' élémentaire de ode45 %options = odeset('Refine',8); % AbsTol définit la précision globale et RelTol définit la précision % lorsque la particule est proche de l'origine, RelTol ne doit pas être < à % 1E­11 => temps de calcul très long [t,y]=ode45(@etape_collision,[0 temps_simulation],x,options); % simulation de tous les points pour t=0 jusqu'au temps de simulation maximum rentré en paramètre 30 if alpha == 0 & beta == 0 % ­­ début si pas de potentiel nb_tour = 0; rayon = []; diametre = 0; chemin = 0; for i= 2:length(y) % ­­ début boucle sur les éléments du vecteur y pas = ( ( y(i,1)­y(i­1,1) )^(2) + ( y(i,2)­y(i­1,2) )^(2) )^(1/2); % 'pas' élémentaire entre 2 points, approximation d'une droite chemin = chemin + pas; % on ajoute au fur et à mesure la distance parcourue corde = ( ( y(1,1)­y(i,1) )^(2) + ( y(1,2)­y(i,2) )^(2) )^(1/2); % longueur ( 'corde' ) entre le point de départ et le point courant if corde>diametre % si cette corde est maximum, on la garde en mémoire diametre = corde; % il suffit d'avoir un demi­cercle pour connaitre la corde maximum : le diamètre end end % ­­ fin boucle sur les éléments du vecteur y nb_tour = floor( chemin / (pi * diametre ) ); % on ne garde que l'entier du nombre de tours rayon = diametre / 2; if nb_tour > 0 % ­­ s'il y a plus d'un tour complet titre = ['Nombre de tours complets : ',num2str(nb_tour),' | Rotation sens horaire | Rayon moyen : ',num2str(rayon),' | ']; elseif nb_tour < ­1 % ­­ s'il y a plus d'un tour complet mais dans l'autre sens titre = ['Nombre de tours complets : ',num2str(abs(nb_tour)),' | Rotation sens anti­horaire | Rayon moyen : ',num2str(rayon),' | ']; else % sinon graphiquement, on verra le sens de rotation titre = ['Rayon moyen : ',num2str(rayon),' | ']; end % ­­ fin condition plus d'un tour complet else titre = ''; end % ­­ fin condition potentiel for i=1:length(y) %l(i) = m * (( y(i,2)*y(i,6) ­ y(i,5)*y(i,3) )^(2) + ( y(i,3)*y(i,4) ­ y(i,6)*y(i,1) )^(2) + ( y(i,1)*y(i,5) ­ y(i,4)*y(i,2) ) ^(2) )^(1/2) ; % calcul du moment cinétique pour chaque élément de y vecteur_position = [y(i,1) y(i,2) y(i,3)]; vecteur_vitesse = [y(i,4) y(i,5) y(i,6)]; l(i) = m*norm(cross(vecteur_position,vecteur_vitesse)); % calcul du moment cinétique pour chaque élément de y l(i) = l(i) + norm(vecteur_position)^(2)/2*q*norm(b); %l(i) = norm(vecteur_position)^(2)/2*q*norm(b); energie_cinetique(i) = 1/2*m*norm([y(i,4) y(i,5) y(i,6)])^(2); distance_potentiel(i) = (y(i,1)^(2) + y(i,2)^(2) + y(i,3)^(2))^(1/2); energie_potentielle(i) = potentiel(alpha,beta,distance_potentiel(i)); energie_totale(i) = energie_cinetique(i) + energie_potentielle(i); if distance_potentiel(i) < rayon_potentiel & collision == 0 % si la particule est dans la 'sphère' représentant le potentiel et qu'il n'y a pas eu de collision collision = 1; % on spécifie qu'il y a collision nb_collisions = nb_collisions +1; elseif distance_potentiel < distance_minimum_pot & nargout ==0 %elseif distance_potentiel(i) < (rayon_potentiel/9) & nargout ==0 % si la distance au potentiel est inférieure à la moitié du rayon de la sphère et que les graphiques soient demandés distance_minimum_pot = distance_potentiel(i); taille_liste_collision = size(liste_points_collision); % = [nb_lignes nb_colonnes] taille_liste_collision = taille_liste_collision(1)+1; % = nombre de lignes + 1 liste_points_collision(taille_liste_collision,1) = y(i,1); % = x liste_points_collision(taille_liste_collision,2) = y(i,2); % = y 31 liste_points_collision(taille_liste_collision,3) = y(i,3); % = z liste_points_collision(taille_liste_collision,4) = y(i,4); % = Vx liste_points_collision(taille_liste_collision,5) = y(i,5); % = Vy liste_points_collision(taille_liste_collision,6) = y(i,6); % = Vz liste_points_collision(taille_liste_collision,7) = t(i); % = t elseif distance_potentiel(i) > rayon_potentiel & collision ==1 % si la particule est en dehors de la sphère et qu'il y a eu collision collision = 0; % on spécifie qu'on est sorti de la sphère distance_minimum_pot = rayon_potentiel; end end %­­­­­­­­ Graphique ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ if nargout == 0 % ­­ si pas de variables de sorties = graphique demandé hold on axis('equal') % les axes sont orthonormés maintenant clf % on efface le graphique if x(3) == 0 | x(6) ==0 % cercle représentant la 'largeur'du potentiel rayon_cercle = rayon_potentiel; cercle_t=0:0.3:6.5; cercle_x = rayon_cercle*cos(cercle_t); cercle_y = rayon_cercle*sin(cercle_t); plot(cercle_x,cercle_y,'k­­'); hold on plot(0,0,'ks') % affichage du centre du potentiel plot(y(:,1),y(:,2),'w') axis('equal') comet(y(:,1),y(:,2)); else comet3(y(:,1),y(:,2),y(:,3),0.2); % on affiche l'animation de la trajectoire end %­­­­­­­­­­ 1er graph ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ subplot(2,2,1); % 1er graphique représentant la trajectoire hold on if alpha ~= 0 | beta ~= 0 % si potentiel plot3(0,0,0,'ks') % affichage du centre du potentiel % cercle représentant la 'largeur'du potentiel rayon_cercle = rayon_potentiel; cercle_t=0:0.3:6.5; cercle_x = rayon_cercle*cos(cercle_t); cercle_y = rayon_cercle*sin(cercle_t); cercle_z = 0.*cercle_t; plot3(cercle_x,cercle_y,cercle_z,'k­­'); %axis('equal') end plot3(y(:,1),y(:,2),y(:,3)) % on affiche le tracé de la particule 32 plot3(y(1,1),y(1,2),y(1,3),'gs') % affichage du point de départ text(y(1,1),y(1,2),y(1,3),['\rightarrow ( ',num2str(y(1,1)),' | ',num2str(y(1,2)),' | ',num2str(y(1,3)),' ) '],'HorizontalAlignment','left') plot3(y(length(y),1),y(length(y),2),y(length(y),3),'rs') % affichage de la dernière position text(y(length(y),1),y(length(y),2),y(length(y),3),['\rightarrow ( ',num2str(y(length(y),1)),' | ',num2str(y(length(y),2)),' | ',num2str(y(length(y),3)),' )'],'HorizontalAlignment','left') for i=2:taille_liste_collision % BUG : 1ère ligne vide plot3(liste_points_collision(i,1),liste_points_collision(i,2),liste_points_collision(i,3),'ks'); end xlabel('Axe des X'); ylabel('Axe des Y'); zlabel('Axe des Z'); grid('on'); titre = [titre,'Nombre de collisions : ',num2str(nb_collisions)]; title(titre); %­­­­­­­­­­ 2ième graph ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ subplot(2,2,2); % 2ième graphique représentant le moment cinétique plot(t,l,'g') title('Moment Cinétique en fonction du temps'); xlabel('Temps (s) '); ylabel(['Moments Cinétiques (',texlabel('kg.m^2.s^­1'),') ']); %comptage_collisions(vmin_y,vmax_y,temps_simulation,prec_vitesse_y); %liste_vitesse = vmin_y:prec_vitesse_y:vmax_y; %for i=1:length(liste_vitesse) % liste_nb_collisions(i) = collision(m,q,b,r_min_pot,profondeur_puit,rayon_potentiel,puissance_alpha,puissance_beta,temps_simulation,[x(1) x(2) x(3) x(4) liste_vitesse(i) x(6)]); %end %bar(liste_vitesse,liste_nb_collisions,'r'); %title('Nombre de collisions par vitesses'); %xlabel('Vitesse initiale suivant l axe y (m/s)'); %ylabel('Nombre de collisions'); %­­­­­­­­­­ 3ième graph ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ subplot(2,2,3) % 3ième graphique représentant l'énergie cinétique en fonction du temps hold on if alpha ~= 0 | beta ~= 0 % si potentiel plot(t,energie_cinetique,'k') % k = couleur noire, Ec différente de l'énergie totale plot(t,energie_potentielle,'b') end plot(t,energie_totale,'r') for i=2:taille_liste_collision % BUG : 1ère ligne vide energie_cine = 1/2*m*( liste_points_collision(i,4)^(2) + liste_points_collision(i,5)^(2) + liste_points_collision(i,6)^(2) ); plot(liste_points_collision(i,7),energie_cine,'ks'); end title('Energies en fonction du temps'); xlabel('Temps (s) '); ylabel('Energie (J) '); if alpha ~= 0 | beta ~= 0 % si potentiel legend('Energie Cinétique','Energie Potentielle','Energie Totale'); else 33 legend('Energie Cinétique'); end %­­­­­­­­­­ 4ième graph ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ subplot(2,2,4); % 4ième graphique représentant le potentiel selon r hold on graph_potentiel(alpha,beta,puissance_alpha,puissance_beta,3/4*r_min_pot,6/4*r_min_pot,r_min_pot); % potentiel plot(distance_potentiel,energie_totale,'r'); % affiche l'énergie totale for i=2:taille_liste_collision % BUG : 1ère ligne vide energie_cine = 1/2*m*( liste_points_collision(i,4)^(2) + liste_points_collision(i,5)^(2) + liste_points_collision(i,6)^(2) ); distance_collisions = ( liste_points_collision(i,1)^(2) + liste_points_collision(i,2)^(2) + liste_points_collision(i,3)^(2) )^(1/2); energie_tot = energie_cine + potentiel(alpha,beta,distance_collisions); plot(distance_collisions,energie_tot,'ks'); end end % ­­ fin condition graphiqe ou non %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ Annexe 2 : Fonction etape_collision ( sous­routine pour la fonction collision ) function ypoint = etape_collision(t,y) %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ % FONCTION : ETAPE_COLLISION % AUTEUR : SUHARD Jérôme % DATE de dernière mise à jour : 05/06/08 %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ % Objectif : % etape_collision simule la position et la vitesse de la % particule en fonction de la position et vitesse antérieures % pour un instant t donné %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ % Entrées : % * instant t, % * vecteur colonne y représentant [x; y; z; vx; vy; vz], %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ % Sortie : % * vecteur colonne ypoint représentant les nouvelles positions et vitesses % après la simulation du PFD sur la particule %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ % Usage : % ypoint=etape_collision(0,[­100E­10; 0; 0; 0; 5; 0]) %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ % Nécessite que les variables m,b,alpha,beta,cte_lorentz, % global_puissance_alpha et global_puissance_beta soient déclarées !! % A utiliser de préférence en tant que sous­routine %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ global m; global q; 34 global b; global alpha; global beta; global cte_lorentz; % q/m global global_puissance_alpha; global global_puissance_beta; % fin de récupération des variables globales (ie : spécifiées par la % fonction parent ) puissance_alpha = global_puissance_alpha; puissance_beta = global_puissance_beta; r = norm([y(1) y(2) y(3)]); % = norme du vecteur r vectoriel = cross([y(4) y(5) y(6)],b); % = produit vectoriel de v et b ypoint(1) = y(4); % = x ypoint(2) = y(5); % = y ypoint(3) = y(6); % = z ypoint(4) = cte_lorentz*( vectoriel(1) ) + ( puissance_alpha *alpha*(r)^(­( puissance_alpha +1)) ­ puissance_beta *beta*(r)^(­( puissance_beta +1)))*y(1)/(r*m); % = vx ypoint(5) = cte_lorentz*( vectoriel(2) ) + ( puissance_alpha *alpha*(r)^(­( puissance_alpha +1)) ­ puissance_beta *beta*(r)^(­( puissance_beta +1)))*y(2)/(r*m) ; % = vy ypoint(6) = cte_lorentz*( vectoriel(3) ) + ( puissance_alpha *alpha*(r)^(­( puissance_alpha +1)) ­ puissance_beta *beta*(r)^(­( puissance_beta +1)))*y(3)/(r*m) ; % = vz % à cet instant : ypoint = [x y z vx vy vz] ­ vecteur ligne ypoint = ypoint'; % ode45 ne prend en paramètre qu'un vecteur collonne % maintenant : ypoint = [x; y; z; vx; vy; vz] ­ vecteur collonne Annexe 3 : Fonction solve_potentiel function [alpha,beta] = solve_potentiel(r0,d,puissance_alpha,puissance_beta) %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ % FONCTION : SOLVE_POTENTIEL % AUTEUR : SUHARD Jérôme % DATE de dernière mise à jour : 04/06/08 %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ % Objectif : % Solve_potentiel calcule alpha et beta pour un potentiel de type % alpha / r^puissance_alpha ­ beta / r^puissance_beta % grâce à la distance r où il y a un minimum de potentiel ainsi que cette % valeur minimum d'énergie rentrées en paramètres %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ % Entrées : % * distance r qui correspond au potentiel minimum (réel positif) [ m ], % * profondeur du puit (réel négatif) [ J ], % * puissance pour le 'r' du terme alpha / r ( réel ), % * puissance pour le 'r' du terme beta / r ( réel ), %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ % Sorties : % * [alpha,beta] : renvoie les valeurs de alpha et beta calculées % ou % * vide : renvoie un graphique représentant le potentiel avec alpha et 35 % beta calculés %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ % Usage : % solve_potentiel(2E­10,­1.6E­19,8,4) % [alpha,beta]=solve_potentiel(2E­10,­1.6E­19,8,4) %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ % Nécessite la fonction graph_potentiel pour fonctionner en mode graphique %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ beta = puissance_alpha * d / ( puissance_beta*r0^(­1*puissance_beta) ­ puissance_alpha*r0^(­1*puissance_beta)); alpha = puissance_beta / puissance_alpha *r0^(puissance_alpha ­ puissance_beta) * beta; if ~(nargout > 0) % si pas de variable demandée en sortie = graphique demandé % avec les valeurs de alpha et beta calculés graph_potentiel(alpha,beta,puissance_alpha,puissance_beta,3/4*r0,2*r0,r0); end Annexe 4 : Fonction potentiel function v = potentiel(varargin) %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ % FONCTION : POTENTIEL % AUTEUR : SUHARD Jérôme % DATE de dernière mise à jour : 05/06/08 %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ % Objectif : % potentiel calcule le potentiel de type % alpha / r^puissance_alpha ­ beta / r^puissance_beta %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ % Entrées ( voir Usage ) : % * alpha calculé grâce à solve_potentiel, % * beta calculé grâce à solve_potentiel, % * puissance pour le 'r' du terme alpha / r ( réel ), % * puissance pour le 'r' du terme beta / r ( réel ), % * distance r à laquelle le potentiel doit être calculé %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ % Sortie : % * v : potentiel à la distance r %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ % Usage : % * v = potentiel(alpha,beta,puissance_alpha,puissance_beta,r) % * v = potentiel(alpha,puissance_alpha,puissance_beta,r) % = potentiel(alpha,0,puissance_alpha,puissance_beta,r) % * v = potentiel(alpha,beta,r) % = potentiel(alpha,beta,8,4,r) % * v = potentiel(alpha,r) % = potentiel(alpha,0,8,4,r) 36 % * v = potentiel(une_seule_variable) % = potentiel(0,0,puissance_alpha,puissance_beta,r) % = 0 %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ if nargin >= 5 % si 5 variables ou plus sont passées en paramètres % potentiel(alpha,beta,puissance_alpha,puissance_beta,r) alpha = varargin{1}; beta = varargin{2}; puissance_alpha = varargin{3}; puissance_beta = varargin{4}; r = varargin{5}; % on ignore les variables en plus ( 6ième, 7ième..) elseif nargin == 4 % si 4 variables passées en paramètres % potentiel(alpha,puissance_alpha,puissance_beta,r) % équivaut à potentiel(alpha,0,puissance_alpha,puissance_beta,r) alpha = varargin{1}; beta = 0; puissance_alpha = varargin{2}; puissance_beta = varargin{3}; r = varargin{4}; elseif nargin == 3 % si 3 variables passées en paramètres % potentiel(alpha,beta,r) % équivaut à potentiel(alpha,beta,8,4,r) alpha = varargin{1}; beta = varargin{2}; puissance_alpha = 8; puissance_beta = 4; r = varargin{3}; elseif nargin == 2 % si 2 variables passées en paramètres % potentiel(alpha,r) alpha = varargin{1}; beta = 0; puissance_alpha = 8; puissance_beta = 4; r = varargin{2}; else % si une seule variable est entrée en paramètre : pas de potentiel alpha = 0; beta = 0; puissance_alpha = 8; puissance_beta = 4; r = 0; end v = alpha/(r^(puissance_alpha)) – beta/(r^(puissance_beta)); 37 Annexe 5 : Fonction graph_potentiel function minimum = graph_potentiel(alpha,beta,puissance_alpha,puissance_beta,xmin,xmax,r_minimum) %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ % FONCTION : GRAPH_POTENTIEL % AUTEUR : SUHARD Jérôme % DATE de dernière mise à jour : 09/06/08 %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ % Objectif : % Graph_potentiel affiche le potentiel de type % alpha / r^puissance_alpha ­ beta / r^puissance_beta % ainsi que les 2 membres séparement %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ % Entrées : % * alpha calculé grâce à solve_potentiel, % * beta calculé grâce à solve_potentiel, % * puissance pour le 'r' du terme alpha / r ( réel ), % * puissance pour le 'r' du terme beta / r ( réel ), % * r minimum à afficher ( réel ), % * r maximum à afficher ( réel ), % Optionnelle : % * distance r pour laquelle le potentiel est minimum ( sinon calculé ) %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ % Sortie : % * minimum : renvoie la distance où le potentiel est minimum % ( elle sera égal à r_minimum s'il est renseigné ) % * graphique représentant le potentiel %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ % Usage : % graph_potentiel(alpha,beta,8,4,1E­10,3E­10,2E­10) % minimum=graph_potentiel(alpha,beta,8,4,1E­10,3E­10) %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ % Nécessite la fonction potentiel %­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ hold on % permet d'afficher plusieurs graphiques sur la même fenêtre if nargin > 6 % si le minimum est donné en paramètre, on ne le calcule pas minimum = r_minimum; else minimum = fminbnd(@(x)potentiel(alpha,beta,puissance_alpha,puissance_beta,x),xmin,xmax); end potentiel_minimum = potentiel(alpha,beta,puissance_alpha,puissance_beta,minimum); y_pot_min = 1.5*potentiel_minimum; % permet de ne pas afficher le texte r0 % sur la courbe mais un peu au dessus % alpha fplot(@(x)potentiel(alpha,0,puissance_alpha,puissance_beta,x),[xmin xmax],'r',1E­5) % rouge % ­ beta fplot(@(x)potentiel(0,beta,puissance_alpha,puissance_beta,x),[xmin xmax],'g',1E­5) % vert 38 % alpha ­ beta fplot(@(x)potentiel(alpha,beta,puissance_alpha,puissance_beta,x),[xmin xmax],'b',1E­5) % bleu fplot(@(x) potentiel_minimum,[5/6*minimum minimum*7/6],'k') % affiche en noir un trait signifiant la tangente horizontale en r0 text(minimum,y_pot_min,'\uparrow r0','HorizontalAlignment','left') title({['Minimum r0 : ',num2str(minimum),' | V0 = ',num2str(potentiel_minimum)];['\alpha = ',num2str(alpha),' & \beta = ',num2str(beta)]}) xlabel('Distance r entre la particule et le potentiel (m)'); ylabel('Energie (J)'); legend(texlabel(['alpha / r^',num2str(puissance_alpha)]),texlabel(['­ beta / r^',num2str(puissance_beta)]),texlabel(['alpha / r^',num2str(puissance_alpha),' ­ beta / r^',num2str(puissance_beta)])); fplot(@(x) 0,[xmin xmax],'k') % affiche en noir V=0 39 Bibliographie Classical Mechanics, Goldstein, Poole & Safko Springer Handboox of Atomic, Molecular and Optical Physics Mécanique, Landau et Lifchitz Atom­Molecule collision theory, Bernstein Webographie http://www.nucleaire­info.com/maple/trajectoire_maple_1.html http://www.ipr.univ­rennes1.fr http://www.ks.uiuc.edu/Research/vmd/