import numpy as np # Numpy permet de faire des calculs simples sur des arrays
import matplotlib.pyplot as plt # Matplotlib pour tracer des graphes


# Enregistrement des données
R = np.array([ 100,200,300,400,500,600,700,800,900,1000])
tau = np.array([151,240,356,458,547,651,741,843,949,1041])*1e-6

# Valeurs d'incertitudes-type données dans l'énoncé
u_R = 0.02*R
u_tau = 0.04*tau

# Remarque : en cas de mesure directe, il est plus probable d'avoir accès à la précision de mesure plutôt qu'à l'incertitude-type.
#Dans ce cas, on peut laisser la précision mais il ne faut pas oublier d'enlever la racine de 3 dans la simulation

# Cacul de la valeur mesurée par régression unique

pente_moy,ordonnee_moy = np.polyfit(R,tau,1)

# Estimation de l'incertitude par monte carlo

N = 10000

pente = []
ordonnee = []

for i in range(N):
    l = len(R)
    mx= R + u_R*np.sqrt(3)*np.random.uniform(-1,1,l)
    my= tau + u_tau*np.sqrt(3)*np.random.uniform(-1,1,l)
    # Ne pas oublier de remplacer u * sqrt(3)  par Delta si on a mesuré la précision
    p=np.polyfit(mx,my,1)
    pente.append(p[0])
    ordonnee.append(p[1])

u_pente = np.std(pente,ddof=1)
u_ordonnee = np.std(ordonnee,ddof=1)
print('Pente=', pente_moy)
print('incertitude sur la pente=',u_pente)
print('Ordonnee =', ordonnee_moy)
print('incertitude sur ordonnee=',u_ordonnee)
