| Hosted by CoCalc | Download
Kernel: SageMath (system-wide)

Équations de Lotka-Volterra

On définit la fonction f(t,y) de l'équation différentielle y'=f(t,y). Elle peut dépendre de paramètres (params) qu'on devra fixer avant de résoudre. Ici, les paramètres sont les constantes (a priori positives) qui déterminent le taux de mortalité etc. de chaque espèce.

def f(t,y,params): return[params[0]*y[0]-params[1]*y[0]*y[1], -params[2]*y[1]+params[3]*y[0]*y[1]]

On crée un "solveur", c'est-à-dire un objet qui sert à résoudre l'équation différentielle. Ici, on l'appelle U.

U=ode_solver()

On associe à ce solveur la fonction définie plus haut.

U.function=f

On lance le solveur pour une condition initiale y_0, un intervalle de temps t_span, des valeurs de paramètres params et un nombre de points dans l'intervalle où on veut la valeur approchée de la solution.

U.ode_solve(y_0=[1,1], t_span=[0,100], params=[0.66,1.33,1,1], num_points=1000)

À partir de maintenant, la solution approchée est stockée dans la variable U.solution. C'est en fait juste une liste de valeurs approchées de la solution, pour chaque valeur de t dans la subdivision de t_span en num_points points.

On peut demander de fabriquer des fonctions interpolées à partir de ces listes de valeurs, pour pouvoir ensuite demander la valeur de la solution approchée en tout point (pas seulement aux points de la subdivision).

u=U.interpolate_solution() v=U.interpolate_solution(i=1)

On crée une séquence de paires avec les deux coordonnées d'une solution, pour pouvoir la tracer.

seq=[(u(0.1*i),v(0.1*i)) for i in range(1000)]

On crée un objet graphique "mondessin" et on lui rajoute le traçage (plot) des points donnés, en les joignant.

mondessin=Graphics() mondessin+=list_plot(seq,plotjoined=True)

On demande l'affichage de l'objet graphique.

mondessin.show()
Image in a Jupyter notebook

On recommence avec d'autres valeurs.

U.ode_solve(y_0=[1,2], t_span=[0,100], params=[0.66,1.33,1,1], num_points=1000)
u=U.interpolate_solution() v=U.interpolate_solution(i=1)
seq=[(u(0.1*i),v(0.1*i)) for i in range(1000)]

On rajoute au même objet graphique la nouvelle courbe.

mondessin+=list_plot(seq,plotjoined=True)

On l'affiche à nouveau (avec les deux courbes, donc).

mondessin.show()
Image in a Jupyter notebook

On rajoute un point rouge (un petit cercle) sur la condition initiale.

mondessin += circle((1,1), 0.01,rgbcolor=(1,0,0))
mondessin.show()
Image in a Jupyter notebook

On crée un nouvel objet graphique "mondessin", puis on fait une boucle pour faire 20 résolutions avec des conditions initiales différentes entourées en rouge, et tout rajouter dans "mondessin".

mondessin=Graphics() for i in range(20): U.ode_solve(y_0=[1,1+0.05*i], t_span=[0,100], params=[0.66,1.33,1,1], num_points=1000) u=U.interpolate_solution() v=U.interpolate_solution(i=1) seq=[(u(0.1*j),v(0.1*j)) for j in range(1000)] mondessin+=list_plot(seq,plotjoined=True) mondessin+=circle((1,1+0.05*i),0.02,rgbcolor=(1,0,0)) mondessin.show()
Image in a Jupyter notebook

On sauve l'objet graphique dans un fichier pdf "lotka-volterra". On peut aussi utiliser l'extension .png, et le fichier sauvé sera alors automatiquement en png. On accède aux fichiers sauvegardés en cliquant sur "Files" en haut à gauche.

mondessin.save('lotka-volterra.pdf')