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
où $\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