import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as st



###################Exercice 4.1#########################

##1
N=2000
X=st.binom.rvs(1,0.5,size=N)

##2
#Y_n converge vers E(X_1)=p=0.5 avec probabilité 1 
#(cette convergence est dite presque sure)

##3
#solution 1:
Y=[np.mean(X[:i]) for i in range(1,N+1)]    
#ou 
Y=[np.mean(X[:(n+1)]) for n in range(N)]

#solution 2:
y=np.cumsum(X)/(1+np.arange(N))



##4
plt.plot(np.arange(1,N+1),Y)
plt.plot(np.arange(1,N+1),np.repeat(0.5,N),color="red")
plt.title("Illustration de la LGN pour B(1/2)")
plt.show()

##5
N=2000
X=st.norm.rvs(1,2,size=N)#Attention donner écart-type 2! et pas 4

x=np.linspace(-9,9,900)

plt.hist(X,density=True,bins=20)
plt.plot(x,st.norm.pdf(x,1,2),color="red")
plt.title("Simulation et densité pour N(1,4)")



##6
#Attention donner écart-type 2! et pas 4
Xbar=np.cumsum(X)/(1+np.arange(N))
plt.plot(Xbar)
plt.plot(np.repeat(1,N),color="red")
plt.title("Illustration de la  LGN pour N(1,4)")



###################Exercice 2.2 #########################

#1

n=100
N=1000
X=st.expon.rvs(size=(N,n),loc=0,scale=1)

xbar1=[np.mean(X[i,0]) for i in range(N)]
xbar3=[np.mean(X[i,0:3]) for i in range(N)]
xbar100=[np.mean(X[i,0:100]) for i in range(N)]

v1=np.asarray(xbar1)-1.0
v3=np.sqrt(3)*(np.asarray(xbar3)-1)
v100=np.sqrt(100)*(np.asarray(xbar100)-1)

#2
fig, ax = plt.subplots(1,3)
ax[0].hist(v1)
ax[1].hist(v3)
ax[2].hist(v100)

#Solutilon générale 1 et 2
res=np.zeros((n,N))

for i in np.arange(n):
    xbar=[np.mean(X[j,0:(i+1)]) for j in range(N)]
    res[i]=np.sqrt(i+1)*(np.asarray(xbar)-1)
#v1=res[0];v3=res[2];v100=res[99];
        
 
    
fig, ax = plt.subplots(1,3)
ax[0].hist(res[0])
ax[1].hist(res[2])
ax[2].hist(res[99])
fig.suptitle("TCL pour loi $\mathcal{E}$(1)")
plt.show()

      
#3


n=100
N=1000
X=st.expon.rvs(size=(N,n),loc=0,scale=1)

xbar1=[np.mean(X[i,0]) for i in range(N)]
xbar3=[np.mean(X[i,0:3]) for i in range(N)]
xbar100=[np.mean(X[i,0:100]) for i in range(N)]

v1=np.asarray(xbar1)-1.0
v3=np.sqrt(3)*(np.asarray(xbar3)-1)
v100=np.sqrt(100)*(np.asarray(xbar100)-1)

fig, ax = plt.subplots(1,3)
ax[0].hist(v1,density=True)
ax[1].hist(v3,density=True)
ax[2].hist(v100,density=True)
fig.suptitle("TCL pour loi $\mathcal{E}$(1)")
x=np.linspace(-5,5,1000)
ax[0].plot(x,st.norm.pdf(x))
ax[1].plot(x,st.norm.pdf(x))
ax[2].plot(x,st.norm.pdf(x))
plt.show()

#4
#Comme on compare la densité aux histogrammes, on illustre 
#la convergence en loi, car a fortiori, les aires représentant
# la fonction de répartition vont converger
#Mais en fait on illustre même une convergence un peu plus forte
# que vous n'avez pas étudié
# à savoir la convergence locale.


###################Exercice 2.3 #########################
##1
N=10000
M=5000
p=0.5
S=st.binom.rvs(N,p,size=M)
def varTCL(x):
    return((x/N-p)/np.sqrt(p*(1-p)/N))
#fonction donnant VN à partir de SN
V=[varTCL(x) for x in S]

## 2
plt.hist(V,bins=20,density=True)
x=np.linspace(start=-3,stop=3,num=600)
plt.plot(x,st.norm.pdf(x),color="red")
plt.show()
