################################
#PARAMETRES POUR UTILISATION NORMALE
###################################
fen_abs=6.5
fen_ord=4.5
taille_cara=10
larg_trait=1
taille_mark=4

########################
#PARAMETRES POUR LIVRE DUNOD
##############################
fen_abs=18  #18 
fen_ord=12  #12
taille_cara=30   #30
larg_trait=4      #4
taille_mark=15    #15

import numpy as np              #bibliothèque numpy renommée np
import numpy.random as rd       #module numpy.random renommé rd
import matplotlib.pyplot as plt #module matplotlib.pyplot renommé plt


x = np.array([1,2,3,4,5,6])                     #tableau des x
u_x = np.array([0.01,0.01,0.01,0.01,0.01,0.01]) #tableau des incertitudes-types
y = np.array([3.8,12.0,15.2,17.2,24.2,28.3])    #tableau des y
u_y = np.array([1, 1.3, 1.1, 1.2, 1.1, 1.5])    #tableau des incertitudes-types


#######################################
#calcul de a en utilisant les tableaux
################################   #######           
a=np.sum(x*y)/np.sum(x**2) #calcul de a en utilisant les calculs sur les tableaux

#######################################
#calcul de a avec une boucle for
#######################################
somme1=0
somme2=0
n=len(x)   #nombre d'éléments de x
for i in range(n): #i varie de 0 inclus à n exclu
    somme1=somme1+x[i]*y[i]
    somme2=somme2+x[i]**2
a_calc=somme1/somme2  #calcul de a noté a_calc en utilisant somme1 et somme2

#######################################
#Calcul des résidus
#######################################
xfit = np.linspace(-1, 7,2) #tableau de deux points
yfit=a*xfit  #tableau de deux points
Residus=y - (a*x)    #tableau des résidus
print("a = {:.2e}".format(a))

plt.figure()   #nouvelle fenêtre graphique
plt.xlabel('x')
plt.ylabel('y')
plt.plot(xfit, yfit, color='r')
plt.errorbar(x, y, xerr=u_x, yerr=u_y, fmt='o', color='blue')
plt.legend(['y=ax', "(barres d'incertitude = inc. type)"])
plt.xlim([-1,7])
plt.grid()    #affiche la grille
plt.show()    #affiche la figure à l'écran



#figure des résidus normalisés
z=Residus/u_y    #tableau des écarts normalisés
plt.figure()   #nouvelle fenêtre graphique
plt.title('Résidus normalisés')
plt.plot(x,z,'o',color='Blue')
plt.xlabel('x')
plt.ylabel('Résidus normalisés')
plt.grid()    #affiche la grille
plt.show()    #affiche la figure à l'écran


#########################################
#Simulation Monte-Carlo pour estimer l'incertitude-type
#########################################
N = 1000  #nombre de tirages à simuler
tab_a=np.zeros(N) #tableau de N valeurs nulles

for i in range(0, N):       #i varie entre 0 inclus et N exclu
    my = rd.normal(y, u_y)  #variables aléatoires suivant une loi normale
                            #de valeur centrale y[i] et d'écart-type u_y[i]
    a=np.sum(x*my)/np.sum(x**2)
    tab_a[i]=a              #valeur de a pour la simulation i

u_a = np.std(tab_a, ddof=1) #écart-type pour tab_a avec N-1 au dénominateur

print("a = {:.2e} +/- {:.1e}".format(a,u_a)+" (incertitude-type)")

print(u_y/(a*u_x))

