import numpy as np         #bibliothèque numpy renommée np
import numpy.random as rd  #module numpy.random renommé rd

#mesures expérimentales
T=10e-3
t1=1e-3
VAm=8
VBm=4
R0=150

#calcul de la demi-étendue
delta_T=1/10*1e-3    #précision 1/10e de carreau
delta_t1=1/10*1e-3   #précision 1/10e de carreau
delta_R0=1/100*R0    #précision 1%
delta_VAm=1/10*2     #précision 1/10e de carreau
delta_VBm=1/10*2     #précision 1/10e de carreau



u_R0=delta_R0/np.sqrt(3)
u_VAm=delta_VAm/np.sqrt(3)
print('u(R0) =',u_R0)
print('u(VAm) =',u_VAm)
print()


R=R0*(VAm/VBm*np.cos(2*np.pi*t1/T)-1)
L=R0*VAm/VBm*np.sin(2*np.pi*t1/T)/(2*np.pi/T)


N=10000  #nombre de tirages

############################################
# QUESTION 5. UTILISATION DE BOUCLES FOR
############################################
tab_R=np.zeros(N)   #tableau contenant N valeurs nulles
tab_L=np.zeros(N)   #tableau contenant N valeurs nulles

for i in range(N): #i varie de 0 inclus à N exclu
    val_T=T+delta_T*(2*rd.random()-1)
    #2*rd.random()-1 est un nombre aléatoire compris entre -1 et 1
    val_t1=t1+delta_t1*(2*rd.random()-1)
    val_R0=R0+delta_R0*(2*rd.random()-1)
    val_VAm=VAm+delta_VAm*(2*rd.random()-1)
    val_VBm=VBm+delta_VBm*(2*rd.random()-1)


    tab_R[i]=val_R0*(val_VAm/val_VBm*np.cos(2*np.pi*val_t1/val_T)-1)
    tab_L[i]=val_R0*val_VAm/val_VBm*np.sin(2*np.pi*val_t1/val_T)\
             /(2*np.pi/val_T)

############################################
#Moyenne et écart-type de Rmes et Lmes
############################################
Rmes=np.mean(tab_R)              #moyenne du tableau tab_R
u_Rmes=np.std(tab_R, ddof=1)     #écart-type du tableau tab_R
                                 #avec N-1 au dénominateur
Lmes=np.mean(tab_L)              #moyenne du tableau tab_L
u_Lmes=np.std(tab_L, ddof=1)     #écart-type du tableau tab_L
                                 #avec N-1 au dénominateur
print('Rmes = {:.3e}'.format(Rmes))
print('u(Rmes) = {:.1e}'.format(u_Rmes)) #incertitude-type de Rmes

print('Lmes = {:.3e}'.format(Lmes))
print('u(Lmes) = {:.1e}'.format(u_Lmes))   #incertitude-type de Lmes


############################################
#QUESTION 6. UTILISATION DES TABLEAUX NUMPY
############################################
#chaque tableau contient N valeurs aléatoires suivant une loi uniforme
tab_T=rd.uniform(T-delta_T, T+delta_T, N)
tab_t1=rd.uniform(t1-delta_t1, t1+delta_t1, N)
tab_R0=rd.uniform(R0-delta_R0, R0+delta_R0, N)
tab_VAm=rd.uniform(VAm-delta_VAm, VAm+delta_VAm, N)
tab_VBm=rd.uniform(VBm-delta_VBm, VBm+delta_VBm, N)



############################################
#tableaux tab_R et tab_L calculés à partir des autres tableaux
############################################
tab_R=tab_R0*(tab_VAm/tab_VBm*np.cos(2*np.pi*tab_t1/tab_T)-1)
tab_L=tab_R0*tab_VAm/tab_VBm*np.sin(2*np.pi*tab_t1/tab_T)\
             /(2*np.pi/tab_T)

############################################
#Moyennes et écarts-types de Rmes et Lmes
############################################
Rmes=np.mean(tab_R)              #moyenne du tableau tab_R
u_Rmes=np.std(tab_R, ddof=1)     #écart-type du tableau tab_R
                                 #avec N-1 au dénominateur
Lmes=np.mean(tab_L)              #moyenne du tableau tab_L
u_Lmes=np.std(tab_L, ddof=1)     #écart-type du tableau tab_L
                                 #avec N-1 au dénominateur
print()
print('Rmes = {:.3e}'.format(Rmes))
print('u(Rmes) = {:.1e}'.format(u_Rmes)) #incertitude-type de u_Rmes

print('Lmes = {:.3e}'.format(Lmes))
print('u(Lmes) = {:.1e}'.format(u_Lmes))   #incertitude-type de u_Lmes

