import matplotlib.pyplot as plt
import numpy as np
from urllib.request import urlopen

print("TP 3 - Jeudi 14 Octobre 2021")

print(3*" ")
print("# 1 - Population de poissons")
print(3*" ")

N_initial = 3562 # Nombre initial de poissons dans le lac en 2004

print(3*" ")
print("   Question 1")
print(3*" ")

N = N_initial # Va servir à compter le nombre poissons au fil des ans

annees = np.arange(2004,2104,1) # Attention à bien mettre 2105 car sinon 2104 ne sera pas compté !!!
population = [] # On créée une liste vide que l'on va remplir au fil des itérations de la boucle "for"

for i in annees:
    population.append(N) # On rajoute le nombre de poissons pour l'année en cours à la liste, qui contient les populations des années précédentes
    N = 0.94*N # Enlever 6% à un nombre revient à le multiplier par 0.94

print("Le nombre d'ablettes dans le lac en 2104 est de ",N) # En réalité la partie entière (nombre de poissons)

plt.title("Evolution de la populations d'ablettes dans le lac (Question 1)")
plt.xlabel("années")
plt.ylabel("population d'ablettes")
plt.grid()
plt.plot(annees,population,"+b",label="Population d'ablettes")
plt.legend()
plt.show()


print(3*" ")
print("   Question 2")
print(3*" ")

print("Utilisation de la boucle 'for' + 'if':")
annees = np.arange(2004,2105,1)
N_initial = 3562
N = N_initial

for i in annees:
    if N <= 100:
        break
    N = 0.94*N

print("Nombre d'années pour que la population soit inférieure à 100: ", i-2004)

print(3*" ")
print("Utilisation de la boucle 'while':")
annees = np.arange(2004,2105,1)
N_initial = 3562
N = N_initial
i = 0 # Calcul du nombre d'années pour que la population diminue en dessous de 100 poissons

while N > 100:
        i = i + 1
        N = 0.94*N

print("Nombre d'années pour que la population soit inférieure à 100: ", i)

print(3*" ")
print("   Question 3")
print(3*" ")

print("Suite géométrique de raison 0.94")

N_initial = 3562

a = 2104 # année pour laquelle on calcule la population de poissons

N = N_initial*0.94**(a-2004)

print("Le nombre d'ablettes dans le lac en 2104 est de ",N)

print(3*" ")
print("   Question 4")
print(3*" ")

N_init = 3562
a = 2020 # Année de calcul de la population de poissons
annees = np.arange(2004,a+1,1) # Là encore, on met a+1 car sinon l'année a ne sera pas prise en compte
population = []

N = N_init

if a <= 2010: # Avant 2010, aucune mesure anti-pollution n'a été prise
    for i in annees:
        population.append(N)
        N = 0.94*N
if a > 2010:
    for i in np.arange(2004,2010,1):
        population.append(N)
        N = 0.94*N
    for i in np.arange(2010,a+1,1): # Après 2010, les resultats de la mesure anti-pollution sont visibles
        population.append(N)
        N = 1.1*N # Ajouter 10% à un nombre revient à le multiplier par 1.1
        
plt.title("Evolution de la populations d'ablettes dans le lac (Question 4)")
plt.xlabel("années")
plt.ylabel("population d'ablettes")
plt.grid()
plt.plot(annees,population,"+b",label="Population d'ablettes")
plt.legend()
plt.show()

print(3*" ")
print("   Question 5")
print(3*" ")

N_init = 3562

N_2010 = N_init*0.94**(6) # Population de poissons en 2010 à cause de la pollution (remplace la boucle 'for')
N = N_2010

a = 2010 # Année de départ de calcul de la population de poissons

while N < 3500:
    a = a+1
    N = 1.1*N
    
print("Année lors de laquelle on peut espérer voir plus de 3500 poissons dans le lac: ",a)


print(3*" ")
print("# 2 - Une population peut-elle croître à l'infini ?")
print(3*" ")

print(3*" ")
print("   Questions 1,2 et 3")
print(3*" ")

N0 = 5 # 5 nouveaux-nés sont introduits
N1 = 0
N2 = 0

population_N0 = [] # Liste des populations de nouveaux-nés que l'on va compléter au fil des années
population_N1 = [] # Liste des populations de rongeurs de 1 an que l'on va compléter au fil des années
population_N2 = [] # Liste des populations de rongeurs de 2 ans que l'on va compléter au fil des années
population = [] # LIste de la population totale de rongeurs, que l'on va compléter au fil des années

N_annees = 50 # Nombre d'année sur lesquelles on veut faire la simulation

annees = np.arange(0,N_annees+1,1) # Liste des années pour faire la simulation

for t in annees:
    population_N0.append(N0) # On ajoute N0 à la liste de la population de nouveaux-nés, idem pour N1, N2 et P
    population_N1.append(N1)
    population_N2.append(N2)
    population.append(N0+N1+N2)
    N0,N1,N2 = 3*N1 + N2,(2/3)*N0,(5/6)*N1 # Petits de chaque individu de 1 ans et de 2 ansn   - Attention à bien faire une affectation
                                           # 1/3 des nouveaux-nés n'atteint pas 1 an           - parallèle !!!
                                           # 1/6 des individus de 1 an n'atteint pas 2 ans

plt.subplot(1,2,1)
plt.plot(annees,population,"+k",label="Population totale")
plt.plot(annees,population_N0,"+g",label="Nouveaux-nés")
plt.plot(annees,population_N1,"+r",label="Individus de 1 an")
plt.plot(annees,population_N2,"+b",label="Individus de 2 ans")
plt.xlabel("années")
plt.ylabel("Nombre d'individus")
plt.legend()
plt.title("Population de rongeurs")
plt.grid()

plt.subplot(1,2,2)
plt.semilogy(annees,population,"+k",label="Population totale")
plt.semilogy(annees,population_N0,"+g",label="Nouveaux-nés")
plt.semilogy(annees,population_N1,"+r",label="Individus de 1 an")
plt.semilogy(annees,population_N2,"+b",label="Individus de 2 ans")
plt.xlabel("années")
plt.ylabel("Nombre d'individus")
plt.legend()
plt.title("Population de rongeurs (échelle logarithmique)")
plt.grid()

plt.show()

print("Croissance exponentielle car les courbes forment une droite en échelle logarithmique")

print(3*" ")
print("   Question 4")
print(3*" ")

print("La suite est croissante.")

print(3*" ")
print("   Question 5")
print(3*" ")

print("Le modèle n'est pas réaliste car, en 100 ans, il y aurait 10^20 rongeurs, soit 100 milliards de milliards, ce qui est beaucoup !")

print(3*" ")
print("   Questions 6,7 et 8")
print(3*" ")

N_annees = 50
a = 1.6
b = 0.002
P0 = 1200
P1 = 830

# Calcul de l'évolution de la population avec P[0] = 1200

annees0 = np.arange(0,N_annees+1,1)
P = P0
population0 = []

for t in annees0:
    population0.append(P)
    P = P + P*(a-b*P)
    
# Calcul de l'évolution de la population avec P[1] = 830

annees1 = np.arange(1,N_annees+1,1)
P = P1
population1 = []

for t in annees1:
    population1.append(P)
    P = P + P*(a-b*P)

plt.subplot(1,2,1)
plt.title("Population avec P[0] = 1200")
plt.xlabel("années")
plt.ylabel("population")
plt.grid()
plt.plot(annees0,population0,"+g",label="Population")
plt.legend()
plt.subplot(1,2,2)
plt.title("Population avec P[1] = 830")
plt.xlabel("années")
plt.ylabel("population")
plt.grid()
plt.plot(annees1,population1,"+g",label="Population")
plt.legend()
plt.show()

print("La suite est ni croissante, ni décroissante, mais oscille et converge vers la valeur 800")
    
print(3*" ")
print("   Question 10")
print(3*" ")

print("Le rapport a/b est égal à ",a/b,", ce qui correspond à la limite de la suite")