@c jean-baptiste.apoung@math.u-psud.fr
%matplotlib inline
%config InlineBackend.figure_format = 'retina'
import numpy as np
from scipy.integrate import quad
import matplotlib.pyplot as plt
%%javascript
MathJax.Hub.Config({
TeX: { equationNumbers: { autoNumber: "AMS" } }
});
On considère l'équation différentielle ordinaire (edo) suivante où $a > 0$, $ \left \{ \begin{array}{l} x'(t) = - a \, x(t), \, ~ t ~ \in ~ ]0, \infty[,\\ x(0) = x^0 \end{array} \right. $
Q-1: Montrer sa solution exacte est $ x(t) = x^0 e^{- a t}$ et quelle vérifie $\displaystyle \lim_{t \rightarrow \infty} x(t) = 0 $.
Q-2 : Ecrire un schéma à un pas de votre choix pour la discrétisation de cette edo sur un maillage de pas $\Delta t$.
Q-3 : Etudier la convergence du schéma en précisant son ordre exacte de convergence. (On pourra le mettre sous la forme $x_{n+1} = x_n + \Delta t\, \Phi(t_n, x_n, \Delta t)$).
Q-4 : Mettre le schéma sous la forme $ x_{n+1} = r(a, \Delta t)\, x_n $. Et déduire son rayon de stabilité asymptotique: c'est-à-dire la plus grande valeur de $\Delta t $ assurant la propriété $\displaystyle \lim_{n\rightarrow \infty} x_n = 0$.
Soit $f : \mathbb{R} \rightarrow \mathbb{R}$ de classe $C^1$ dont on aimerait approcher une racine en partant d'un point $x^0$.
On pose g(t, x) la fonction définie sur $\mathbb{R}^+ \times \mathbb{R}$ par : $$ g(t, x) = f(x) - e^{-t} f(x^0) $$
$g(0, x^0) = 0$ et que pour tout $~x\, \in \, \mathbb{R}$, on a $\displaystyle \lim_{t\rightarrow \infty} g(t, x) = f(x)$.
On se donne un pas de temps $\Delta t > 0$ et on désigne par $x_n$ la valeur approchée de $x(t_n)$ pour $t_n = n \Delta t, n \in \mathbb{N}$.
l'équation différentielle étant posée sur un domaine infini, en s'insiprant du test d'arrêt (à savoir $| f(x_k) | < \varepsilon $) dans la méthode de Newton, indiquer comment modifier le schéma d'Euleur explicite ci-dessus afin d'arrêter les calculs.
On suppose (Eq) réécite sous la forme standard $x'(t) = F(t, x(t))$.
Et on désigne par StepEuler
la fonction implémentant un pas du schéma d'Euler explicite.
A savoir $x_{n+1} = x_n + \Delta t \, F(t_n, x_n)$ est plutôt écrite $x_{n+1} = StepEuler(t_n, x_n, \Delta t, F)$
afin de permettre une généralisation à d'autre schémas.
#######################################################################
Approximation du zero de f par resolution de l' edo
x' = F(t, x(t)) où F(t,y) = -f(y)/f'(y)
#######################################################################
Entree: F, t0, x0, dt, f, tol, iterMax
Sortie: x : valeur approchée de la racine de f
t : valeur du temps au bout duquel on a pu approcher la solution
k : nombre d'itérations nécessaires pour ptoduire
Initialisation:
--------------
k = 0
t = t0
x = x0
Itérations :
------------
Tant que |f(x)| > tol et k < iterMax
x = StepEuler (t, x, dt, F )
t = t + dt
k = k + 1
retourner x, t, k
#######################################################################
Mettre en oeuvre l'algorithme Q-5-2 ci-dessus à travers une fonction de prototype
def EDOSolveControle(StepMethod, F, t0, x0, dt, g, tol = 1e-6, maxIter = 500):
'''
ENTREES :
- StepMethod : est une méthode à un pas par exemple StepEuler, StepHeun, StepPM
StepMethod(tn, xn, dt, F) calcule x_n+1
- F : est le second membre de de l'edo
- t0 : l'instant initial
- x0 : valeur initiale
- dt : le pas de temps
- g : la fonction de controle : on approche la racine de g
- tol : paramètre du test d'arret i.e on arrête les calculs dès que |g(x)| < tol
- maxIter : est le nombre maximum d'itérations autorisées
SORTIES :
- x : valeur approchée de la racine de g
- t : l'instant final auquel correspond la solution x
- k : le nombre d'itérations réalisées
'''
# COMPLETER
On va essayer d'approcher la racine de l'équation $f(x) = 4 x^3 + 3 x^2 - 1$ sur $[-1, 1]$
Fournir les $f, f'$ et $F$ respectivement à travers les fonctions Python : f, fp et F(t, x)
Et représenter graphiquement $f$ sur $[-1,1]$ et vérifier qu'elle y admet une racine
## METTRE LA REPONSE ICI
## definition des fonctions
## représentation grapique
StepEuler, StepHeun, StepPM
¶implémentant un pas respectivement des schémas d'Euler explicite, de Heun, et du point-milieu.
## METTRE LE CODE ICI
def StepEuler(t,x,dt,f):
#COMPLETER
def StepPM(t,x,dt,f):
#COMPLETER
def StepHeun(t,x,dt,f):
#COMPLETER
Aide : On pourra par exemple afficher les valeurs
x,t,k
retournées parEDOControl
pour la méthode d'Euler explicite et un cas test avec l'instructionprint(fmt.format("Euler", dt, x0, x, t, k, f(x))),
le formattagefmt
étant donné ci-dessous.
fmt = "{:5s} : dt = {:2.2f}, x0 ={:2.2f} -> x = {:13.11e} t = {:5.3e} k = {:3d} f(x) = {:e}"
Cas : $t_0 = 0, \, x_0 = 1.0, \, \Delta t = 1$
#### METTRE LA REPONSE ICI
t0, x0, dt = 0, 1.0, 1.
#### METTRE LES OBSERVATIONS ICI
Cas : $t_0 = 0, \, x_0 = -1.0, \, \Delta t = 1$
#### METTRE LA REPONSE ICI
t0, x0, dt = 0, -1., 1.
#### METTRE LES OBSERVATIONS ICI
Cas : $t_0 = 0, \, x_0 = 0.25, \, \Delta t = 2$
#### METTRE LA REPONSE ICI
t0, x0, dt = 0, 0.25, 2.
#### METTRE LES OBSERVATIONS ICI