Résolution numérique d’équations différentielles : Différence entre versions
(→Résultats/précision) |
|||
Ligne 128 : | Ligne 128 : | ||
On remarque que la méthode de Runge-Kutta donne une approximation plus proche de la solution réelle dans ce cas. | On remarque que la méthode de Runge-Kutta donne une approximation plus proche de la solution réelle dans ce cas. | ||
+ | Pour ce problème, l'erreur maximum est inférieure à 1% pour un nombre de points de calcul égal à 35, alors qu'il en fallait 400 avec la méthode d'Euler pour avoir cette précision. | ||
− | + | {{DLMC|Informatique}} | |
− | |||
− | |||
[[Catégorie : Algorithmes et méthodes numériques ]] | [[Catégorie : Algorithmes et méthodes numériques ]] |
Version du 16 août 2019 à 02:58
Sommaire
Équations différentielle scalaires d’ordre 1
On étudie ici des équations différentielles d’ordre 1 qui s’écrivent sous la forme :
où est une fonction de deux variables et où l’on cherche la fonction x de la variable définie et dérivable sur un intervalle de vérifiant :
Afin d'obtenir une solution unique, nous allons adjoindre à cette équation différentielle une condition initiale sous la forme d’un couple et chercher à résoudre le problème de Cauchy suivant :
Sous certaines conditions sur f que nous ne détaillerons pas, ce problème admet une unique solution, que nous allons chercher à déterminer numériquement.
Méthode d'Euler
La méthode d'Euler repose sur l'utilisation de l'approximation affine de la fonction . La dérivée est approximée par où est le pas de calcul (suffisamment petit).
On peut donc écrire la relation de récurrence : .
L’algorithme de résolution utilisera donc les deux relations de récurrence suivantes :
que l'on peut illustrer par la représentation graphique suivante. La pente du segment entre les points et est évaluée par la pente de la fonction réelle à gauche, cad .
Exemple : chute libre
Considérons un objet de masse en chute libre verticale avec frottement fluide de coefficient .
Sa trajectoire est repérée dans un référentiel galiléen avec l'axe vers le bas.
Sa vitesse projetée sur l'axe respecte l'équation de la dynamique suivante:
(1)
Avec la condition initiale :
(2)
L'équation (1) devient :
Remarque : La solution exacte à ce problème est trivialement connue :
Pour la solution approchée, on obtient l’algorithme suivant :
Programmation python
On placera les valeurs dans un tableau nommé t
De même on placera les valeurs dans un tableau nommé v_euler
La boucle de calcul des approximations successives s'écrit :
1 for n in range (0, Nb_iterations):
2 t.append(t[n]+h) # ajout d'une valeur dans le tableau recevant les valeurs de temps
3 v.append(v_euler[n]+h*(g-v_euler[n]*_lambda/m)) # ajout d'une valeur dans le tableau recevant les vitesses
Résultats/précision
En exécutant cet algorithme et en faisant varier le nombre de points de calcul, on obtient les résultats suivants. La solution exacte est tracée en vert. Les tracés noirs sont les solutions approchées pour 5, 10, 20 et 50 points de calculs sur le même intervalle de temps :
On peut calculer les erreurs maximums de chaque approximation par rapport à la solution exacte :
Nb de points | Erreur maximum |
---|---|
5 | 100.4 % |
10 | 45.2 % |
20 | 21.3 % |
50 | 8.21 % |
100 | 4.05 % |
400 | 1.01 % |
Remarque : Pour ce problème, l'erreur maximum est inférieure à 1% pour un nombre de points de calculs supérieurs à 400.
Méthode de Rounge-Kutta
La méthode de Rounge-Kutta consiste à évaluer la pente du segment entre et , non pas à gauche mais au milieu du pas de calcul, ce qui est une meilleure approximation de la pente du segment :
Le terme obtenu par l'approximation : L’algorithme de résolution utilisera donc les deux relations de récurrence suivantes :
que l'on peut illustrer par la représentation graphique suivante. La pente du segment entre les points et est évaluée par la pente de la fonction réelle au milieu du pas de calcul.
Exemple : chute libre
Pour la chute libre, la méthode de Rounge Kutta donne l’algorithme suivant :
Programmation python
On placera les valeurs dans un tableau nommé t
De même on placera les valeurs dans un tableau nommé v_euler
La boucle de calcul des approximations successives s'écrit :
1 for n in range (0, Nb_iterations):
2 t.append(t[n]+h) # ajout d'une valeur dans le tableau recevant les valeurs de temps
3 v.append(v_RK[n]+h*(g-(_lambda/m)*(v_RK[n]+(h/2)*(g-_lambda/m*v_euler[n])))) # ajout d'une valeur dans le tableau recevant les vitesses
Résultats/précision
En comparant les solutions approchées issues des méthodes d'Euler et Rounge-Kutta pour 1 points de calculs sur l'intervalle de temps de 40s, on obtient :
On remarque que la méthode de Runge-Kutta donne une approximation plus proche de la solution réelle dans ce cas.
Pour ce problème, l'erreur maximum est inférieure à 1% pour un nombre de points de calcul égal à 35, alors qu'il en fallait 400 avec la méthode d'Euler pour avoir cette précision.
Autres pages de la catégorie "Informatique"
Pages relatives à l'informatique en CPGE scientifiques.
Bases du langage Python
- Codification des nombres
- Fonctions et portée des variables
- Instructions conditionnelles if, elif et else
- Instructions itératives : range, for, while
- Objets itérables : tuples, listes, tableaux
- Tableaux et matrices : module numpy
- Représentation graphique des données : matplotlib
Algorithmes et méthodes numériques