Quelques notebooks SAGE / Python. Équations différentielles ou calcul multivariable.
Image: ubuntu2004
Laboratoire 2 : les équations différentielles d'ordre 2
GCH-MAT217, Automne 2020, V.Charette
L'objectif de ce laboratoire est de regarder un peu comment résoudre des équations différentielles d'ordre 2 avec python.
On a deux grandes catégories d'outils : les outils symboliques, nous permettant de trouver des solutions de type "analytique", et les outils numériques, lorsque les solutions analytiques n'existent pas ou sont au-delà des méthodes habituelles de résolution d'EDOs.
Commençons par les outils symboliques. Plus précisément, nous allons regarder un peu ce qu'on peut faire avec la bibliothèque sympy.
A. Résolution symbolique
Lorsqu'on travaille avec sympy, il faut déclarer les symboles qu'on va utiliser.
J'ai inclus ici quelques commandes, pour montrer un peu comment se comportent les symboles.
Nous avons déjà vu la commande dsolve pour résoudre une équation différentielle d'ordre 1. Ici "y(x).diff(x)" signifie qu'on prend la dérivée une fois par rapport à x. (C'est une syntaxe de type "orienté-objet".)
Remarquez la structure : dsolve(expr, f(x)). Ici, "expr" signifie "expr=0".
Alternativement, on pourrait fournir à dsolve une équation à résoudre. Il faut alors utiliser Eq.
On peut aussi mettre des conditions initiales. (Je ne suis pas certaine que ça marche dans toutes les situations, par contre, par exemple si l'équation à résoudre admet une solution compliquée.)
On peut aussi s'en servir pour les équations d'ordre 2. Pour prendre la dérivée seconde, la syntaxe est :
Par exemple, résolvons :
Ici aussi, on peut mettre des conditions initiales.
Exercice 1. Utilisez dsolve pour résoudre les équations différentielles suivantes :
a) , ,
b) , ,
c)
(Remarque : pour c), sympy va tenter de donner une solution sous forme de série.)
Si on veut tracer le graphe du résultat, sympy a une fonction plot.
Exercice 2. Tracez les graphes de chacune des solutions de l'exercice 1a) et 1b).
B. Résolution numérique
Quand trouver une solution analytique est au-delà de nos forces -- à nous et à sympy -- on doit recourir à une solution numérique.
À la base, les solveurs numériques travaillent avec un système de la forme suivante : Autrement dit, une équation différentielle du premier ordre avec condition initiale. Grosso modo, le solveur numérique va "suivre la direction tangente", direction donnée par , sur de petits intervalles de : de on se rend à la position en suivant la direction tangente, on reprend avec la direction tangente pour se déplacer de à , etc.
(Une des difficultés est de décider de la longueur des intervalles de , pour obtenir une solution suffisamment proche de la bonne solution, qui est inconnue.)
Nous on va aussi vouloir tracer le graphe de la solution numérique. Donc on importe les bibliothèques numpy et pyplot. On va aussi importer la commande pour résoudre numériquement un ED à condition initiale.
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-23-bfd7aa83dc6d> in <module>
2 del x
3 del y
----> 4 del z
NameError: name 'z' is not defined
Afin d'apprivoiser la syntaxe, considérons l'exemple suivant.
la syntaxe pour solve_ivp est : solve_ivp(f(t,y),[t0,tf],[y0]) où :
1- f(t,y) est une fonction "appelable" : par exemple, f peut être une fonction définie par un module ("def")
2- t0 est la valeur initiale de la variable indépendante t
3- tf est la valeur de t où l'on souhaite estimer la valeur de y(tf)
4- y0=y(t0)
La valeur retournée sol contient plusieurs éléments : sol.t retourne les valeurs où la fonction a été approximée et sol.y retourne les valeurs à ces points.
Alternative : solve_ivp(f(t,y),[t0,tf],[y0],dense_output=True) Le dernier argument est optionnel, mais deviendra nécessaire plus loin.
Remarquez que sol.y est en fait une matrice, ayant autant de rangées que la dimension du système à résoudre. Dans le cas d'une seule ED, il y a une seule rangée mais c'est pour cette raison qu'on prend sol.y[0] plutôt que sol.y dans les entrées pour plt.plot.
Si vous trouvez comme moi que ça manque de points, on peut spécifier à quels points de l'intervalle [t0,tf] on doit évaluer.
Quoi? solve_ivp prend des systèmes? ben oui...
Pour nous, l'application qu'on en fera aujourd'hui c'est pour traiter une équation du second ordre : On va transformer cette équation du deuxième ordre en système de DEUX équations du PREMIER ordre.
Pour ce faire, on va remplacer par une nouvelle variable, . Alors et notre équation devient :
Considérons par exemple ceci, vu plus haut :
Cette équation devient :
On va s'inspirer de l'exemple "Lotka-Volterra" pour deviner la syntaxe...
Notez que ce qui nous intéresse principalement, c'est le graphe de et non celui de sa dérivée...
Exercice 3. Résolvez numériquement les équations différentielles suivantes. Tracez la solution sur l'intervalle indiqué.
a) , , ,
b) , , ,
c) , , ,