#!/usr/bin/python
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
import numpy.random as rd
plt.ion()


############## Mise en forme des donnees #######

X = np.array([0,5,10,15,20])
ux = np.array([0.14,0.16,0.14,0.18,0.14]) #incertitudes

Y = np.array([0,5,10,15,20])
uy = np.array([0.0083,0.054,0.043,0.084,0.026])



############## figure classique ################

plt.figure()
plt.plot(X_lin,Y_lin, 'b+', label='lin') #courbe 1
plt.plot(X_quadra,Y_quadra, 'ro', label='quadra') #courbe 2
plt.xlabel('x')
plt.ylabel('y')
plt.grid()
plt.legend(loc='best')
plt.show()
plt.savefig('nom', bbox_inches='tight') # enregistrement de la figure


############## figure avec barre d'erreur ################


plt.figure()
plt.errorbar(X,Y,xerr=ux, yerr=uy, fmt='bo', label='point expérimentaux') #courbe 1

plt.xlabel('x')
plt.ylabel('y')
plt.grid()
plt.legend(loc='best')
plt.show()
plt.savefig('nom', bbox_inches='tight')




############## figure double ################

plt.figure(figsize=(10,5),dpi=200)
plt.subplot(1,2,1)
plt.errorbar(X,Y,xerr=ux, yerr=uy, fmt='bo', label='point expérimentaux') #courbe 1
plt.xlabel('x')
plt.ylabel('y')
plt.grid()
plt.legend(loc='best')

plt.subplot(1,2,2)
plt.plot(X_lin,Y_lin, 'b+', label='lin')
plt.xlabel('x')
plt.ylabel('y')
plt.grid()
plt.legend(loc='best')
plt.show()



################# Regression linéaire ###############

# Donnees
X = np.array([0,5,10,15,20])
ux = np.array([0.14,0.16,0.14,0.18,0.14]) #incertitudes

Y = np.array([0,5,10,15,20])
uy = np.array([0.0083,0.054,0.043,0.084,0.026])

# nombre de simulations
N = 1000
##Principe : rd.normal(X,ux) génère un tableau de la taille des arguments
##Chaque valeur est un tirage normal dont la valeur moyenne est X et l'écart type ux
## Pour chaque tirage Xsim, Ysim on calcule l'ordonnée à l'origine et la pente obtenue sous la forme Y= a*X + b
## On réalise ensuite une moyenne des pentes et de l'ordonnée à l'origine sur tous les
## tirage pour en déduire la meilleure régression linéaire qui prends en compte les incertitudes
asim =[]
bsim = []
for i in range(N):
    Xsim = rd.normal(X,ux)
    Ysim = rd.normal(Y,uy)
    p = np.polyfit(Xsim,Ysim,1) #polynome de degrés 1 = fonction affine
    asim.append(p[0])
    bsim.append(p[1]) 
ma,ua = np.mean(asim), np.std(asim,ddof=1)
mb,ub = np.mean(bsim), np.std(bsim,ddof=1)

print("a=",ma)
print("ua=",ua)
print("b=",mb)
print("ub",ub)



