#!/usr/bin/env python # coding: utf-8 # Open In Colab # ># Rappels des chapitres "Dérivation" et "Equations différentielles" # #### *Remarque* : Ce notebook propose à la fois des rappels et des exercices. On prendra le temps d'y réfléchir, le crayon à la main, sur une feuille de brouillon avant de proposer une réponse. # Une correction des exercices est proposée en fin de document mais elle ne doit être utilisée qu'en dernier recours, si les calculs n'aboutissent pas... # **N'oubliez pas de sauvegarder ce notebook dans votre Drive** # # # > *Bonnes révisions !* # # # ## 1. Dérivation. # Soit $a\in I$ où $I$ est un intervalle de $\mathbb{R}$ et $f:I\rightarrow \mathbb{R}$ supposée de classe $\mathcal{C}^2$ sur $I$. Pour calculer une valeur approchée de la dérivée d'une fonction en $a$, une première approche consiste à utiliser la formule de Taylor Young à l'ordre 2 en supposant que la fonction est de classe $\mathcal{C}^2$ sur $I$. On a en effet : # $$f(a+h) \underset{a}{=} f(a)+f'(a)h+\cfrac{f''(a)}{2}h^2+o(h^2)$$ # En conséquence : # $$f'(a)=\underset{h\rightarrow 0}{lim}\left(\cfrac{f(a+h)-f(a)}{h}-\cfrac{f''(a)}{2}h+o(h)\right)=\underset{h\rightarrow 0}{lim}\left(\cfrac{f(a+h)-f(a)}{h}\right)$$ # Une méthode "naïve" pour évaluer la dérivée est donc de tabuler les valeurs de $\cfrac{f(a+h)-f(a)}{h}$ pour différentes valeurs de $h$. # On s'attend à ce que, plus la valeur de $h$ est proche de $0$, plus l'approximation de la dérivée soit précise. # Sous ces conditions, l'erreur $E(h)$ commise par cette approximation est dite "du premier ordre" : $$E(h)=\cfrac{f(a+h)-f(a)}{h}-f'(a)=\cfrac{f''(a)}{2}h+o(h)$$ # In[ ]: def deriv1(f,a,h): # On suppose f dérivable en a ; # h est le pas de discretisation, suffisamment petit. return (f(a+h)-f(a))/h # ### Application : # # Il est possible d'écrire une fonction Python `derive1(f,a,h)` qui retourne une valeur approchée de la dérivée de $f$ en $a$. # Il suffit de faire : # Introduisons les bibliothèques utiles aux calculs et aux représentations graphiques : # In[ ]: import numpy as np import matplotlib.pyplot as plt # ##### *Exemple* : Dériver la fonction $f_1:x\longmapsto x^3$ et représenter dans une même fenêtre le graphe de $f'_1$ et celui de son approximation, obtenue grâce à la fonction `deriv1` # > La première partie de la réponse est simple : $f'_1(x)=3x^2$, $\forall x\in\mathbb{R}$. # # > Pour les représentations graphiques, on exécutera la fenêtre ci-dessous : # In[ ]: # confrontation des graphes : f1 = lambda x:x**3 f1_prime = lambda x:3*x**2 # définition de la dérivée. X = np.linspace(-2,2,100) h = 1e-1 Yappr = [deriv1(f1,a,h) for a in X] # approximation numérique de la dérivée plt.plot(X,f1_prime(X),'r-',X,Yappr,'b-.') # Bon, ça a l'air de marcher ! Prendre $h=1e-2$ pour un résultat plus convaincant. # On peut désormais traiter sur le même principe l'exercice 1. # ### Exercice 1 : # Calculer et simplifier les dérivées des fonctions suivantes en précisant là où elles sont définies et compléter le script ci-dessous afin de tracer dans deux fenêtres contigües le graphe de $f$ et celui de sa dérivée, confronté à celui de son approximation numérique qui tiendra lieu de vérification de vos calculs de dérivée. # 1. a) $f(x)=\cfrac{x-1}{x+2}$ ; b) $f(x)=\cfrac{x}{x^2-1}$ ; c) $f(x)= x\sqrt{\cfrac{1-x}{1+x}}$ ; d) $f(x)=\cfrac{\sqrt{x^2+1}+x}{\sqrt{x^2+1}-x}+\cfrac{\sqrt{x^2+1}-x}{\sqrt{x^2+1}+x}$ ; e) $f(x)=\cfrac{\cos(x)}{\sin^3(x)}+\cfrac{2}{\tan(x)}$ # # 1. a)$f(x)=\sqrt{x-\sqrt{x^2-1}}$ ; b) $f(x)=\arctan\sqrt{\cfrac{1-\cos(x)}{1+\cos(x)}}$ # In[ ]: # Vérification graphique des dérivées : # Remarque : pour les fonctions mathématiques, on utilisera la bibliothèque 'numpy' (np.exp(), np.sqrt(), etc.) # et non pas la bibliothèque 'math'. f = lambda x:... # A compléter selon la fonction f étudiée f_prime = lambda x:... # dérivée de f à compléter a,b = ... , ... # indiquer les bornes de l'intervalle sur lequel le graphe est tracé. X= np.linspace(a,b,100) plt.figure(figsize=(15,4)) plt.subplot(1,2,1) plt.plot(X,f(X)) plt.title('Tracé de la fonction $f$') plt.subplot(1,2,2) h = 1e-2 Yappr = [deriv1(f,a,h) for a in X] # approximation numérique de la dérivée plt.plot(X,f_prime(X),'r-',X,Yappr,'b-.') plt.title('Tracés de la dérivée de $f$') # ## 2. Equations différentielles du premier ordre. # L'objectif est d'aborder d'un point de vue numérique les équations différentielles d'ordre $1$ de la forme $$y'+a(t)y=b(t)$$ # où $a$ et $b$ sont deux fonction continues sur une intervalle $I$ de $\mathbb{R}$ et pour laquelle une condition initiale $y(t_0)=y_0$ est connue. # On admettra que la solution au problème ainsi posé existe en tant que fonction définie sur $I$ et qu'elle est unique. # ** La méthode dite "Euler explicite" ** : Cette méthode repose sur l'idée simple utilisée précédemment que, puisque la solution cherchée est dérivable sur $I$, on peut approcher la dérivée de $y$ en tout réel $t$ de $I$ en écrivant : # $$y'(t)\underset{0}{\approx} \cfrac{y(t+h)-y(t)}{h}$$ # Cette approximation repose sur le fait que, $y$ étant dérivable sur $I$, elle admet un développement limité à l'ordre $1$ et que pour tout $t\in I$ : # $$y(t+h)=y(t)+h\cdot y'(t)+ o(h)$$ # # Dès lors : $$y(t+h)\cong y(t)+h\cdot y'(t)=y(t)+h\cdot(b(t)-a(t)y(t))$$ # ** Mise en oeuvre : ** En partant du point $(t_0,y_0)$, on considère que la courbe représentant $y$ peut être approchée par un segment de droite de pente $y'(t_0)$ sur l'intervalle de temps $[t_0,t_0+h]$, $h$ étant bien sûr petit. # On pose alors : # $$\begin{cases} t_1&=t_0+h\\y_1=y(t_1)&=y_0+h\cdot y'(t_0) \end{cases}$$ # Ensuite, en partant du point $(t_1,y_1)$, on suit la droite de pente $y'(t_1)$ sur l'intervalle de temps $[t_1,t_1+h]$. # # On construit ainsi une suite de points de façon récurrente en posant $\forall n\in\{0,\cdots,N\}$ : # $$\begin{cases} t_{n+1}&=t_n+h\\y_{n+1}&=y_n+h\cdot y'(t_n) \end{cases}$$ # avec $$y'(t_n)=b(t_n)-a(t_n)\cdot y(t_n)$$ # # La ligne brisée joignant les points $\{(t_n,y_n), 0\leq n\leq N\}$ donnera une solution approchée de l'équation différentielle. # # Pour construire une solution numérique d'une équation différentielle du premier ordre, il suffit donc de créer une subdivision de $I$, suite de points $(t_n)_{n\in\mathbb{N}}$ définie par $t_n=t_0+nh\in I$ et pour laquelle $h$ est un réel strictement positif qu'on pourra choisir aussi petit qu'on le souhaite. # La suite $(y(t_n))=(y_n)$ construite selon la récurrence ci-dessus, répond alors à la question cherchée... # **En pratique :** Posons $I=[u,v]$ intervalle sur lequel on cherche à obtenir une solution approchée de : # # $$y'+a(t)y=b(t), y(t_0)=y_0$$ # # Une écriture possible de la méthode d'Euler est la suivante : # - - - # def solApprochee(u,v,y0,h): # # tracé de la solution cherchée sur l'intervalle [u,v] # # y0 est la condition à l'origine et h est le pas de temps choisi. # N = int((v-u)/h) # nombre de pas ou nombre de points de la subdivision. # T,Y = np.zeros(N+1),np.zeros(N+1) # initialisation de la subdivision (t_n) et de la suite (y_n) # T[0] = u # temps initial # Y[0] = y0 # position initiale # for n in range(N): # N pas de 0 à N-1 # T[n+1] = T[n] + h # Y[n+1] = Y[n] + h*(b(T[n])-a(T[n])*Y[n]) # return T,Y # **Exemple :** On considère l'équation différentielle ($E$) : $y'+3y=0$ et $y(0)=2$.\\ # Pour confronter la solution approchée à la fonction $f$, solution de cette équation différentielle, on commence par résoudre cette équation différentielle sur $\mathbb{R}_+$ : # D'après le cours : $$\exists C\in\mathbb{R}/y(t)=Ce^{-3t}$$ # et $y(0)=C=2$ donc la solution cherchée est : $$y(t)=2e^{-3t}$$ # # Pour une solution approchée grâce à la méthode d'Euler, on exécutera les instructions ci-dessous. # # Il suffira alors de tracer sur une même fenêtre la solution approchée et la solution exacte. # In[ ]: def solApprochee1(u,v,y0,h): # y'+3y = 0 ; ici a(t) = 3 et b(t) = 0 # tracé de la solution cherchée sur l'intervalle [u,v] # y0 est la condition à l'origine et h est le pas de temps choisi. N = int((v-u)/h) # nombre de pas ou nombre de points de la subdivision. T,Y = np.zeros(N+1),np.zeros(N+1) # initialisation de la subdivision (t_n) et de la suite (y_n) T[0] = u # temps initial Y[0] = y0 # position initiale a,b = 3,0 for n in range(N): # N pas de 1 à N T[n+1] = T[n]+h Y[n+1] = Y[n] + h*(b-a*Y[n]) return T,Y h = 0.1 T,Y = solApprochee1(0,3,2,h) # solution approchée sur I=[0,3] f = lambda t:2*np.exp(-3*t) # solution exacte plt.figure(figsize=(10,5)) plt.plot(T,f(T),'r-',label= 'solution exacte') plt.plot(T,Y,'b-.',label='solution approchée') plt.legend(loc='best') # Voilà qui semble relativement convaincant. Essayez avec `h = 0.01` pour vérifier que la solution approchée est meilleure. # ** Simplification possible : ** En considérant que la dérivée dépend à la fois du temps et de la position occupée, on peut donner une forme simplifiée à la fonction précédente si on introduit une fonction $g$ définie par : # $$g(t,y)=b(t)-a(t)\cdot y$$ car alors : # $$y'(t)=g(t,y(t))=b(t)-a(t)\cdot y(t)$$ # et dans ce cas la relation de récurrence devient : # $$ \begin{cases} t_n &= t_{n-1}+h\\ y_n&= y_{n-1}+h\cdot g(t_{n-1},y_{n-1}) \end{cases} $$ # **APPLICATION : ** Résolution de $y'+3y=t$, $y(0)=2$. # > On notera que les solutions homogènes sont toujours de la forme $y_0(t)=Ce^{-3t}$ et qu'une solution particulière est de la forme $y_p(t)=a_1t+a_0$, ce qui donne par identification : $y_1(t) = \cfrac{1}{3}(t-\cfrac{1}{3})$ # # > soit $$y(t)=\cfrac{10}{9}e^{-3t}+\cfrac{1}{3}(t-\cfrac{1}{3})$$ en tenant compte du fait que $y(0)=1$. # # > Pour la résolution numérique, on écrit : $y'(t)=t-3y(t)$ et donc $y'(t)=g(t,y(t))$ où on a posé : $$g(t,y)=t-3y$$ # # > La fonction précédente devient : # In[ ]: # Solution exacte : f = lambda t:(10/9)*np.exp(-3*t)+(1/3)*(t-1/3) # fonction auxiliaire : g = lambda t,y:t-3*y def solApprochee2(g,u,v,y0,h): # y'+3y = t ; ici a(t) = 3 et b(t) = t et donc y'(t)=t-3y(t) # tracé de la solution cherchée sur l'intervalle [u,v] # y0 est la condition à l'origine et h est le pas de temps choisi. N = int((v-u)/h) # nombre de pas ou nombre de points de la subdivision. T,Y = np.zeros(N+1),np.zeros(N+1) # initialisation de la subdivision (t_n) et de la suite (y_n) T[0] = u # temps initial Y[0] = y0 # position initiale for n in range(N): # N pas de 1 à N T[n+1] = T[n]+h Y[n+1] = Y[n] + h*g(T[n],Y[n]) return T,Y h = 1e-2 T,Y = solApprochee2(g,0,2,1,h) # solution approchée sur I=[0,2] plt.figure(figsize=(10,5)) plt.plot(T,f(T),'r-',label= 'solution exacte') plt.plot(T,Y,'b-.',label='solution approchée') plt.legend(loc='best') # ### Exercice 2 : # Résoudre les équations différentielles suivantes sur l'intervalle $I$ indiqué et les confronter sur l'intervalle $[u,v]$ à la solution obtenue par approximation numérique en complétant la ligne de code ci-dessous qui utilise la fonction `solApprochee2()` mise en place précédemment (*Note :* Penser à exécuter au moins une fois cette fonction avant de traiter l'exercice). # 1. $y'+y=\cos(t)$ sur $I=\mathbb{R}$, $y(0)=1$, graphe sur $[u,v]=[0,10]$ ; # *Note :* On pourra chercher une solution particulière sous la forme $y_p(x)=A\cos(x)+B\sin(x)$ où $A,B\in\mathbb{R}$. # # 2. $y'-2y+e^x=0$ sur $I=\mathbb{R}$, $y(0)=0$, graphe sur $[u,v]=[0,2]$ ; # 3. $xy'-2y+x=0$ sur $I=\mathbb{R}_+^*$, $y(1)=2$, graphe sur $[u,v]=[1,4]$ ; # 4. $(1-x^2)y'+2xy-4x=0$ sur $I=]1,+\infty[$, $y(2)=-1$, graphe sur $[u,v]=[2,5]$ ; # 5. $y'-\cfrac{xy}{x^2-1}=x$ sur $I=]1,+\infty[$, $y(2)=2$, graphe sur $[u,v]=[2,10]$ ; # 6. $xy'-y+\ln(x)=0$ sur $I=\mathbb{R}_+^*$, $y(1)=0$, graphe sur $[u,v]=[1,10]$ ; # 7. $y'-y\tan(x)=\sin(2x)$ sur $I=]-\pi/2,\pi/2[$, $y(0)=1/3$, graphe sur $[u,v]=[0,1.5]$ ; # In[ ]: # Solution exacte : f = lambda t:...# A compléter # fonction auxiliaire : g = lambda t,y:... # A compléter (par exemple pour 1. on posera g = lambda t,y:np.cos(t)-y ) h = 1e-2 u,v = ... ,... # A compléter y0 = ... # A compléter T,Y = solApprochee2(g,u,v,y0,h) # solution approchée sur I=[0,2] plt.figure(figsize=(10,5)) plt.plot(T,f(T),'r-',label= 'solution exacte') plt.plot(T,Y,'b-.',label='solution approchée') plt.legend(loc='best') # ## 3. Solutions des exercices. # **Correction exercice 1 :** # > 1.a) $\mathcal{D}_{f'}=\mathbb{R}\setminus\{-2\}$, $f'(x)=3/(x+2)^2$, on pourra prendre : `a,b = -1.9 , 2` # > 1.b) $\mathcal{D}_{f'}=\mathbb{R}\setminus\{-1,1\}$, $f'(x)=-\cfrac{x^2+1}{(x^2-1)^2}$, on pourra prendre : `a,b = -0.9 , 0.9` # > 1.c) $\mathcal{D}_{f'}=]-1,1[$, $f'(x)=\cfrac{1-x-x^2}{(1+x)\sqrt{1-x^2}}$, on pourra prendre : `a,b = -0.9 , 0.9` # > 1.d) $\mathcal{D}_{f'}=\mathbb{R}$, $f(x)=4x^2+2$ et donc $f'(x)=8x$, on pourra prendre : `a,b = -1 , 1` # > 1.e) $\mathcal{D}_{f'}=\mathbb{R}\setminus\{k\pi,k\in\mathbb{Z}\}$, $f'(x)=-\cfrac{3}{\sin^4(x)}$, on pourra prendre : `a,b = 0.1 , 3` # > 2.a) $\mathcal{D}_{f'}=]-\infty,-1[\cup]1,+\infty[$, $f'(x)=-\cfrac{\sqrt{x-\sqrt{x^2-1}}}{2\sqrt{x^2-1}}$, on pourra prendre : `a,b = 1.1 , 3` # > 2.b) $\mathcal{D}_{f'}=\mathbb{R}\setminus\{k\pi,k\in\mathbb{Z}\}$. Sur $]-\pi,\pi[\setminus\{0\}$ : $f'(x)=\begin{cases}1/2&\text{ si }x\in]0,\pi[\\ -1/2&\text{ si}x\in]-\pi,0[\end{cases}$ (prendre `a,b = 0.1,3` puis `a,b = -3,-0.1`) # *Remarque :* Pour le tracé d'une fonction constante égale à `c` il faut écrire : `f = lambda x:c*x**0` # **Correction exercice 2 :** # > 1. $y_0(t)=Ce^{-t}$ ; $y_p(t)=\cfrac{\cos(t)+\sin(t)}{2}$ soit $y(t)=\cfrac{\cos(t)+\sin(t)+e^{-t}}{2}$ car $y(0)=1$ # > 2. $y_0(x)=Ce^{2x}$ ; $y_p(x)=e^{x}$ [solution évidente]. Soit $y(x)=e^x-e^{2x}$ car $y(0)=0$ # > 3. $y_0(x)=Cx^2$ ; $y_p(x)=x$ [solution évidente]. Soit $y(x)=x^2+x$ car $y(1)=2$ # > 4. $y_0(x)=C(1-x^2)$, $y_p(x)=2$ [solution évidente]. Soit $y(x)=3-x^2$ car $y(2)=-1$ # > 5. $y_0(x)=C\sqrt{x^2-1}$, $y_p(x)=x^2-1$ [solution évidente]. Soit $y(x)=x^2-1-\cfrac{\sqrt{3(x^2-1)}}{3}$ car $y(2)=2$ # > 6. $y_0(x)=Cx$ et $y_p(x)=\ln(x)+1$ [Variation de la constante]. Soit $y(x)=\ln(x)+1-x$ car $y(1)=0$ # > 7. $y_0(x)=\cfrac{C}{\cos(x)}$ et $y_p(x)=-\cfrac{2}{3}\cos^2(x)$ [Variation de la constante]. Soit $y(x)=\cfrac{1}{\cos(x)}-\cfrac{2}{3}\cos^2(x)$ car $y(0)=\cfrac{1}{3}$ # In[ ]: