Bonjour,
Pour "m'amuser" un peu à prendre en main la librairie numpy de python, j'ai fais un petit programme classique qui calcule Pi via une méthode Monte Carlo.
C'est un cas d'école où l'on tire aléatoirement des coordonnées x et y d'un point dans un intervalle [0;1] et tous les points dans le quart de cercle de rayon sont ceux qui vérifient x^2+y^2 < 1. A l'infini, le rapport du nombre de point dans le cercle sur le nombre de point total correspond au rapport des surfaces et vaut donc pi/4. Cette méthode est particulièrement inefficace mais ce n'était pas le but.
J'ai codé ça en faisant b paquets de n points. Chaque paquet produit une approximation de pi. Si j'affiche la moyenne de mes b valeurs de pi, j'obtiens mon approximation de pi. Mais je peux aussi calculé la déviation standard de mes paquets. Elle m'a semblé élevée, et en y réfléchissant, ce que je veux c'est que chaque paquet renforce ma confiance dans mon résultat, hors l'écart type tel que calculé ne me donne que l'écart entre mes b valeurs de pi.
J'ai donc, pour vérifié, regardé l'évolution de la déviation standard en fonction du nombre de paquet, elle ne diminue pas. J'ai donc affiché la déviation standard divisée par la racine du nombre de paquet utilisés pour chaque paquet et là, elle me semble avoir une allure plus "juste". Je pense avoir eu raison de faire cette division, mais je n'arrive pas à trouver de justification ou de doc (gratuite du moins) la dessus. Les formules généralement indiquées ne parlent que de la somme des écarts à la moyenne, sans préciser de racine de N. Est-ce que la démarche est la bonne ?
Merci
PS : Question bonus, finalement quel intérêt de faire b paquets de n point par rapport à faire n*b points tout de suite ?
Le code :
Code:import numpy as np from matplotlib import pyplot as plt n = 50000 b = 1000 T = np.square(np.random.rand(n,b))+np.square(+np.random.rand(n,b)) T = np.sum(T < 1,axis=0)/n*4 print(np.mean(T),np.std(T)/np.sqrt(b)) plt.hist(T, bins = np.arange(3.1,3.18,0.001)) plt.show() L = [np.std(T[:i])/np.sqrt(i) for i in range(1,len(T))][1:] plt.plot(L) plt.show() M = [np.mean(T[:i]) for i in range(1,len(T))][1:] plt.plot(M) plt.show()
-----