Levayer David RICM4

Devoir 1 : Dynamique de populations

Question 0:

1) Les habitants vont se répartir dans les deux villes. Au début, les probabilités sont identiques, mais peu à peu, la ville qui prendra l'avantage risque de dominer complétement l'autre. Je distingue deux scénarios possibles sans arriver à trancher définitivement:

2) En reprenant les deux hypothèses précédentes, on aurait (lorsque t -> infini) :

3) D'après les deux propositions de variation la répartition initiale :

Question 1:

set.seed(10)
# états initiaux
n1 <- 1
n2 <- 1
# Nombre de trajectoires à observer
nb <- 10
# Nombre de points par trajectoire (valeur de n)
n <- 2000
# Création du tableau contenant les Pi(t)
tabPt = list()

getCourbe <- function(n1 = 1, n2 = 1, n) {
    # Création du tableau contenant les valeurs de P(t)
    Pt <- 1:n
    for (j in 1:n) {
        # On calcule P(t)
        inter <- n1/(n1 + n2)
        # On tire un réel au hasard entre 0 et 1
        xAlea <- runif(1, 0, 1)
        # On augmente les populations des villes en fonction des deux calculs
        # précédents
        if (xAlea < inter) {
            n1 <- n1 + 1
        } else {
            n2 <- n2 + 1
        }
        # on oublie pas de compléter P(t)
        Pt[j] <- inter
    }
    Pt
}

plot(getCourbe(1, 1, n), ylim = c(0, 1), type = "l", main = "Courbes de P(t)")
for (i in 1:nb - 1) {
    lines(getCourbe(1, 1, n), col = i + 100)
}

plot of chunk unnamed-chunk-1

On observe plusieurs scénarios :

Par ailleurs, certaines courbes ne semblent suivre aucun des trois scénarios précédents… Peut-être que cette impression de “3 scénarios possibles” n'est dû qu'au faible nombre de courbes.

On prend n = 1000 afin d'observer (si elle existe, ce qui semble le cas) la stabilitation de la simulation (les courbes se stabilisent toutes, quelque soit le scénario). Une valeur plus grande semble ici inutile, alors qu'une valeur plus faible (par exemple n = 100) pourrait éventuellement laisser planer un doute.

Question 2


getLimiteCourbe <- function(n1 = 1, n2 = 1, n) {
    # Création du tableau contenant les valeurs de P(t)
    Pt <- 1:n
    for (j in 1:n) {
        # On calcule P(t)
        inter <- n1/(n1 + n2)
        # On tire un réel au hasard entre 0 et 1
        xAlea <- runif(1, 0, 1)
        # On augmente les populations des villes en fonction des deux calculs
        # précédents
        if (xAlea < inter) {
            n1 <- n1 + 1
        } else {
            n2 <- n2 + 1
        }
    }
    inter
}

# On rappelle la valeur de n
n <- 1000
# Nombre de 'limites' de P(t) que l'on souhaite
nbLimite <- 1000
tabLimiteQ2 <- c()
for (i in 1:nbLimite) {
    tabLimiteQ2[i] <- getLimiteCourbe(1, 1, n)
}

hist(tabLimiteQ2, main = "Histogramme des valeurs des limites de P(t)")

plot of chunk unnamed-chunk-2

Il semblerait que la loi soit uniforme. En effet, on observe que les colonnes de l'histogramme sont quasiment toutes égales. Cela implique que les limites sont réparties uniformément sur l'intervalle des valeurs limites de P(t) (intervalle [0,1]). C'est plutôt une surprise (mais les chiffres ne mentent pas, pas vrai ?).

Si on prend 5000 limites, l'égalité des colonnes est encore plus flagrante :

# Nombre de 'limites' de P(t) que l'on souhaite
nbLimite <- 5000
tabLimiteQ2bis <- c()
for (i in 1:nbLimite) {
    tabLimiteQ2bis[i] <- getLimiteCourbe(1, 1, n)
}
hist(tabLimiteQ2bis, main = "Histogramme des valeurs des limites de P(t)")

plot of chunk unnamed-chunk-3

Question 3

tabLimite <- c()
nbLimite <- 1000
for (i in 1:nbLimite) {
    tabLimite[i] <- getLimiteCourbe(10, 10, n)
}
hist(tabLimite, main = "Histogramme des valeurs des limites de P(t) avec n1=10 et n2=10")

plot of chunk unnamed-chunk-4


for (i in 1:nbLimite) {
    tabLimite[i] <- getLimiteCourbe(100, 100, n)
}
hist(tabLimite, main = "Histogramme des valeurs des limites de P(t) avec n1=10 et n2=10")

plot of chunk unnamed-chunk-4

On remarque que plus la valeur initiale est grande (avec n1=n2), plus les populations des deux villes vont être stables (comprendre P(t) va rester “proche” de 0.5).

On peut expliquer cela car :

for (i in 1:nbLimite) {
    tabLimite[i] <- getLimiteCourbe(1, 10, n)
}
hist(tabLimite, main = "Histogramme des valeurs des limites de P(t) avec n1=1 et n2=10")

plot of chunk unnamed-chunk-5


for (i in 1:nbLimite) {
    tabLimite[i] <- getLimiteCourbe(1, 100, n)
}
hist(tabLimite, main = "Histogramme des valeurs des limites de P(t) avec n1=1 et n2=100")

plot of chunk unnamed-chunk-5

Comme on pouvait s'y attendre, la population initiale des villes est un paramètre important. Si on fixe n1 < n2, alors on avantage dès le début la ville B (car on aura P(t) < 0.5). Ainsi, les colonnes des histogrammes proches de 0 sont plus grandes car la population de la ville A (qui est désavantagé de part la répartition initiale) n'augmente que très peu.

Question 4

Le résultat n'est donc pas conforme à mes prédictions. Je pensais que la simulation allait donner lieu à trois grands cas de répartition (répartition égale ou répartion en faveur de la ville A ou de la ville B), alors que la répartition est uniforme…

plot(tabLimiteQ2)

plot of chunk unnamed-chunk-6

C'est ce plot qui m'a aidé à conclure de la sorte. On voit bien que la répartition des points dans le carré ne suit pas de modèle précis (et surement pas un regroupement en trois scénarios). C'est donc un heureux hasard (enfin, si le hasard existe…) qui m'a fait confondre plot et hist.

On pourrait complexifier un peu la simulation en ajoutant des critères de variation de P(t). Par exemple :