08-Freins VW 2015 03fixe

Volterra-Lotka et clics de souris
Ce document présente un exemple d'utilisation de Python et de ses bibliothèques scientifiques à
l'usage du professeur de Mathématiques.
Le système proie-prédateur est ici modélisé classiquement par le système de Volterra-Lotka :
x ' =x (a −by) et y ' = y (dx−c).
On rappelle que la fonction scipy.integrate.odeint résout une équation différentielle
d'ordre 1 qui s'écrit X’ = f(X,t) où X peut être vectoriel. On utilisera ici une liste xy pour
représenter le vecteur (x,y). On écrit ainsi la condition initiale et la fonction de la façon suivante :
a, b, c, d = 3.0, 1.0, 2.0, 1.0
x0y0 = [1,2]
def volterraLotka(xy,t):
return([xy[0]*(a-b*xy[1]), xy[1]*(d*xy[0]-c)])
L'idée présentée ici consiste à tracer cette première courbe intégrale, à titre d'exemple, et de laisser
l'utilisateur cliquer où bon lui semble pour fixer une nouvelle condition initiale et demander le tracé
de la courbe intégrale correspondante.
Pour terminer, il suffira de cliquer à l'extérieur du dessin. Voici comment faire :
import matplotlib.pyplot as plt
import numpy as np
from scipy.integrate import odeint
fig = plt.figure()
def onclick(event):
if event.xdata==None:
# clic en dehors de la zone de tracé
fig.canvas.mpl_disconnect(cid) # on ne suit plus les clics
else:
x0y0 = [ event.xdata, event.ydata ]
xy = odeint(volterraLotka,x0y0,t)
plt.plot(xy[:,0],xy[:,1])
plt.draw()
a, b, c, d = 3.0, 1.0, 2.0, 1.0
x0y0 = [1,2]
def volterraLotka(xy,t):
return([xy[0]*(a-b*xy[1]), xy[1]*(d*xy[0]-c)])
Distribué sous la licence CC BY-SA 3.0 FR
http://creativecommons.org/licenses/by-sa/3.0/fr/
Volterra-Lotka et clics de souris
1/3
t = np.linspace(0,6,2000)
xy = odeint(volterraLotka,x0y0,t) # première courbe
plt.grid()
plt.axis([0,6,0,6])
plt.plot(xy[:,0],xy[:,1],'b')
# en bleu
# surveillance des clics de souris
cid = fig.canvas.mpl_connect('button_press_event', onclick)
plt.show()
La fonction fig.canva.mpl_connect relie tout événement du type clic de souris (en anglais
button_press_event) à une exécution de la fonction onclick que le programmeur est libre de
définir à son idée.
Ici, la fonction onclick teste si les coordonnées du pointeur de souris ont du sens (non égales à
None), et les récupère comme nouvelle condition initiale, avant de calculer la nouvelle courbe
intégrale.
Deux remarques : on utilise plt.draw() et non plt.show() pour ajouter une courbe dans une
figure déjà tracée ; les coordonnées liées à l'événement sont données dans le repère utilisateur, et
non en pixels (qu'on pourrait retrouver en demandant event.x et event.y).
La première courbe tracée est en bleu marine, les suivantes répondent à un clic de souris.
Distribué sous la licence CC BY-SA 3.0 FR
http://creativecommons.org/licenses/by-sa/3.0/fr/
Volterra-Lotka et clics de souris
2/3
Mises à jour
Ce document est mis à jour régulièrement. La dernière version est disponible à cette adresse, où on
trouvera également d'autres documents utiles : http://goo.gl/AVV5t
Auteurs
Laurent Chéno, [email protected]
Licence d'utilisation de ce document
CC BY-SA 3.0 FR http://creativecommons.org/licenses/by-sa/3.0/fr/
Distribué sous la licence CC BY-SA 3.0 FR
http://creativecommons.org/licenses/by-sa/3.0/fr/
Volterra-Lotka et clics de souris
3/3