#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Tue Jan 23 13:51:20 2024

@author: matthieu
"""

#Modules
import numpy as np
import numpy.random as rd
import matplotlib.pyplot as plt



#%%  uniforme
#tracer de la densité
def unif_densite(x):
    if x<0:
        return 0
    elif 0<x<1:
        return 1
    else:
        return 0
    
X=np.arange(-1,2,0.001)
Y=[unif_densite(x) for x in X]
plt.plot(X,Y)

D=rd.random(10000)
plt.hist(D,color='goldenrod',density=True,bins=15)
plt.show()


#%%Repartition


def uniforme_repartition(x):
    if x<0:
        return 0
    elif 0<x<1:
        return x
    else:
        return 1
    
X=np.arange(-1,2,0.001)
Y=[uniforme_repartition(x) for x in X]
plt.plot(X,Y)

D=rd.random(10000)
plt.hist(D,color='goldenrod',density=True,cumulative=True,bins=15)
plt.show()


## Uniforme générale


def uniforme(a,b,n):
    L=[]
    for i in range(n):
        L.append((b-a)*rd.random()+a)
    return L


def uniforme_densite(x,a=0,b=1):
    if x<a:
        return 0
    elif a<x<b:
        return 1/(b-a)
    else:
        return 0
    
X=np.arange(0,4,0.001)
Y=[uniforme_densite(x,1,3) for x in X]
plt.plot(X,Y)

D=uniforme(1, 3, 10000)
plt.hist(D,color='goldenrod',density=True,bins=15)
plt.show()


#%%Repartition


def uniforme_repartition(x,a=0,b=1):
    if x<a:
        return 0
    elif a<=x<b:
        return (x-a)/(b-a)
    else:
        return 1
    
X=np.arange(0,4,0.001)
Y=[uniforme_repartition(x,1,3) for x in X]
plt.plot(X,Y)

D=uniforme(1, 3, 10000)
plt.hist(D,color='goldenrod',density=True,bins=15,cumulative=True)
plt.show()



##%% Expo
def exponentielle_densite(x,λ=1):
    if x<0:
        return 0
    else:
        return λ*np.exp(-λ*x)
    
def exponentielle_repartition(x,λ=1):
    if x<0:
        return 0
    else:
        return 1-np.exp(-λ*x)
    
def exponentielle(λ,n):
    L=rd.random(n)
    for i in range(n):
        L[i]=-np.log(1-L[i])/λ
    return L

#%% test densité

X=np.arange(0,4,0.001)
Y=[exponentielle_densite(x,1) for x in X]
plt.plot(X,Y)

D=exponentielle(1, 10000)
plt.hist(D,color='goldenrod',density=True,bins=15,cumulative=False)
plt.show()


#%% Si lambda diminue l'espérance augmente et la croube s'étale vers la droite

X=np.arange(-1,4,0.001)
Y=[exponentielle_densite(x,1) for x in X]
plt.plot(X,Y)
Y=[exponentielle_densite(x,0.5) for x in X]
plt.plot(X,Y)
Y=[exponentielle_densite(x,2) for x in X]
plt.plot(X,Y)


plt.show()


#%% test répartition

X=np.arange(0,4,0.001)
Y=[exponentielle_repartition(x,1) for x in X]
plt.plot(X,Y)

D=exponentielle(1, 10000)
plt.hist(D,color='goldenrod',density=True,bins=15,cumulative=True)
plt.show()


#%% loi normales


def normale_densite(x,μ,σ):
    a=1/(σ*np.sqrt(2*np.pi))
    return a*np.exp(-(x-μ)**2/(2*σ**2))
#%% variation de l'espérance décalage sur l'axe des abscisses
X=np.arange(-4,6,0.001)
Y=[normale_densite(x,0,1) for x in X]
plt.plot(X,Y,color="teal")

Y=[normale_densite(x,1,1) for x in X]
plt.plot(X,Y,color="orchid")

Y=[normale_densite(x,3,1) for x in X]
plt.plot(X,Y,color="goldenrod")


plt.show()
#%% variation de l'écart-type mofification de la largeur et de la hauteur
X=np.arange(-6,6,0.001)
Y=[normale_densite(x,0,1) for x in X]
plt.plot(X,Y,color="teal")

Y=[normale_densite(x,0,2) for x in X]
plt.plot(X,Y,color="orchid")

Y=[normale_densite(x,0,0.5) for x in X]
plt.plot(X,Y,color="goldenrod")


plt.show()




#%%
from scipy.stats import norm
def Φinv(x):
    return norm.ppf(x)

X=np.arange(0,1,0.001)
Y=[Φinv(x) for x in X]
plt.plot(X,Y,color="teal")

#%%

def normale_cr(n):
    L=list(rd.random(n))
    for i in range(len(L)):
        L[i]=Φinv(L[i])
    return L

#%%


X=np.arange(-7,7,0.001)
Y=[normale_densite(x,0,1) for x in X]
plt.plot(X,Y)

D=normale_cr(10000)
plt.hist(D,color='goldenrod',density=True,bins=30,cumulative=False)
plt.show()




#%%


#%%

def normale(n,μ=0,σ=1):
    L=list(rd.random(n))
    for i in range(len(L)):
        L[i]=σ*Φinv(L[i])+μ

    return L

#%%


X=np.arange(-4,4,0.001)
Y=[normale_densite(x,1,2) for x in X]
plt.plot(X,Y)

D=normale(10000,1,2)
plt.hist(D,color='goldenrod',density=True,bins=15,cumulative=False)
plt.show()


#%%
M1=list(rd.exponential(2,150))
M2=list(rd.normal(0,1,150))
M3=list(rd.exponential(0.5,150))
M4=list(rd.normal(-1,2,150))
#%%
N1=normale(1000,0,1)
N2=normale(1000,0,1)
L=[]
for i in range(len(N1)):
    L.append(N1[i]+N2[i])
plt.hist(L,bins=25)
plt.show()
print(np.mean(L),np.std(L))


#%%
def Xbarre(n,N):
    L=[]
    for i in range(N):
        L.append(sum(uniforme(-1,1,n))/np.sqrt(n/3))
    return L
    

#%% Chi2
def χ2(n,k):
    L=[]
    for i in range(n):
        s=0
        R=normale(k)
        for x in R:
            s+=x**2
        L.append(s)
    return L
#%%
import  scipy.stats as stats
X=np.arange(0,4,0.001)
plt.figure(dpi=1200)
plt.ylim(0,0.8)
plt.plot(X,stats.chi2.pdf(X,1),label='k=1',linestyle='solid')
plt.plot(X,stats.chi2.pdf(X,2),label='k=2',linestyle='dotted')
plt.plot(X,stats.chi2.pdf(X,4),label='k=4',linestyle='dashed')
plt.plot(X,stats.chi2.pdf(X,7),label='k=7',linestyle='dashdot')

plt.title("densités des lois χ² ")
plt.legend()
plt.show()

#%% student
def student(n,k):
    L=[]
    N=normale(n)
    C=χ2(n,k)
    for i in range(n):
        L.append(N[i]/np.sqrt(C[i]/k))
    return L
#%%

X=np.arange(-4,4,0.001)
plt.plot(X,stats.t.pdf(X,1),label='k=1',linestyle='solid')
plt.plot(X,stats.t.pdf(X,2),label='k=2',linestyle='dashed')
plt.plot(X,stats.t.pdf(X,4),label='k=4',linestyle='dashdot')
plt.plot(X,stats.t.pdf(X,10),label='k=10',linestyle='dotted')
plt.title("densités des lois de Student ")
plt.figure(dpi=1200)
plt.legend()
#plt.show()


import matplotlib
matplotlib.use("pgf")
matplotlib.rcParams.update({
    "pgf.texsystem": "pdflatex",
    'font.family': 'serif',
    'text.usetex': True,
    'pgf.rcfonts': False,
})
plt.savefig("DensitesStudent.pgf")
