{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Séance 1 : résolution numérique des équations différentielles ordinaires" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "%pylab inline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exercice 1 (hypothèses du théorème de Cauchy-Lipchitz et résolution approchée).\n", "On considère l'équation différentielle\n", "$$\n", "x'(t)=\\sqrt{x(t)},\\ t>0,\n", "$$\n", "associée à la condition initiale $x(0)=0$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Question :** Expliquer en quoi ce problème ne relève pas du théorème de Cauchy-Lipchitz." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Réponse :** " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Question :** Écrire un code de résolution numérique de ce problème de Cauchy sur l'intervalle $[0,10]$ utilisant la méthode d'Euler explicite sur une grille uniforme.\n", "\n", "Pour cela, écrire une fonction ``euler_explicite`` dont les arguments d'entrée sont la fonction $f$ définissant le membre de droite de l'équation différentielle, les valeurs initiale et finale de la variable de temps $t$, la valeur de la donnée initiale du problème, le nombre $N$ de pas de la grille de discrétisation uniforme de l'intervalle de temps considéré, et dont les arguments de sorties sont le tableau contenant les valeurs de la variable de temps aux instants auxquels la solution approchée a été calculée et le tableau des valeurs de la solution approchée." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Effectuer alors une résolution approchée du problème avec $N=100$ pas de discrétisation en exécutant le code suivant." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def f(t,x): return sqrt(x)\n", "x0=array([0.])\n", "t,x=euler_explicite(f,0.,10.,x0,100)\n", "plot(t,x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Question :** Remplacer la valeur de la donnée initiale par l'évaluation numérique de $\\lvert\\left(\\sqrt{2}\\right)^2-2\\rvert$ et effectuer la résolution approchée. Qu'observe-t-on ? Comment interpréter ce comportement de la méthode ?" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Réponse :** " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exercice 2 (modèle SIR).\n", "On considère le système du [modèle SIR](http://en.wikipedia.org/wiki/Compartmental_models_in_epidemiology#The_SIR_model) de Kermack-McKendrick, décrivant l'évolution d'une population touchée par une maladie infectieuse,\n", "$$\n", "\\left\\{\n", "\\begin{align*}\n", "S'(t)&=-r\\,S(t)I(t),\\\\\n", "I'(t)&=r\\,S(t)I(t)-a\\,I(t),\\\\\n", "R'(t)&=a\\,I(t),\n", "\\end{align*}\n", "\\right.\\ t>0,\n", "$$\n", "associé à la donnée initiale \n", "$$\n", "S(0)=S_0,\\ I(0)=I_0,\\ R(0)=R_0.\n", "$$\n", "On rappelle que les fonctions $S$, $I$ et $R$ représentent le nombre au cours du temps de personnes respectivement susceptibles de contracter la maladie, infectées et immunisées après avoir été malades, le réel $r$ est le taux d'infection et le réel $r$ est le taux de guérison. On utilisera les valeurs suivantes des paramètres du problème :\n", "\n", "$$\n", "S_0=762,\\ I_0=1,\\ R_0=0,\\ r=0.00218,\\ a=0.44036,\\ T=14,\n", "$$\n", "\n", "obtenues par un étalonnage du modèle effectué à partir des données d'une épidémie de grippe dans une école de garçons publiées dans la revue médicale britannique *The Lancet* le 4 mars 1978." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Question :** Calculer une solution approchée du système sur l'intervalle de temps $[0,T]$ en utilisant la méthode d'Euler explicite (on se servira de la fonction écrite dans l'exercice précédent) et $N=10^5$ pas de discrétisation. Représenter l'évolution des valeurs des approximations obtenues des nombres $S(t)$, $I(t)$ et $R(t)$ au cours du temps." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Question :** On note $N$ le nombre de pas de discrétisation employés. Vérifier théoriquement et numériquement que l'approximation obtenue vérifie, pour tout $0\\leq n\\leq N$,\n", "$$\n", "S_n+I_n+R_n=S_0+I_0+R_0.\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Réponse :** " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Question :** En prenant comme solution de référence celle obtenue avec $N=10^5$ pas de discrétisation, représenter (avec une échelle logarithmique) les erreurs au temps $T$ trouvées en utilisant successivement $N=10,10^2,\\dots,10^4$ pas de discrétisation." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Retrouver alors l'ordre de convergence effectif de la méthode en utilisant la fonction ``polyfit`` de **numpy**." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Question :** Écrire, sur le modèle de la fonction ``euler_explicite``, une fonction ``rk4`` pour la méthode de Runge--Kutta d'ordre quatre «classique». On rappelle que cette méthode a pour tableau de Butcher\n", "$$\n", "\\begin{array}{c|cccc}\n", "0\\\\\n", "\\frac{1}{2}&\\frac{1}{2}\\\\\n", "\\frac{1}{2}&0&\\frac{1}{2}\\\\\n", "1&0&0&1\\\\\n", "\\hline\n", "&\\frac{1}{6}&\\frac{1}{3}&\\frac{1}{3}&\\frac{1}{6}\n", "\\end{array}.\n", "$$" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Répondre à la question précédente en utilisant cette méthode." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exercice 3 (équation raide et stabilité absolue).\n", "On cherche à approcher numériquement la solution du problème de Cauchy\n", "$$\n", "x'(t)=-50\\,\\left(x(t)-\\cos(t)\\right),\\ t>0,\\text{ et }x(0)=0,\n", "$$\n", "sur l'intervalle $[0,2]$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Question :** Utiliser la méthode d'Euler explicite pour résoudre le problème avec un pas de discrétisation de longueur constante, successivement choisie\n", "\n", "- strictement supérieure à 0,04, \n", "- comprise entre 0,02 et 0,04,\n", "- strictement inférieure à 0,02.\n", "\n", "Qu'observe-t-on et quelle explication peut-on fournir ?" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Question :** Effectuer les calculs précédents avec la méthode d'Euler implicite. Pour cela, écrire une fonction ``euler_implicite`` dans laquelle la méthode de Newton-Raphson est employée pour résoudre le système d'équations non linéaires (on ajoutera dans les arguments d'entrée la fonction donnant la dérivée par rapport à $x$ de la fonction $f$ définissant le membre de droite de l'équation différentielle, ainsi que des paramètres d'arrêt pour la méthode de Newton-Raphson). Relancer les simulations et conclure." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Réponse :** " ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.1" } }, "nbformat": 4, "nbformat_minor": 2 }