{"cells":[{"metadata":{},"cell_type":"markdown","source":"# Méthode d'Euler\n\nL'objectif de cette activité est de mettre en oeuvre la méthode d'Euler pour résoudre des équations différentielles."},{"metadata":{"trusted":false},"cell_type":"code","source":"# bibliothèques utiles\nimport numpy as np\nimport matplotlib.pyplot as plt","execution_count":2,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Système linéaire d'ordre 1\n\nLe but de cette partie de vérifier la pertinence de la méthode d’Euler dans un cas où la solution exacte est connue. \n\nConsidérons un système régi par une équation différentielle linéaire du premier ordre :\n$$\\dfrac{{\\rm d}x}{{\\rm d}t} + \\dfrac{x}{\\tau} = \\dfrac{x_e}{\\tau}$$\nPrenons les valeurs suivantes : $x_e=5$ et $\\tau=2$."},{"metadata":{"trusted":false},"cell_type":"code","source":"xe = 5\ntau = 2","execution_count":1,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"On cherche à résoudre cette équation numériquement sur l’intervalle $[0\\,;\\, 5\\tau ]$, avec comme condition initiale $x(0) = 0$.\n\nCoder l’algorithme d’Euler dans la fonction **eulerlin1** ci-dessous qui prend le nombre $N$ d’itérations en argument et qui renvoie deux listes de longueur $N + 1$ : les instants $t_i$ et les valeurs $x_i$ calculés successivement en utilisant la méthode d’Euler, $i\\in[\\![0,N]\\!]$."},{"metadata":{"trusted":false},"cell_type":"code","source":"def eulerlin1 (N): # a compléter\n","execution_count":2,"outputs":[{"output_type":"stream","text":"  File \"<basthon-input-2-b21debe1b656>\", line 1\n    def eulerlin1 (N): # a compléter\n                                    ^\nSyntaxError: incomplete input\n","name":"stderr"}]},{"metadata":{},"cell_type":"markdown","source":"Le bloc suivant affiche les graphes obtenus pour N = 10 (bleu), N = 30 (cyan), N = 100\n(vert), N = 300 (magenta) et N = 1000 (rouge), ainsi que la solution exacte (noir). \n\nZoomer pour distinguer les courbes. "},{"metadata":{"trusted":false},"cell_type":"code","source":"plt.clf()\n# N = 10\nt1,u1=eulerlin1(10)\nplt.plot(t1,u1,'b-+')\n# N = 30\nt2,u2=eulerlin1(30)\nplt.plot(t2,u2,'c-+')\n# N = 100\nt3,u3=eulerlin1(100)\nplt.plot(t3,u3,'g-+')\n# N = 300\nt4,u4=eulerlin1(300)\nplt.plot(t4,u4,'m-+')\n# N = 1000\nt5,u5=eulerlin1(1000)\nplt.plot(t5,u5,'r-+')\n# solution exacte\nt=np.linspace(0,5*tau,1001)\nplt.xlabel(r'$t$')\nplt.ylabel(r'$x$')\nplt.plot(t,xe-xe*np.exp(-t/tau),'k')\nplt.show()\n","execution_count":3,"outputs":[{"output_type":"stream","text":"Traceback (most recent call last):\n  File \"<basthon-input-3-896a012de9a3>\", line 1, in <module>\n    plt.clf()\n    ^^^\nNameError: name 'plt' is not defined\n","name":"stderr"}]},{"metadata":{},"cell_type":"markdown","source":"## Chute avec frottements visqueux\n\nOn considère un objet de masse $m=100 \\,\\rm g$ se mouvant dans le champ de pesanteur d'intensité $g=9,81 \\,\\rm m.s^{-2}$. Il est soumis à une force de frottement opposée à son mouvement et d'intensité $f=-\\alpha \\,v^2$ où $v$ est sa vitesse instantanée et $\\alpha=0,010\\,\\rm kg.m^{-1}$ est le coefficient de frottement."},{"metadata":{"trusted":false},"cell_type":"code","source":"m = 0.1        # masse (en kg)\ng = 9.81       # intensité de la pesanteur (en m.s^{-2})\nalpha = 0.010  # coefficient de frottement (en kg.m^{-1})","execution_count":4,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"On lâche l'objet depuis un point $O$ sans vitesse initiale. La chute est verticale, le long d'un axe orienté de façon descendante par $\\vec e_z$.\n\nLa vitesse $\\vec v = v\\,\\vec e_z$ vérifie l'équation différentielle :\n\n$$\\dfrac{{\\rm d}v}{{\\rm d}t} = g-\\dfrac{\\alpha}{m} v^2$$ \n\nCalculer le temps caractéristique $\\tau=v_{\\rm lim}/a_0$ de la chute."},{"metadata":{"trusted":false},"cell_type":"code","source":"tau =          # a completer","execution_count":1,"outputs":[{"output_type":"stream","text":"  File \"<basthon-input-1-1bfb35c33bbe>\", line 1\n    tau =          # a completer\n                   ^^^^^^^^^^^^^\nSyntaxError: invalid syntax\n","name":"stderr"}]},{"metadata":{},"cell_type":"markdown","source":"Mettre en oeuvre l'algorithme d'Euler pour résoudre numériquement l'équation différentielle sur l'intervalle $[0 \\,; \\, 5\\tau]$. Le résultat sera obtenu sous forme de deux listes **t** et **v** contenant respectivement les instants $t_i$ et les vitesses $v_i$ successivement calculées."},{"metadata":{"trusted":false},"cell_type":"code","source":"\n","execution_count":81,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Affichage de la solution"},{"metadata":{"trusted":false},"cell_type":"code","source":"plt.clf()\nplt.xlabel(r'$t$ (s)')\nplt.ylabel(r'$v$ (m/s)')\nplt.plot(t,v,'r')\nplt.show()","execution_count":85,"outputs":[{"output_type":"display_data","data":{"application/javascript":"element.append(window._basthonDomNodeBus.pop(0));"},"metadata":{}}]},{"metadata":{"trusted":false},"cell_type":"markdown","source":"## Pendule simple\n\nSoit un pendule simple de longueur $L=1\\,\\rm m$ oscillant dans le champ de pesanteur. "},{"metadata":{"trusted":false},"cell_type":"code","source":"L = 1   # longueur du pendule (en m)","execution_count":5,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Calculer la période propre du pendule"},{"metadata":{"trusted":false},"cell_type":"code","source":"T0 =      # a completer","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"L'angle $\\theta$ du pendule par rapport à la verticale vérifie l'équation différentielle : $$\\dfrac{{\\rm d}^2 \\theta}{{\\rm d}t^2}=-\\dfrac{g}{L}\\sin(\\theta)$$\n\nElle peut s'écrire sous la forme de deux équations différentielles d'ordre 1 couplées, portant sur les variables $\\theta$ et $\\omega=\\dfrac{{\\rm d} \\theta}{{\\rm d}t}$ :\n$$\\begin{cases}\n\\dfrac{{\\rm d} \\theta}{{\\rm d}t} &= \\omega \\\\\n\\dfrac{{\\rm d} \\omega}{{\\rm d}t} &= -\\dfrac{g}{L} \\sin(\\theta)\n\\end{cases}\n$$\n\nEcrire une fonction **eulerpendule** mettre en oeuvre l'algorithme d'Euler dans ce cas. Elle prendra comme arguments le nombre $N$ d'itérations et l'angle initial $\\theta_0$ et renverra les listes **t** et **theta** contenant respectivement les instants $t_i$ et les angles $\\theta_i$ obtenus successivement. L'intervalle d'intégration sera pris égal à $[0;T_0]$. On pensera a fixer la valeur initiale de $\\omega$ à 0.\n\n*On peut utiliser la fonction sinus de la bibliothèque numpy (pour des angles en radian) : **np.sin()***"},{"metadata":{"trusted":false},"cell_type":"code","source":"def eulerpendule (N,theta0):\n    ","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Résolution pour $\\theta_0=0,1\\,\\rm rad$ et affichage des graphes de la solution numérique (rouge) et de la solution exacte (noir)."},{"metadata":{"trusted":false},"cell_type":"code","source":"t,theta=eulerpendule(N=100000,theta0=0.1)\nplt.clf()\nplt.plot(t,theta,'r')\nplt.plot(t,0.1*np.cos(np.sqrt(g/L)*t),'k')\nplt.xlabel(r'$t$ (s)')\nplt.ylabel(r'$\\theta$ (rad)')\nplt.show()","execution_count":13,"outputs":[{"output_type":"stream","text":"Traceback (most recent call last):\n  File \"<basthon-input-13-04370efa5589>\", line 1, in <module>\n    t,theta=eulerpendule(N=100000,theta0=0.01)\n            ^^^^^^^^^^^^\nNameError: name 'eulerpendule' is not defined\n","name":"stderr"}]},{"metadata":{},"cell_type":"markdown","source":"**Suite** : obtenir le graphe de la période en fonction de l'angle initial"},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"name":"python3","display_name":"Python 3","language":"python"}},"nbformat":4,"nbformat_minor":2}