TP10 - Méthode d`Euler - CPGE du Lycée Montesquieu
Transcription
TP10 - Méthode d`Euler - CPGE du Lycée Montesquieu
Résolution d’équations différentielles Résumé Ce TP s’intéresse à la résolution numérique d’équations différentielles, l’objectif est d’utiliser la méthode d’Euler pour intégrer quelques équations différentielles simples, puis pour étudier un modèle plus complexe de dynamique des populations. 1 Décroissance radioactive On veut modéliser numériquement l’évolution d’un échantillon radioactif. On prendra les valeurs numériques du plutonium 238 1 , un isotope radioactif du plutonium ayant une constante radioactive λ = 0,79 siècle−1 qui se désintègre en émettant des particules α. On veut modéliser l’évolution temporelle d’un échantillon de plutonium 238 contenant initialement N0 = 1023 atomes. Par définition, la constante radioactive λ est la probabilité qu’un atome se désintègre par unité de temps. Si à l’instant t, l’échantillon contient N (t) atomes, le nombre dN d’atomes se désintégrant entre les instants t et t + dt est donc : dN = λN (t)dt. (1) On en conclut que : N (t + dt) = N (t) − λN (t)dt. (2) L’équation 2 permet de déterminer numériquement les valeurs de N (t) à un instant quelconque : connaissant N (t = 0) = N0 , on peut se fixer un petit intervalle de temps ∆t, puis calculer successivement, N (∆t) ' N0 − λN0 ∆t puis N (2∆t) ' N (∆t) − λN (∆t)∆t, etc. On peut ainsi calculer les valeurs de N (tn ), avec tn = n∆t. Pour limiter les erreurs dues à l’implémentation de certains algorithmes ou à la précision limitée de la machine sur laquelle on travaille, on choisit souvent en physique numérique de travailler dans des systèmes d’unités adaptés, qui donnent des valeurs numériques raisonnables. On pourra ici exprimer les temps en siècles et les quantités de matières en moles (1 mol = 6,02 × 1023 entités élémentaires). Écrire une fonction radioactivite en Python prenant comme arguments un nombre initial d’atomes N0 , une valeur maximale tmax de t, un pas ∆t et une probabilité de désintégration λ et qui retourne deux listes contenant les valeurs de tn et les valeurs de N (tn ) correspondantes. La syntaxe pour retourner deux listes et les utiliser est la suivante : 1 2 3 4 5 6 def r a d i o a c t i v i t e (N0 , tmax , del ta _t , Lambda ) : #Le code de la fonction qui crée deux listes liste_t et liste_N #... return l i s t e _ t , l i s t e _ N l_t , l_N = r a d i o a c t i v i t e (N0 , tmax , del ta _t , Lambda ) En utilisant matplotlib, tracer l’allure de N (t) obtenue pour quelques valeurs de ∆t (0,01 siècle, 0,1 siècle et 1 siècle, par exemple), on pourra prendre tmax = 5 siècles. Le code ci-dessous permet donne quelques exemples pour tracer de jolis graphes avec matplotlib. Les variables xn et yn doivent contenir des listes ou des tableaux de mêmes dimensions. Tous les arguments de la forme option=argument sont optionnels. 1. Le plutonium 238 est utilisé pour fabriquer des générateurs électriques utilisés dans des sondes spatiales : l’absorption des particules α qu’il émet échauffe le matériau, et on peut se servir de l’énergie dégagée pour alimenter un générateur électrique. Ce type de générateur a une puissance massique de 500 W/kg (1 kg dégage une puissance de 500 W) et est utilisé dans de nombreuses sondes spatiales (comme les sondes Voyager, lancées en 1977 qui fonctionnent toujours et sont actuellement en train de quitter le système solaire). 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import m a t p l o t l i b . p y p l o t a s p l t p l t . f i g u r e ( " Titre 1" ) # Crée une nouvelle fenêtre , le titre est facultatif p l t . p l o t ( x1 , y1 , c o l o r="pink" , marker = ’∗ ’ , l i n e s t y l e =’−−’, l a b e l=" Courbe 1" ) p l t . p l o t ( x2 , y2 , c o l o r="cyan" , marker =’o ’ , l i n e s t y l e = ’ −. ’ , l a b e l=" Courbe 2" ) # Version abrégée de la ligne précé dente : p l t . p l o t ( x2 , y2 , "co -." , l a b e l=" Courbe 1" ) p l t . l e g e n d ( ) # Affiche la boîte contenant la lé gende p l t . x l a b e l ( "axe x" ) # Lé gende de l’axe x p l t . y l a b e l ( "axe y" ) # Lé gende de l’axe y plt plt plt plt plt . f i g u r e ( ) # Crée une nouvelle fenêtre . p l o t ( x2 , y3 , l a b e l=" Courbe 3" ) . l e g e n d ( l o c=" lower left" ) # Affiche la boîte contenant la lé gende . x l a b e l ( "axe x" ) # Lé gende de l’axe x . y l a b e l ( "axe y" ) # Lé gende de l’axe y #À exé cuter une seule fois , à la fin du script , affiche les fenêtres : p l t . show ( ) Si vous souhaitez plus d’exemples, cette page http://matplotlib.org/users/pyplot_tutorial.html donne un résumé des possibilités de matplotlib. Cette page http://matplotlib.org/gallery.html donne de nombreux exemples plus complexes. Tracer sur le même graphe que précédemment la solution exacte du problème : N (t) = N0 e−λt . Quelle est l’influence de la valeur de ∆t sur la qualité du résultat ? 2 2.1 La méthode d’Euler Principe de la méthode d’Euler On veut généraliser la méthode utilisée dans la première partie à des équations différentielles du prermier ordre plus générales, de la forme ẏ = f (y,t), avec des conditions initiales de la forme y(t0 ) = y0 . Par l cos(ωt) 1 y , on a f (y,t) = (l cos(ωt) − y). exemple, pour l’équation différentielle ẏ + = τ τ τ On va utiliser pour cela la méthode d’Euler. Cette méthode s’appuie sur la définition de la dérivée. Si h est un intervalle de temps suffisamment petit, on peut écrire : ẏ(t) ' y(t + h) − y(t) , h ou encore : y(t + h) ' y(t) + hẏ(t). En partant de la condition initiale, y(t0 ) = y0 , on peut ainsi calculer y(t0 +h) = y0 +hẏ(t0 ) = y0 +hf (y0 ,t0 ) et de proche en proche déterminer la valeur de y à un instant quelconque. Plus exactement, en notant tn = t0 +nh et yn = y(tn ), on peut écrire yn+1 ' yn +hẏ(tn ) ' yn +hf (yn ,tn ). On se propose dans la suite d’intégrer l’équation différentielle : ẏ + 2,3y = 0 avec y(t = 0) = 1. (3) Quelle est la fonction f (y,t) correspondant à cette équation différentielle ? Définir en python la fonction f(y,t) associée. Définir une fonction python euler(f,t0,y0,tmax,h) prenant en arguments : — la fonction f, — les conditions initiales t0 et y0, — la valeur maximale tmax du temps pour lequel on souhaite calculer y(t) — le pas h , et retournant deux listes contenant les valeurs de tn et yn pour t0 ≤ tn < tmax . Utiliser la fonction euler pour résoudre l’équation différentielle 3, avec h = 0,1 et tmax = 5. Pour améliorer le résultat, on peut diminuer h, mais le calcul dure alors plus longtemps. Pour mesurer le temps que met la fonction euler à faire le calcul, on peut utiliser la fonction time() du module time. 2 TP Informatique - Python Lycée Montesquieu Cette fonction retourne un nombre en virgule flottante égal au temps écoulé en secondes depuis le le 01/01/1970 à 00h00 à l’instant où elle est exécutée. Modifier votre programme pour qu’il affiche le temps que met la fonction euler à s’exécuter et comparer les résultats obtenus pour h = 0,001, h = 0,01 et h = 0,1. Essayer de faire tourner votre programme avec la valeur h = 1. Que se passe-t-il ? 2.2 Application à l’étude de l’évolution des populations On s’intéresse à l’évolution d’une population de lièvres vivant dans un pays où l’herbe est toujours verte et abondante. Si les lièvres disposent de ressources alimentaires illimitées, leur population croît exponentiellement. Pour tenir compte de la surpopulation, on peut pondérer leur taux de fertilité par un taux de mortalité proportionnel à la population : plus les lièvres sont nombreux, plus ils sont victimes de maladies. L’équation différentielle vérifiée par la population de lièvres l(t) est donc de la forme : dl = (a − bl) · l, dt (4) où a est le taux de fertilité, et b une prise en compte de la surpopulation. On prendra a = 2 lièvres par an par lièvre et b = 0,001 lièvres par an par lièvre2 . Utiliser la fonction euler précédente pour tracer y(t) sur une même courbe dans l’intervalle de temps [0,5 ans] avec h = 0,01 an pour les différentes conditions initiales : y0 = 500,1000,2000,3000 et 5000 lièvres. Que remarque-t-on ? 3 Résolution de systèmes d’équations avec la méthode d’Euler : Le modèle de Lotka-Volterra fourrures (milliers) En présence de prédateurs, le modèle précédent ne semble pas fonctionner, on peut le constater en étudiant l’évolution des populations de lièvres et de lynx au Canada. Les données présentées figure 1 représentent l’évolution des quantités de fourrures de lièvre et de lynx achetées par la Compagnie de la Baie d’Hudson, qui avait le droit exclusif de la traite des fourrures dans tout l’ouest canadien, entre 1845 et 1903. 150 100 50 00 19 18 90 80 18 70 18 60 18 18 50 18 40 0 année Figure 1 – Nombre de fourrures lièvres et de lynx achetées à des trappeurs par la Compagnie de la Baie d’Hudson. Un système d’équations proposé indépendamment par Alfred Lotka et Vito Volterra en 1925 et 1926 permet de modéliser l’évolution de deux populations en interaction, du type proie-prédateur. On suppose dans ce modèle que seuls les prédateurs réduisent la croissance des proies qui disposent de ressources alimentaires illimitées. En l’absence de prédateurs, la population de proies croît exponentiellement. En l’absence de proies, la population de prédateurs décroit exponentiellement. L’interaction entre proies et prédateurs est proportionnelle à leur croisement dans la nature, donc au produit des deux populations. On se propose d’utiliser ce modèle pour décrire les interactions entre lièvres et lynx du Canada, ces derniers se nourrissant presque exclusivement de lièvres (voir figure 2). TP Informatique - Python Lycée Montesquieu 3 Figure 2 – Un lynx et un lièvre. On obtient alors, en notant l(t) le nombre de lièvres et y(t) le nombre de lynx, le système d’équations suivantes : dl = al − bly dt (5) dy = −cy + dly dt Afin d’obtenir des valeurs numériques comparables sur un graphique, on choisit d’exprimer le nombre de lièvres en milliers (1 kilolièvre = 1000 lièvres). On propose les paramètres suivants : — a = 1,5 kilolièvre par an par kilolièvre, — b = 0,05 kilolièvre par an par (kilolièvre · lynx), — c = 0,48, lynx par an par lynx, — d = 0,05 lynx par an par (kilolièvre · lynx). Définir une fonction Lotka_Volterra qui permet d’obtenir t, l(t) et y(t) en utilisant la méthode d’Euler. Elle prendra comme argument deux fonctions f et g, deux conditions initiales l0 et y0 , un intervalle de temps tmin , tmax et un pas h. Appliquer la fonction Lotka_Volterra avec y0 = 10 lynx, l0 = 4 kilolièvres, sur une durée de 50 ans, avec h = 0,0005 an. Tracer l(t) et y(t) en fonction du temps. Le modèle vous semble-t-il adapté ? Toutes conditions égales par ailleurs, tracer sur le même graphe y fonction de l, pour y0 = 10, 15, 30 et 40 lynx. Le graphe obtenu est appelé diagramme de phase. Que dire des trajectoires de phase ? Montrer à partir de ce graphe qu’il existe des solutions stables. Tracer sur le même graphe le diagramme de phase pour y0 = 10 lynx, l0 = 4 kilolièvres en faisant varier h : h = 0,0005 an, h = 0,005 an et h = 0,05 an. Commenter. Le modèle de Lotka-Volterra considère que la population de lynx et de lièvres est isolée, mais cela n’est pas le cas. Proposer une modification pour tenir compte de l’influence des trappeurs, sachant que le lièvre est plus facile à chasser mais que sa fourrure est moins chère. Tenir éventuellement compte du fait que la population de trappeurs fluctue. Proposer un modèle pour remonter au nombre de fourrures de la figure 1. 4 TP Informatique - Python Lycée Montesquieu