# -*- coding: utf-8 -*-
"""
Created on Tue Jul 19 11:42:04 2022

@author: starons
"""

"""
Ce programme résoud numériquement l'équation différentielle décrivant la 
décroissance radioactive du carbone 14 dont la demi-vie est de 5730 ans en 
utilisant la méthode d'Euler explicite et compare à la solution analytique. 
"""

# On importe les bibliothèques utiles
# -----------------------------------
from matplotlib import pyplot as plt
import numpy as np

# Valeurs numériques caractéristiques du problème
# -----------------------------------------------
demi_vie = 5730                         # demi-vie (ans)
Lambda = np.log(2)/demi_vie             # constante radioactive (ans^-1) 
R0 = 10000                              # condition initiale 

# Paramètres de la résolution numérique
# -------------------------------------
t_fin = 5*demi_vie                      # durée
N = 7                                   # nombre de points
h = t_fin/(N-1)                         # pas de temps
 
# Implémentation de la méthode d'Euler explicite
# ---------------------------------------------- 
t = np.linspace(0,t_fin,N)              # découpage du temps 
R = np.zeros(N)                         # création d'un tableau vide à N éléments (rempli de zéros)
R[0] = R0                               # initialisation 
for n in range(N-1):                    # remplissage par récurrence
    R[n+1] = R[n]-Lambda*R[n]*h         # schéma numérique
    
# On connait la solution analytique
# --------------------------------- 
t_analytique = np.linspace(0,t_fin,1000)# pour disposer d'un tableau plus dense de valeurs de temps   
R_analytique = R0*np.exp(-Lambda*t_analytique)

# Représentations graphiques 
# --------------------------
plt.plot(t,R,color='black',marker='.',label="solution numérique")
plt.plot(t_analytique,R_analytique,color='red',linestyle='dashed',label="solution analytique")
plt.xlabel("temps (années)"),plt.ylabel("nombre de noyaux radioactifs présents")
plt.title("Décroissance radioactive du Carbone 14")
plt.legend(),plt.grid()