"""

Thème 13 Simulation de variables à densité


"""

## Importations
import random as rd
import numpy  as np
import matplotlib.pyplot as plt

## Q1.a) Simulation de la loi uniforme U(a,b) : formule dans le cours

def Unif(a,b):
    return a + (b-a)*rd.random()

## Q1.b) Simulation de la loi exponentielle E(mu) : fait dans le cours

def expo(mu): # classique oral
    return -1/mu*np.log(Unif(0,1))

## Q1.c) Simulation de la loi normale N(m,sigma2)

# Pas de méthode, commande donnée dans le formulaire Agro-Veto pour
# la loi N(0,1). On sait dans le cours que si X suit une loi N(0,1),
# Y = m + sigma*X suit une loi N(m,sigma²)

def normale(m=0,sigma=1):
    X = rd.gauss(0,1)
    return  m+sigma*X

## Q2. Vérification graphique de la notion de simulation

# Simuler une VAR à densité, c'est programmer une fonction dont un
# grand nombre d'appel donne un histogramme des fréquences observées
# proche de la courbe de la densité théorique.

N = 100000 # Nombre de simulations
n = 50     # Nombre de bâtons de l'histogramme = rectangles.
           # n est donc relié à la  fréquence d'échantillonnage

L = [ normale() for _ in range(N)] # run de la loi N(0,1)

# Tracé de l'histogramme
#=======================
plt.hist(L,n, density=True, ec='white', alpha=0.7, label='Fréquences empiriques')
# Comparaison avec la densité théorique
#======================================
def gauss(x):
    C = np.sqrt(2*np.pi)
    return 1/C * np.exp(-x**2/2)
X = np.linspace(-3,3)
Y = gauss(X)
plt.plot(X,Y,'-r',label='Densité théorique')
# Légende et affichage
#=====================
plt.legend(loc='best')
plt.show()


## Pour la suite, s'équiper de papier et de crayon

## Q3. C'est la queston DM (planche oral récurrente !)

## Q3. a) simulation de Z = min deux lois exponentielles
def simZ(mu1,mu2):
    X1,X2 = expo(mu1), expo(mu2)
    if X1<X2:
        return X1
    return X2

## Q3. b) et c)

# D'après le calcul de la loi mathématique (DM, c'est exactement
# la même démonstration que l'exercice 1  du CH11 sur le min de deux lois
# géométriques), la loi de Z est exponentielle de paramètre a=mu1+mu2.

## Q3. d) Tracé de l'historgamme de Z

mu1,mu2 = 1,2
L = [ simZ(mu1,mu2) for _ in range(N)] # run de la loi N(0,1)

# Tracé de l'histogramme
#=======================
titre=r"Simulation de $Z=\min(X_1,X_2)$, $X_i \leadsto E(\mu_i)$"
plt.hist(L,n, density=True, ec='white', alpha=0.7, label=r'Fréquences empiriques de $Z$')
plt.title(titre)

# Tracé de la densité théorique
#==============================
def dens_exp(a,x):
    return a*np.exp(-a*x)

a = mu1+mu2
X = np.linspace(0,a)
Y = dens_exp(a,X)
plt.plot(X,Y,'-r',label=r'Densité $(\mu_1+\mu_2)e^{-(\mu_1+\mu_2)t}$')
plt.legend(loc='best')
plt.grid('on')
plt.show()

##Q4.

## Q4a)

# On trouve lambda = 1/2

## Q4b)

# On trouve que Y suit une loi exponentielle de param 1/2

## Q4c)

def simulX():
    Z = expo(1/2)
    Y = np.log(Z)
    return Y