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
© Copyright 2024 ExpyDoc