import numpy as np
import matplotlib.pyplot as plt
plt.ion()




## mise en forme des donnees
X = np.array([])
Y = np.array([])






######Regression lineaire

p = polyfit(X,Y,1) #p est un tableau p[0] = pente p[1] = origine


######### Derivation de Y par rapport a X

dY = np.diff(Y)
dX = np.diff(X) #size X-1

XX = X[:-1] + dX/2 #nouvel axe X : point mediant



########Courbe simple
fig = plt.figure(figsize=(7, 5))

#1figure
plt.plot(X, Y, 'go--', legend='nom courbe 1') #version courte

plt.plot(X, Y, color='green', marker='o', linestyle='dashed', linewidth=2, markersize=12, legend='courbe2')#version detaillee

plt.loglog(X,Y,'go') #version log sur les deux add_axe
plt.semilogx(X,Y,'go') #version log sur l axe X
plt.xlabel(r'$X$ bananes')
plt.ylabel(r'$Y$ (camemberts) ')
plt.grid()
plt.legend()



############## Courbe double



fig = plt.figure(figsize=(12, 7))
rect = [0.06, 0.14, 0.42, 0.8]
ax = fig.add_axes(rect)
plt.plot(X, Y, 'go--', legend='nom courbe 1')
plt.grid()
plt.legend(loc='upper left')
ax.set_xlabel(r'$X$ bananes')
ax.set_ylabel(r'$Y$ (camemberts) ')


rect[0] += 0.5
ax = fig.add_axes(rect)
plt.plot(X, Y, 'go--', legend='nom courbe 1')
plt.grid()
plt.legend(loc='upper left')
ax.set_xlabel(r'$X$ bananes')
ax.set_ylabel(r'$Y$ (camemberts) ')
ax = fig.add_axes(rect)
fig.text(0.001, 0.96, r'(\textit{a})')
fig.text(0.501, 0.96, r'(\textit{b})')






#############save figure

plt.savefig('fname', dpi=300, format='png',     bbox_inches=tight)




################# 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)
