TP19 Estimation Méthode de Monte-Carlo (1) Classe entière Méthode de Monte-Carlo : Ce terme désigne toute méthode permettant d’évaluer une valeur en utilisant les probabilités et en répétant des expériences aléatoires. Le nom de ces méthodes fait allusion aux jeux de hasard pratiqués à Monte-Carlo , elle a été inventée par le physicien grécoaméricain Nicholas Metropolis ( 1915-1999 ). Un premier exemple : par calcul d’une probabilité On veut donner une valeur approchée de par la méthode de Monte-Carlo. Pour ce faire, on définit deux variables aléatoires X 1 , X2 indépendantes de même loi uniforme sur [ 0 , 1 ]. 1Calculer la probabilité P [ X1² + X2² ≤ 1 ] et illustrer ce résultat graphiquement. 2Ecrire un script permettant d’afficher une valeur approchée de par cette méthode. N=1000000 X= rand(2,N) Y=X(1,:).^2+X(2,:).^2 p=length(find(Y<1))/N*4 disp(p,'Valeur approchée de pi : ') disp(%pi,'Valeur exacte de pi :') // graphique plot([0,0],[1,0],[1,1],[0,1],[0,0]) theta=[0:0.1:%pi/2] plot(cos(theta), sin(theta),'red') plot2d(X(1,:),X(2,:),-1) Valeur approchée de pi : 3.14274 Valeur exacte de pi : 3.1415927 Quel théorème du cours assure la convergence de p vers lorsque N tend vers + ? Observer la vitesse de convergence. Un deuxième exemple : à l’aide d’une fonction de répartition On veut calculer la somme 1Proposer une méthode de Monte-Carlo pour le calcul de cette somme. 2Ecrire plusieurs scripts répondant à la question. 3Proposer un calcul direct sur ordinateur. Comparer les différents résultats obtenus N=1000 X=grand(1,N,'poi',5) // Avec Tabul et cumsum T=tabul(X,'i') T(:,3)=cumsum(T(:,2)/N)*exp(5) disp(T) // Avec length et find L=length(find(X<=10))/N disp(L*exp(5)) // Avec cdfpoi x=10 P=cdfpoi('PQ',x,5) disp(P*exp(5)) // Calcul direct k=[1:x] S=1 + sum(5.^k ./ cumprod(k)) disp(S) Avec tabul et cumsum : 0. 9. 1.3357184 1. 41. 7.420658 2. 101. 22.410387 3. 131. 41.852511 4. 164. 66.192269 5. 177. 92.461398 6. 144. 113.83289 7. 103. 129.11945 8. 58. 137.72741 9. 39. 143.51552 10. 21. 146.6322 11. 8. 147.81951 12. 3. 148.26475 13. 1. 148.41316 Avec length et find : 146.6322 Avec cdfpoi : 146.3806 Par calcul direct : 146.3806 Quel théorème du cours assure la convergence L * exp(5) vers la somme cherchée quand N tend vers + ? Observer la vitesse de convergence. Donner une variante du dernier calcul à l’aide d’une boucle for. Un troisième exemple : à l’aide d’une espérance On veut 123- calculer l’intégrale Montrer que cette intégrale est l’espérance d’une variable aléatoire de loi connue. Ecrire le script correspondant au calcul approchée de cette intégrale Comparer avec la commande « integrate » Par l'espérance avec N = 1 000 : 0.8401357 Par l'espérance avec N = 10 000 : 0.8313303 Par l'espérance avec N = 100 000 : 0.8357538 N=1000 X=rand(1,N) Y=(1+X.^3).^(-1) m=sum(Y)/N disp(m,'Par l''espérance : ') // calcul avec "integrate" disp(integrate('1/(1+x^3)','x',0,1),'Par integrate : ') Par integrate : 0.8356488 Quel théorème permet d’affirmer que m converge vers quand N tend vers + ? Que dire de la vitesse de convergence ? Evaluation de l’erreur d’approximation : On sait par la loi faible des grands nombres que les valeurs empiriques obtenues tendent vers la valeur cherchée quand N vers +. Mais comment évaluer l’erreur d’approximation ? 1) par l’inégalité de Bienaymé-Tchebychev On veut estimer J = = E( ) où X ↪ U [ 0 , 1 ] On considère un N-échantillon (X1 , ... , XN) indépendant et identiquement distribué de loi U [ 0 , 1 ]. i ⟦ 1 , n ⟧ , Yi = ; on note , E( ) = J , V( ) = > 0, P [ | - J | ] ≤ donc P[ J [ -, +])1- Si on veut que cette probabilité soit supérieure ou égale à 95%, on prendra : = Le problème est que l’on ne connaît pas l’écart-type de Y1 . Scilab calcule l’écart-type empirique par la commande st_deviation. eps = st_deviation(Y)/ sqrt(0.05*N) disp(m+eps,' et ',m-eps,'l''intégrale est comprise entre ') l'intégrale est comprise entre 0.8134900 et 0.8590063 2) par le théorème central limite. converge en loi vers X* ↪ N (0,1) donc P[ | P( | ≤ ] 2 () – 1 où est la fonction de répartition de X* - J | ≤ ) 0.95 pour 2 () = 1.95 ce qui donne = -1(0.975) 0.8352 et = eps1= 0.8352*st_deviation(Y)/sqrt(N) disp(m+eps1,' et ',m-eps1,'l''intégrale est comprise entre ') Comparer les deux méthodes. l'intégrale est comprise entre 0.8265550 et 0.8350703