#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Sun Nov 20 14:46:17 2022

@author: fabrice
"""


#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Sat Nov 19 16:04:08 2022

@author: fabrice

régression sur une relation du type y=ax+b
"""


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

#liste des grandeurs mesurées
x_exp=np.array([1,1.8,3.2,4]) #mesures expérimentales de x


y_exp=np.array([4,6,8.5,10.3]) # mesures expérimentales de y
uy_exp=np.array([0.5,0.6,0.6,0.8]) # mesures des incertitudes sur y
# Nombre de tirages
N=1000
La=[]# liste vide pour ranger les différentes pentes calculées
Lb=[]# liste vide pour ranger les différentes ordonnées à l'origine

#Génération d'un ensemble de régression possible par Monte-Carlo

for i in range(N):
    Y=rd.normal(y_exp,uy_exp) # génération des tirages de y
    A,B=np.polyfit(x_exp,Y,1) # Utilisation  de la fonction polyfit pour effectuer la régression
    La.append(A)# création de la liste des pentes
    Lb.append(B) # création de la liste des ordonnées à l'origine
  
#
a,ua=np.mean(La),np.std(La,ddof=1) # calcul de la pente moyenne et de son incertitude
b,ub=np.mean(Lb),np.std(Lb,ddof=1)# calcul de l'ordonnée à l'origine moyenne et son incertitude
print('la pente vaut :',a)
print('Incertitude sur a :',ua)
print('Ordonnée à l''origne :',b)
print('Incertitude sur b :',ua)

t=np.linspace(0,5,100)

plt.figure()
plt.xlabel('x en ()')
plt.ylabel('y en ()')
plt.errorbar(x_exp,y_exp,yerr=uy_exp,marker='+',linestyle='none',label='données')#tracé des barres d'erreurs
plt.plot(t,a*t+b)
#plt.plot(t,(a-ua)*t+b-ub)#facultatif : tracé de la droite de plus petite pente
#plt.plot(t,(a+ua)*t+b+ub)#facultatif : tracé de la droite de plus grande pente
plt.grid()
plt.title('Titre' )
plt.show()