'''INCERTITUDE SUR LA FREQUENCE DE COUPURE PAR LA METHODE DE MC'''

import numpy as np
import matplotlib.pyplot as plt


# Saisie par l'étudiant des valeurs expérimentales dans 3 tableaux
F=np.array([50,100,  200, 300, 400, 500, 600, 700, 800, 1000, 2000, 3000, 5000] )
Us=np.array([5.04, 5.00, 4.85, 4.52, 4.20, 3.88, 3.62, 3.32, 3.08, 2.64, 1.49,1.0, 0.6])
Ue=np.array([5.08, 5.08, 5.08, 5.08, 5.08, 5.08, 5.08, 5.08, 5.08, 5.08, 5.08,  5.08, 5.04])

# Définition du Gain et linéarisation de l'expression
G = Us/Ue
X=F**2
Y=1/(G**2)

# Saisie des incertitudes-type sur F, Ue et Us
u_Us = 0.1 # en V
u_Ue = 0.1 # en V
u_F = 5    # en Hz

# Réalisation de la simulation MC de N expériences aléatoires
N = 10000
n = len(F)
FC_sim=[] # liste des fréquences de coupures obtenues par simulation de chaque expérience aléatoire
OO=[]  # Liste des ordonnées à l'origine simulées

for i in range(N): # Stockage des valeurs issues du tirage aléatoire dans des tableaux
    F_sim = F + np.sqrt(3)*u_F*np.random.uniform(-1,1,n)
    Ue_sim = Ue + np.sqrt(3)*u_Ue*np.random.uniform(-1,1,n)
    Us_sim = Us + np.sqrt(3)*u_Us*np.random.uniform(-1,1,n)
    G_sim = Us_sim/Ue_sim
    X_sim = F_sim**2
    Y_sim = 1/(G_sim**2)

# Ajustement linéaire des résultats de chaque expérience aléatoire simulée
    a1_sim, b1_sim = np.polyfit(X_sim,Y_sim,1)
    FC_sim.append(1/np.sqrt(a1_sim))  #exploitation de la pente
    OO.append(b1_sim)  # valeur de l'ordonnée à l'origine

# Calcul de la valeur moyenne de la fréquence de coupure et de l'ordonnée à l'origine
FCmoy = np.average(FC_sim)
OOmoy = np.average(OO)

# Calcul de l'incertitude-type sur la fréquence de coupure
u_FC=np.std(FC_sim,ddof=1)

# Affichage des résultats avec 2 décimales
print("valeur moyenne de la fréquence de coupure =",round(FCmoy,2),"Hz")
print("Incertitude-type sur la fréquence de coupure =",round(u_FC,2),"Hz")
print("Valeur moyenne de l'ordonnée à l'origine =",round(OOmoy,2))


