"""
Script assurant une régression linéaire pour des données avec barres d'incertitude
"""

import numpy as np
import numpy.random as rd
import numpy.polynomial.polynomial as poly
import matplotlib.pyplot as plt

plt.rcParams['xtick.labelsize']= 14
plt.rcParams['ytick.labelsize']= 14
plt.rcParams['font.size']= 14
plt.rcParams['lines.markersize']= 6
plt.rcParams['lines.linewidth']= 2
plt.rcParams['lines.markeredgewidth']= 2
plt.rcParams['axes.linewidth']= 1
plt.rcParams['xtick.major.width']= 1

## Importation des données

donnees = np.loadtxt('Exemple.txt',skiprows=2)
X = donnees[:,0]
Y = donnees[:,1]

# Préciser les incertitudes-types
uX = 0.01*np.ones(len(X))
uY = 0.11*np.ones(len(Y))


## Régression linéaire

params = poly.polyfit(X,Y,1)
pente = params[1]
ord_org = params[0]


## Incertitude sur les paramètres de la régression

# Tirages Monte-Carlo et régression linéaire sur chaque tirage
n = 10000    #nombre de tirages Monte-Carlo
pentes_MC = np.zeros(n)
ord_org_MC = np.zeros(n)
for k in range(n):
    X_MC = X + uX*rd.normal(0,1,len(X))
    Y_MC = Y + uY*rd.normal(0,1,len(Y))
    params = poly.polyfit(X_MC,Y_MC,1)  #régression linéaire
    pentes_MC[k] = params[1]
    ord_org_MC[k] = params[0]

# Incertitudes-types sur la pente et l'ordonnée à l'origine
u_pente = np.std(pentes_MC)
u_ord_org = np.std(ord_org_MC)

print('pente : a = ',pente, '; u(a) = ',u_pente)
print("ord origine : b = ",ord_org, '; u(b) = ', u_ord_org)

## Tracé du graphe

plt.figure()

# Tracé des points avec barres d'incertitudes
plt.errorbar(X, Y, xerr=2*uX,yerr=2*uY, fmt='o', color='black', ecolor='black')
plt.xlabel('temps (s)')
plt.ylabel('tension (V)')
#Ajuster si nécessaire les limites du graphe
#plt.xlim((0,2))
#plt.ylim((0,2))

# Tracé du modèle
liste_x = np.linspace(min(X),max(X),1000)
modele = params[0] + params[1]*liste_x
plt.plot(liste_x,modele,'-',color='darkred')

plt.tight_layout()
plt.show()

