Simulation d’un système de Lotka-Volterra avec diffusion

a marqué ce sujet comme résolu.
Auteur du sujet

Salut à tous,

Dans le cadre de mon futur TIPE de MP, je m’intéresse aux phénomènes de diffusions et des effets qu’ils peuvent avoir. Suite à une conférence, j’ai voulu commencer par le système de Lotka-Volterra. J’ai déjà réussi à le simuler parfaitement, mais sans diffusion. Maintenant, je cherche à modéliser ces équations

$$ \left\{ \begin{aligned} \frac{\partial u}{\partial t} &= au - buv + D\frac{\partial^2 u}{\partial x} \\ \frac{\partial v}{\partial t} &= duv - cv + D\frac{\partial^2 v}{\partial x} \end{aligned} \right. \quad \text{avec} \quad (a, b, c, d, D) \in \mathbf R^5 \quad \text{et} \quad u, v \colon \mathbf R_+ \times [0, L] \to \mathbf R. $$ Pour cela, j’ai essayé d’appliquer la méthode d’Euler en temps discret $(t_i)$ et en espace $(x_i)$ et j’obtiens ces équations $$ \left\{ \begin{aligned} u(t_{i + 1}, x_j) &= \left[au(t_i, x_j) - bu(t_i, x_j)v(t_i, x_j) + D\frac{u(t_i, x_{j + 2}) - 2u(t_i, x_{j + 1}) + u(t_i, x_j)}{(\Delta x)^2}\right]\Delta t + u(t_i, x_j) \\ v(t_{i + 1}, x_j) &= \left[du(t_i, x_j)v(t_i, x_j) - cv(t_i, x_j) + D\frac{v(t_i, x_{j + 2}) - 2v(t_i, x_{j + 1}) + v(t_i, x_j)}{(\Delta x)^2}\right]\Delta t + v(t_i, x_j) \end{aligned} \right.. $$

$\Delta t$ et $\Delta x$ sont respectivement les pas de temps et d’espace. Cependant, le résultat que je trouve en faisait tourner ces équations avec Python n’est pas du tout satisfaisant (si je compare avec ceux de la conf). D’où mes questions.

  • Est-ce que une simple méthode d’Euler est possible ici ?
  • Est-ce qu’il y a de bonnes valeurs pour $a$, $b$, $c$, $d$ et $D$ et de bonnes conditions initiales pour que la simulation fonctionne ? J’ai remarqué que, selon les valeurs, le système pouvait vite « diverger ».
  • Enfin, faut-il imposer des conditions aux bords et/ou sur la dérivée seconde ? Et si oui, comment ?

Merci d’avance pour vos réponses.

PS : Voici mon code Python.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
from matplotlib import pyplot as plt
import math

def systeme(a, b, c, d, D, T, dt, L, dx, u0, v0):
    nx = int(L / dx)
    nt = int(T / dt)
    temps = [t * dt for t in range(nt)]
    position = [x * dx for x in range(nx)]
    u = [u0] + [[0 for x in range(nx)] for t in range(nt - 1)]
    v = [v0] + [[0 for x in range(nx)] for t in range(nt - 1)]
    for t in range(nt - 1):
        for x in range(nx - 2):
            u[t + 1][x] = (a * u[t][x] - b * u[t][x] * v[t][x] +
                           D * (u[t][x + 1] - 2 * u[t][x] + u[t][x - 1]) / dx**2) * dt + u[t][x]
            v[t + 1][x] = (d * u[t][x] * v[t][x] - c * v[t][x] +
                           D * (v[t][x + 1] - 2 * v[t][x] + v[t][x - 1]) / dx**2) * dt + v[t][x]
    return temps, position, u, v


if __name__ == "__main__":
    t, x, u, v = systeme(a=2/3, b=4/3, c=1, d=1, D=1,
                         T=100, dt=0.1,
                         L=1000, dx=1,
                         v0=[1]*1000,
                         u0=[math.exp(-((x - 500) * 0.05)**10) for x in range(1000)])  # Courbe en cloche pour les CI des proies.
    for i in range(10000):
        axes = plt.gca()
        axes.set_ylim([0, 2.5])
        plt.plot(x, u[i], '-r')
        plt.plot(x, v[i], '-g')
        plt.title("Effectifs des populations au temps $t = {}$".format(i))
        plt.xlabel("Position $x$")
        plt.ylabel("Effectifs $u(t, x)$ et $v(t, x)$")
        plt.savefig("Img/{}.png".format(i), dpi=150, bbox_inches='tight')
        plt.clf()
        print("Figure {} faite.".format(i), end='\r')
+0 -0

Cette réponse a aidé l’auteur du sujet

Je suis pas sûr qu’Euler soit vraiment bien adapté ici. (En général pour les EDO, Euler c’est bof.. Euler explicite a des conditions de stabilité qu’il faut respecter [conditions CFL] et Euler implicite est stable mais plus lourd. On préfère des méthodes comme Runge-Kutta d’ordre 2 ou 4).

De manière générale, les schémas de résolution pour les EDP vont dépendre de l’équation (parabolique, hyperbolique, …) et de la géométrie du problème (maillage) et de la forme des conditions aux limites (problème de Dirichlet ou de Neumann ou mixte). Un cours sur le sujet

Je ne sais pas si le fait d’avoir un système croisé d’équation change la donne mais je sais que ce modèle est un grand classique et je suppose qu’il doit exister des exemples que tu dois pouvoir analyser.

Édité par Davidbrcz

+1 -0

Cette réponse a aidé l’auteur du sujet

Runge-kutta est bien adaptée pour les EDO (équations différentielles ordinaires).

Pour les EPD (équations différentielles partielles) on va regarder du côté de la méthode des différences finies, éléments finis ou volumes finis en fonction du problème.

je ne sais pas si le fait que tu ais un système croisé d’équations change la théorie derrière

Édité par Davidbrcz

+1 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte