[Python] J'ai essayé de reproduire la bataille entre Lion et Gazel avec une formule super cool appelée équation Rotoka-Volterra.

Équation de Rotka-Volterra

Eh bien, une équation avec un nom comme cette pensée de deuxième élève. ** Cool transcendantal. ** ** Cette fois, je voudrais jouer avec cette équation avec le calcul numérique (python). Le contenu de l'équation elle-même ressemble à ceci.

\frac{dx}{dt}=\alpha x-\beta xy \\
\frac{dy}{dt}=\gamma x-\delta xy

C'est une formule assez bâclée, mais c'est une ** formule qui exprime la relation entre la prédation et la proie **. Soyez assuré que ce n'est pas si difficile car c'est un clinquant! !! Cette fois, je vais le lire dans le décor africain de ** Lion vs. Gazelle **.

Comprendre les formules

Il y a beaucoup de personnages, mais je vais les expliquer un par un.

Définition des variables / constantes

variable

$ x $: Nombre de prédateurs (nombre de gazelle), $ y $: Nombre de prédateurs (nombre de lions)

constant

$ \ alpha $: Taux de natalité côté proie, $ \ beta $: Taux de prédation côté proie, $ \ gamma $: Taux de natalité côté proie, $ \ delta $: Taux de mortalité côté proie

(Sur le plan académique, certaines parties sont précises, mais nous insistons sur la clarté)

Je suis sûr qu'il y a des gens qui ont ??? dans leur cerveau, mais soyez patient, comme nous l'expliquerons dans la section suivante.

Implications pour les expressions

C'est l'endroit le plus intéressant! !! Regardons la formule originale tout en regardant la signification des caractères définis ci-dessus.

\frac{dx}{dt}=\alpha x-\beta xy~~~~(1) \\
\frac{dy}{dt}=\gamma xy-\delta y~~~~(2)

Tout d'abord, pensons à (1).

\frac{dx}{dt}=\alpha x-\beta xy~~~~(1)

Le côté gauche représente le taux de changement au fil du temps de $ x $, c'est-à-dire ** combien la gazelle augmente **. Alors, que peut-on considérer comme une augmentation ou une diminution de la gazelle? Oui, ** naissance ** et ** décès **, n'est-ce pas? La naissance correspond à $ \ alpha x $ au premier terme et la mort correspond à $ \ beta xy . La naissance d'une gazelle, c'est-à-dire le nombre de gazelles nées ** peut être exprimé par le produit du nombre de gazelles et du taux de natalité ** ( = \ alpha x $). Augmentera). En revanche, la mort de Gazel et le nombre de Gazels décroissant ** peuvent être exprimés par le produit du nombre de Gazels, du nombre de lions et du taux de prédation ** (= $ \ beta xy $). Je pense que c'est un peu difficile à comprendre ici, mais je pense que ce sera plus facile à comprendre si vous imaginez que s'il y a beaucoup de gazelles, il sera plus facile pour les lions de cibler, et s'il y a beaucoup de lions, les gazelles seront beaucoup attaquées. Par conséquent, l'augmentation / diminution totale de la gazelle est de $ \ alpha x- \ beta xy $, qui est la somme du nombre de naissances et du nombre de décès.

Pensons à la même chose dans l'équation (2).

\frac{dy}{dt}=\gamma xy-\delta y~~~~(2)

Puisque le côté gauche est le taux de changement d'heure de $ y , cela correspond à ** combien de lions augmenteront **. L'augmentation ou la diminution du nombre de lions peut également être divisée en accouchement et en décès, mais certains facteurs sont légèrement différents de Gazel. ** Le nombre de lions nés ** est représenté par le produit du nombre de lions, du nombre de gazelles et du taux de natalité ** ( = \ gamma xy ). ** Pourquoi le nombre de gazelles est-il lié? ?? Le lecteur qui pensait ** est vif. Si vous étiez un lion, ne sentiriez-vous pas que plus vous avez de gazelle, plus votre progéniture est prospère? Voilà la tension. Maintenant, ** le nombre de morts de lions ** est représenté par ** le produit du nombre de lions et du taux de mortalité ** ( = \ delta y $). Les lions ne sont jamais mangés par les gazelles, le nombre de morts est donc déterminé quel que soit le nombre de gazelles. Par conséquent, l'augmentation / diminution totale des lions est $ \ gamma xy- \ delta y $, qui est la somme du nombre de naissances et du nombre de décès.

Essayez de calculer numériquement

J'espère que vous avez approfondi votre compréhension de Gazel et Lion dans la section précédente et compris la formule. Cependant, comme les équations différentielles ne peuvent pas être traitées directement par un ordinateur, cette fois nous utiliserons la ** méthode des différences ** pour le calcul. Supposons que $ x, y $ au temps $ n $ soit représenté par $ x_ {n}, y_ {n} $. C'est

\frac{dx}{dt}=\alpha x-\beta xy~~~~(1) \\
\frac{dy}{dt}=\gamma xy-\delta y~~~~(2)

Quand c'est différencié, ça ressemble à ça,

\frac{x_{n+1}-x_{n}}{\Delta t}=\alpha x_{n}-\beta x_{n}y_{n}~~~~(1) \\
\frac{y_{n+1}-y_{n}}{\Delta t}=\gamma x_{n}y_{n}-\delta y_{n}~~~~(2)

Résolution des valeurs inconnues $ x_ {n + 1}, y_ {n + 1} $ à la prochaine fois $ n + 1 $

x_{n+1}=(\alpha -\beta y_{n})x_{n}\Delta t + x_{n}~~~~(1) \\
y_{n+1}=(\gamma x_{n} -\delta)y_{n}\Delta t + x_{n}~~~~(2)

Sera. La valeur du côté droit étant constituée de valeurs connues (valeur de la constante ou du temps n), le côté gauche peut être obtenu simplement en effectuant un calcul de substitution.

Code source

Cette fois, je l'ai écrit en python. Vous pouvez modifier la valeur de la constante à votre guise.

Lotka-Volterra.py


import numpy as np
import matplotlib.pyplot as plt

#coefficient
a, b, c, d = 0.3, 0.1, 0.3, 1.3

#valeur initiale
init_x = 10
init_y = 2

#Progression du temps
dt = 0.01
n = 5000

#Initialisation de la baie
x = np.zeros(n)
x[0] = init_x
y = np.zeros(n)
y[0] = init_y

for i in range(1, n):
  x[i] = (a - b * y[i - 1]) * x[i - 1] * dt + x[i - 1]
  y[i] = (c * x[i - 1] - d) * y[i - 1] * dt + y[i - 1]
  print(i, x[i], y[i])

t = np.arange(0, n * dt, dt)

plt.plot(t, x, label="Prey")
plt.plot(t, y, label="Predator")
plt.legend()
plt.show()

résultat

Le résultat devrait ressembler à la figure ci-dessous. Figure_1.png

Considération

C'est intéressant que le résultat vibre. Si vous le considérez par ordre chronologique,

  1. Le nombre de lions (jaune) augmente et le nombre de gazelle (bleu) diminue.
  2. L'augmentation des lions s'arrête et commence à diminuer, et la gazelle augmente en conséquence.
  3. Le nombre de gazels augmentera, mais après un certain temps, le nombre de lions augmentera et le nombre de gazels diminuera.
  4. Répétez ceci

Il est devenu.

1. Le nombre de lions (jaune) augmente et le nombre de gazelle (bleu) diminue.

Eh bien, c'est vrai. Si le nombre de lions augmente, la gazelle sera mangée et diminuera.

2. L'augmentation des lions s'arrête et commence à diminuer, et la gazelle augmente en conséquence.

À cause d'un trop grand nombre de lions ** à court de nourriture et qui commencent à mourir de faim ** (je ressens quelque chose comme un indice ...). Et à la suite de la diminution des lions, Gazel reprend son élan et commence à augmenter.

3. Le nombre de gazels augmentera, mais après un certain temps, le nombre de lions augmentera et le nombre de gazels diminuera.

À mesure que le nombre de gazelles augmente, il devient ** le paradis ** pour Lion. Et la gazelle diminuera

4. Répétez ceci

Oui, ce monde tourne pour toujours dans ce cycle. Cela me fait me sentir étrange.

Résumé

Cette fois, j'ai utilisé une équation sympa juste nommée ** Equation Rotka-Volterra ** pour effectuer des calculs numériques sur l'écosystème du lion et de la gazelle. Je serais heureux si quelqu'un trouve ça intéressant! J'espère que tu aimes! !!

Recommended Posts

[Python] J'ai essayé de reproduire la bataille entre Lion et Gazel avec une formule super cool appelée équation Rotoka-Volterra.
J'ai essayé d'énumérer les différences entre java et python
J'ai aussi essayé d'imiter la fonction monade et la monade d'état avec le générateur en Python
J'ai essayé de faire un processus d'exécution périodique avec Selenium et Python
J'ai essayé de trouver la différence entre A + = B et A = A + B en Python, alors notez
J'ai essayé de faire un processus périodique avec CentOS7, Selenium, Python et Chrome
J'ai essayé de toucher un fichier CSV avec Python
J'ai essayé de résoudre Soma Cube avec python
J'ai essayé de résoudre le problème avec Python Vol.1
J'ai essayé d'automatiser la mise à jour de l'article du blog Livedoor avec Python et sélénium.
J'ai essayé de comparer la vitesse de traitement avec dplyr de R et pandas de Python
J'ai essayé de trouver l'entropie de l'image avec python
Django super introduction par les débutants Python! Partie 6 J'ai essayé d'implémenter la fonction de connexion
J'ai essayé de simuler la propagation de l'infection avec Python
J'ai créé un serveur avec socket Python et ssl et j'ai essayé d'y accéder depuis le navigateur
J'ai essayé de créer une interface graphique à trois yeux côte à côte avec Python et Tkinter
J'ai écrit un doctest dans "J'ai essayé de simuler la probabilité d'un jeu de bingo avec Python"
J'ai essayé de prédire le nombre de personnes infectées au niveau national de la nouvelle corona avec un modèle mathématique
Une histoire qui n'a pas fonctionné lorsque j'ai essayé de me connecter avec le module de requêtes Python
[5e] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai essayé de résoudre l'édition du débutant du livre des fourmis avec python
[2nd] J'ai essayé de créer un certain outil de type Authenticator avec python
[3ème] J'ai essayé de créer un certain outil de type Authenticator avec python
[Python] Un mémo que j'ai essayé de démarrer avec asyncio
J'ai essayé de créer une liste de nombres premiers avec python
J'ai essayé de créer une application de notification de publication à 2 canaux avec Python
Je voulais résoudre le problème ABC164 A ~ D avec Python
J'ai essayé de créer des taureaux et des vaches avec un programme shell
J'ai essayé de créer une application todo en utilisant une bouteille avec python
[4th] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai essayé de détecter facilement les points de repère du visage avec python et dlib
[1er] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai essayé d'améliorer l'efficacité du travail quotidien avec Python
Django super introduction par les débutants Python! Partie 3 J'ai essayé d'utiliser la fonction d'héritage de fichier de modèle
J'ai exécuté GhostScript avec python, divisé le PDF en pages et l'ai converti en image JPEG.
Django super introduction par les débutants Python! Partie 2 J'ai essayé d'utiliser les fonctions pratiques du modèle
J'ai essayé d'obtenir et d'analyser les données statistiques de la nouvelle Corona avec Python: données de l'Université John's Hopkins
[Python] J'ai essayé de visualiser la nuit du chemin de fer de la galaxie avec WordCloud!
[Introduction à Python] Quelle est la différence entre une liste et un taple?
J'ai essayé de créer un programme qui convertit les nombres hexadécimaux en nombres décimaux avec python
J'ai essayé d'exprimer de la tristesse et de la joie face au problème du mariage stable.
J'ai essayé d'obtenir le code d'authentification de l'API Qiita avec Python.
J'ai essayé de faire un signal avec Raspeye 4 (édition Python)
J'ai essayé d'apprendre l'angle du péché et du cos avec le chainer
J'ai essayé avec les 100 meilleurs packages PyPI> J'ai essayé de représenter graphiquement les packages installés sur Python
J'ai essayé de vérifier et d'analyser l'accélération de Python par Cython
J'ai essayé de rationaliser le rôle standard des nouveaux employés avec Python
[Outlook] J'ai essayé de créer automatiquement un e-mail de rapport quotidien avec Python
J'ai essayé d'obtenir les informations sur le film de l'API TMDb avec Python
J'ai essayé de créer un environnement de développement Mac Python avec pythonz + direnv
J'ai créé un exemple pour accéder à Salesforce en utilisant Python et Bottle
J'ai essayé de contrôler la bande passante et le délai du réseau avec la commande tc
J'ai essayé un langage fonctionnel avec Python