Exponentielle et génération aléatoire en VBA

Fermé
Raphael025 Messages postés 2 Date d'inscription samedi 19 février 2011 Statut Membre Dernière intervention 19 février 2011 - 19 févr. 2011 à 20:52
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 - 20 févr. 2011 à 00:02
Bonjour,

Mon premier post sur ce forum !

J'ai observé un problème dans une macro excel :


Sub Test()
 
Randomize
  
   
Dim a As Double
Dim b As Double
Dim g As Double
 
Dim i As Integer
 
For i = 1 To 5000
 
a = Rnd()
b = Rnd()
      
g = Sqr(0.1) * Sqr(-2 * Log(a)) * Cos(2 * WorksheetFunction.Pi * b)
 
Range("A" & i).Value = g
Range("B" & i).Value = 10 * Exp(g)
 
 
Next
 
End Sub



J'utilise l'algorithme usuel de génération de gaussienne et j'en prend l'exponentielle. Par théorème, la moyenne des exponentielles devrait être l'exponentielle de la moyenne des gaussiennes et donc 1.

Or, en calculant la moyenne des valeurs obtenues sur ma feuille excel, je trouve un résultat systématiquement supérieur à 10. Le plus souvent ~10.5, ce qui me paraît vraiment élevé pour être une simple erreur d'estimation ( surtout avec 5000 tirages).

Alors je me demande à quoi est du mon erreur ? Ma programmation, un arrondi malheureux, une exponentielle douteuse ?

Merci énormément et à bientôt !

Raphaël
A voir également:

3 réponses

eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 247
Modifié par eriiic le 19/02/2011 à 23:01
Bonsoir,

Je ne connais pas ton algorithme usuel mais un piège classique sur vba :
avec log on s'attend à travailler avec le log décimal or il s'agit du log népérien.
Si jamais...

eric

edit:
Par théorème, la moyenne des exponentielles devrait être l'exponentielle de la moyenne des gaussiennes et donc 1.
Je vais peut-être dire une bétise mais tu mets 10 * Exp(g) et non Exp(g), c'est peut-être normal que tu trouves une valeur 10 fois plus élevée (?)
0
Raphael025 Messages postés 2 Date d'inscription samedi 19 février 2011 Statut Membre Dernière intervention 19 février 2011
Modifié par Raphael025 le 19/02/2011 à 23:17
Bonsoir Eric,

Merci beaucoup pour ta réponse.

L'algorithme usuel est en fait celui de Box-Muller :

https://www.taygeta.com/random/gaussian.html

Il s'agit du log népérien qui est utilisé.

Je me demande vraiment s'il y'a un erreur dans mon code, ou si c'est l'arrondi qui plante...La suite converge rapidement vers 10.5 alors qu'elle devrait converger vers 10.

edit :

La moyenne de 10*Exp(g) devrait être 10 fois la moyenne de Exp(g) soit 10*1.
0
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 247
20 févr. 2011 à 00:02
Si tu es sûr de ton algorithme on peut supposer des erreurs d'arrondis (courants et normaux dans excel, amplifiés par l'exponentielle (?))
Sur ce site on trouve des fonctions plus précises dont AleaStable() qui permet de générer des nombres selon une loi normale (est-ce réellement ce que tu veux, pas sûr).
Peut-être pas vraiment adapté à ton pb (j'avoue être dépassé) mais si ça te permet de générer une suite de meilleure qualité. A toi de voir...
eric
0