| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente |
| nsi:tds:maths:methode_euler [2022/10/03 09:57] – goupillwiki | nsi:tds:maths:methode_euler [2023/04/03 10:12] (Version actuelle) – goupillwiki |
|---|
| * En physique, la variable est souvent le temps $t$. | * En physique, la variable est souvent le temps $t$. |
| * En général, au lieu de $f(t)$, on écrit $y$. | * En général, au lieu de $f(t)$, on écrit $y$. |
| * Une dérivée représente un taux d'accroissement : à un instant $t$ donné, la fonction vaut $f(t)$. Si on laisse passer un instant très court $dt$ (notation de physicien) le temps devient $t + dt$ et la fonction $f(t + t)$. On notera $df = f(t + dt) - f(t)$, la variation de $f$. L'idée de la dérivation est de considérer que, quand $df$ très petit, $df$ tend à être proportionnel à $dt$. On note $f'(t) = \dfrac{df}{dt}$ ce facteur de proportionnalité, le taux d'accroissement. | * Une dérivée représente un taux d'accroissement : à un instant $t$ donné, la fonction vaut $f(t)$. Si on laisse passer un instant très court $dt$ (notation de physicien) le temps devient $t + dt$ et la fonction $f(t + dt)$. On notera $df = f(t + dt) - f(t)$, la variation de $f$. L'idée de la dérivation est de considérer que, quand $dt$ très petit, $df$ tend à être proportionnel à $dt$. On note $f'(t) = \dfrac{df}{dt}$ ce facteur de proportionnalité, le taux d'accroissement. |
| * L'équation différentielle est complétée par une condition initiale, ici $f(0) = 0$. En effet, l'équation a une infinité de solutions. Physiquement, chaque solution correspond à une trajectoire possible, une trajectoire permise par les lois de la physique. Mais dans le cadre d'une expérience particulière, une trajectoire a été choisie. La condition initiale permet de sélectionner cette trajectoire. | * L'équation différentielle est complétée par une condition initiale, ici $f(0) = 0$. En effet, l'équation a une infinité de solutions. Physiquement, chaque solution correspond à une trajectoire possible, une trajectoire permise par les lois de la physique. Mais dans le cadre d'une expérience particulière, une trajectoire a été choisie. La condition initiale permet de sélectionner cette trajectoire. |
| |
| |
| <code python> | <code python> |
| | # 2e exemple |
| from math import sin | from math import sin |
| def exemple(y, t, dt): | def exemple(y, t, dt): |
| </code> | </code> |
| |
| le calcul serait différent mais la signature de la fonction ''exemple(y, t, dt)'' serait la même. C'est important si on veut que la suite du programme soit indépendant de l'équation différentielle envisagée. | le calcul serait différent mais la signature de la fonction ''exemple(y, t, dt)'' serait la même. C'est important si on veut que la suite du programme soit indépendant de l'équation différentielle envisagée. On veut donc une fonction $y, t, dt \mapsto dy$. |
| |
| <WRAP todo> | ==== Corps du calcul ==== |
| Pas fini | |
| </WRAP> | |
| |
| | On va écrire une fonction ''euler'' qui fait la résolution. En entrée de la fonction, on donne : |
| | * la fonction décrivant l'équation différentielle (''exemple'') qui doit être de forme $y, t, dt \mapsto dy$ |
| | * la condition initiale ''y0'' représentant la valeur $y(0)$ |
| | * ''T'', le temps total que l'on veut simuler (dans l'exemple, ''T = 20'') |
| | * ''N'', le nombre de pas que l'on veut calculer (dans l'exemple, ''N = 200'') |
| |
| | En sortie la fonction doit renvoyer : |
| | * un tableau contenant tous les instants $t$. Dans l'exemple : ''%%[0, 0.1, 0.2, ..., 20]%%'' |
| | * un tableau contenant les valeurs correspondantes de $y(t)$. Dans l'exemple ''%%[0, 0.2, 0.396, ...]%%'' |
| |
| | La fonction suit l'algorithme suivant (en pseudo-code) |
| | <code lang-none> |
| | DÉBUT |
| | calcul de dt connaissant T et N |
| | soit ts = [0] le tableau des temps |
| | soit ys = [y0] le tableau des y |
| | RÉPÉTER N FOIS: |
| | t précédent est dernier temps de ts |
| | y précédent est dernier y de ys |
| | t actuel est t précédent + dt |
| | calcul de dy en utilisant y précédent, t précédent, dt |
| | y actuel est y précédent + dy |
| | ajouter t actuel aux ts |
| | ajouter y actuel aux ys |
| | FIN RÉPÉTER |
| | RENVOYER ts et ys |
| | FIN |
| | </code> |
| |
| | ===== Tracer ===== |
| |
| | On peut utiliser ''matplotlib'' pour faire le tracer. Puisque ''euler'' nous fournit le tableau des temps et des y, c'est très rapide : |
| |
| | <code python> |
| | import matplotlib.pyplot as plt |
| |
| | def exemple(y, t, dt): |
| | return 1/5*(10-y)*dt |
| | |
| | |
| | def euler(equation, y0, T, N): |
| | ''' |
| | equation: fonction y, t, dt -> dy |
| | y0: valeur de y(0) |
| | T: durée de simulation |
| | N: nombre d'échantillons |
| | ''' |
| | # ... votre travail |
| | |
| | ts, ys = euler(exemple, 0, 20, 200) # y0 = 0, T = 20, N = 200 |
| | plt.plot(ts, ys) |
| | plt.show() |
| | </code> |
| |
| | Il est possible d'améliorer l'affichage de la courbe mais c'est un autre travail... |
| |