#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
TP mesure de R
"""

#%%Importation des bibliothèques
import matplotlib.pyplot as plt
import numpy as np 

# Mesures  ---> A compléter   
U = np.array([])# Tension (en Volt)
I = np.array([])# Intensité (en Ampère)

#%% 1. Affichage du graphique U=f(I)

plt.figure(1)
plt.plot(I,U,'+',label='mesures') 
plt.grid()
plt.xlabel('')        #titre des abcisses à compléter.                                   
plt.ylabel('')     #titre des ordonnées  compléter.                                      
plt.title("")      #titre à compléter.                              
plt.legend()
plt.show()

#%%2. Regression linéaire
# Modélisation des points de mesure par une droite

(a,b) = np.polyfit(I,U,1)                            

# Fabrication de la courbe-modèle pour affichage
U_modele=[]
for i in I:
    U_modele.append(a*i+b)
    
#affichage des résulats 
print('a=',round(a,2))  #valeur de a arrondie avec 2 cs
print('b=',round(b,2))#valeur de b arrondie avec 2 cs
print('équation de la courbe: U=',round(a,2),'I+',round(b,2))

#%% 3.Méthode de Monte-Carlo pour le calcul des incertitudes    
#Simulation de MC.
#listes destinées à accueillir les valeurs successives de a et de b à chaque simulation
pentes=[ ]
ordonnees_origine=[ ]

#nombre de simulations MC
N=            #A compléter

#largeur de la distribution
Dy=                   # précision les valeurs de U A COMPLETER
Dx=                    # précision les valeurs de I A COMPLETER

#réalisation de la simulation
for n in range(0,N):
    U_tirage=[] #liste vide qui va contenir les valeurs de U tirées au sort 
    I_tirage=[] #liste vide qui va contenir les valeurs de I tirées au sort 
    
    
    for i in range(len(U)): 
        U_tirage.append(np.random.uniform(U[i]-Dy,U[i]+Dy )) #tableau de valeurs de U tirées aléatoirement 						 
        I_tirage.append(np.random.uniform(I[i]-Dx,I[i]+Dx)) #tableau de valeurs de I tirées aléatoirement 		              
        
		# Régression linéaire de y_tirage en fonction de x_titrage : équation 
    p = np . polyfit (I_tirage , U_tirage , 1)
    pentes.append(p[0])
    ordonnees_origine.append(p[1])

#valeurs moyennes
a_moy=np.mean(pentes)
b_moy=np.mean(ordonnees_origine)

#incertitudes-types
u_a_MC=np.std(pentes,ddof=1)
u_b_MC=np.std(ordonnees_origine,ddof=1)

#affichage des résultats
print('résultats de la simulation de MC:','a=',a_moy,'u(a)=', u_a_MC,'b=', b_moy,'u(b)=', u_b_MC)
