Rappels des chapitres "Dérivation" et "Equations différentielles"¶
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 !
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)$$
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
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 :
import numpy as np
import matplotlib.pyplot as plt
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 :
# 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.
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.
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)}$
a)$f(x)=\sqrt{x-\sqrt{x^2-1}}$ ; b) $f(x)=\arctan\sqrt{\cfrac{1-\cos(x)}{1+\cos(x)}}$
# 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$')
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.
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 :
# 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')
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).
$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}$.
$y'-2y+e^x=0$ sur $I=\mathbb{R}$, $y(0)=0$, graphe sur $[u,v]=[0,2]$ ;
$xy'-2y+x=0$ sur $I=\mathbb{R}_+^*$, $y(1)=2$, graphe sur $[u,v]=[1,4]$ ;
$(1-x^2)y'+2xy-4x=0$ sur $I=]1,+\infty[$, $y(2)=-1$, graphe sur $[u,v]=[2,5]$ ;
$y'-\cfrac{xy}{x^2-1}=x$ sur $I=]1,+\infty[$, $y(2)=2$, graphe sur $[u,v]=[2,10]$ ;
$xy'-y+\ln(x)=0$ sur $I=\mathbb{R}_+^*$, $y(1)=0$, graphe sur $[u,v]=[1,10]$ ;
$y'-y\tan(x)=\sin(2x)$ sur $I=]-\pi/2,\pi/2[$, $y(0)=1/3$, graphe sur $[u,v]=[0,1.5]$ ;
# 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')
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}$ (prendrea,b = 0.1,3
puisa,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 :
- $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$
- $y_0(x)=Ce^{2x}$ ; $y_p(x)=e^{x}$ [solution évidente]. Soit $y(x)=e^x-e^{2x}$ car $y(0)=0$
- $y_0(x)=Cx^2$ ; $y_p(x)=x$ [solution évidente]. Soit $y(x)=x^2+x$ car $y(1)=2$
- $y_0(x)=C(1-x^2)$, $y_p(x)=2$ [solution évidente]. Soit $y(x)=3-x^2$ car $y(2)=-1$
- $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$
- $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$
- $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}$