Partage
  • Partager sur Facebook
  • Partager sur Twitter

Méthode de Monte-Carlo pour approximer pi

    28 octobre 2023 à 9:59:11

    Bonjour, j'essaie d'appliquer la méthode de Monte-Carlo (pour obtenir une valeur approchée de pi) en Python mais je suis un peu surpris des résultats que j'ai obtenu car il me semblait qu'avec 539 354 tirages de points, j'étais censé obtenir une valeur approchée de pi à 10^-2 près. Mais j'obtiens une bien meilleure précision et je me demande donc si j'ai fait une erreur quelque part dans mon code ou s'il faut effectivement moins de tirages pour obtenir une précision d'un centième...

    Voici mon code :

    from random import random, choice
    from math import pi
    import numpy
    from numpy.random import rand
    
    
    def simulX():
        x, y = random(), random()
        return int(x**2+y**2<=1)
    
    def calculer_Sn(n=1000):
        x = rand(n)
        y = rand(n)
        return numpy.sum(x**2+y**2<=1)
    
    def calculer_Pn(n=1000):
        return 4*calculer_Sn(n)/n
    
    def approxpi():
        return calculer_Pn(539354)
    
    #Sur 1000 essais, on obtient, a priori, en moyenne, un écart à pi très largement inférieur 10^-2
    print(sum(abs(approxpi()-pi) for x in range(1000))/1000)



    Merci par avance pour vos réponses,

    Bonne journée.

    -
    Edité par LapinLapinou 28 octobre 2023 à 10:03:43

    • Partager sur Facebook
    • Partager sur Twitter
      28 octobre 2023 à 19:42:18

      Par quelle magie a été estimé le nombre de tirages (539 354)? Quelle est l'erreur sur cette estimation?

      Si on dit que la suite converge vers Pi, il suffit de s'arrêter lorsque la différence entre deux tirages successifs est plus petite que la précision désirée (notez que la phrase commence avec un "si").

      • Partager sur Facebook
      • Partager sur Twitter
        29 octobre 2023 à 11:33:31

        mps a écrit:

        Par quelle magie a été estimé le nombre de tirages (539 354)? Quelle est l'erreur sur cette estimation?

        Si on dit que la suite converge vers Pi, il suffit de s'arrêter lorsque la différence entre deux tirages successifs est plus petite que la précision désirée (notez que la phrase commence avec un "si").

        Le corrigé ici donne la valeur de 539 354 : https://www.bibmath.net/ressources/justeunexo.php?id=3090

        Désolé, je ne suis pas sûr de votre dernière phrase car l'estimation de pi par la méthode de Monte-Carlo inclue une bonne part de hasard.



        -
        Edité par LapinLapinou 29 octobre 2023 à 11:34:34

        • Partager sur Facebook
        • Partager sur Twitter
          29 octobre 2023 à 11:59:58

          LapinLapinou a écrit:

          Le corrigé ici donne la valeur de 539 354 : https://www.bibmath.net/ressources/justeunexo.php?id=3090

          Le corrigé est cohérents avec leurs hypothèses mais probabilités/statistiques sont des sujets qui n'ont rien à voir avec Python.

          note: si vous suivez les consignes vous allez obtenir le même résultat... valider le raisonnement est autre chose.
          • Partager sur Facebook
          • Partager sur Twitter
            29 octobre 2023 à 12:05:05

            mps a écrit:

            LapinLapinou a écrit:

            Le corrigé ici donne la valeur de 539 354 : https://www.bibmath.net/ressources/justeunexo.php?id=3090

            Le corrigé est cohérents avec leurs hypothèses mais probabilités/statistiques sont des sujets qui n'ont rien à voir avec Python.

            note: si vous suivez les consignes vous allez obtenir le même résultat... valider le raisonnement est autre chose.


            En fait, je veux savoir s'il y a une erreur dans mon code Python ; si oui, c'est que le nombre de tirages de points est censé être exact ; sinon, c'est que la valeur obtenue dans le corrigé n'est pas correcte. Je ne demande pas de m'expliquer mathématiquement ce qui ne va pas dans le corrigé si l'erreur est dans le corrigé ... Mais j'aurais peut-être plutôt tendance à dire que c'est moi qui ai fait une erreur et j'aimerais bien savoir où...
            • Partager sur Facebook
            • Partager sur Twitter
              29 octobre 2023 à 13:41:23

              LapinLapinou a écrit:

              En fait, je veux savoir s'il y a une erreur dans mon code Python ; si oui, c'est que le nombre de tirages de points est censé être exact ; sinon, c'est que la valeur obtenue dans le corrigé n'est pas correcte.

              ?!? On vous donne le corrigé non? La différence avec votre code est que vous faites faire la boucle par numpy alors que dans la solution les itérations sont dans le code. Le résultat sera le même.

              Et s'il y a quelque chose a secouer la dedans c'est les proba/stats qui conduisent à  539354 ce qu'on appelle la conception. Elle est la même dans les deux cas, la réalisation change mais donnera un code plus rapide avec les boucles faites par numpy (on l'espère). 

              Soit vous refaites le calcul (la conception, et c'est pas du Python) soit vous faites avec.

              *edit* La seule chose qui me semble discutable dans votre code est la dernière ligne. L'énoncé dit "Combien suffit-il de tirer de points pour que Pn constitue une approximation de π à 102 près, avec une probabilité supérieure ou égale à 95%?" => sur 1000 essais au moins 950 devraient être à 102 près. Votre code calcule autre chose.

              -
              Edité par mps 29 octobre 2023 à 14:20:02

              • Partager sur Facebook
              • Partager sur Twitter
                29 octobre 2023 à 19:10:32

                mps a écrit:

                LapinLapinou a écrit:

                En fait, je veux savoir s'il y a une erreur dans mon code Python ; si oui, c'est que le nombre de tirages de points est censé être exact ; sinon, c'est que la valeur obtenue dans le corrigé n'est pas correcte.

                ?!? On vous donne le corrigé non? La différence avec votre code est que vous faites faire la boucle par numpy alors que dans la solution les itérations sont dans le code. Le résultat sera le même.

                Et s'il y a quelque chose a secouer la dedans c'est les proba/stats qui conduisent à  539354 ce qu'on appelle la conception. Elle est la même dans les deux cas, la réalisation change mais donnera un code plus rapide avec les boucles faites par numpy (on l'espère). 

                Soit vous refaites le calcul (la conception, et c'est pas du Python) soit vous faites avec.

                *edit* La seule chose qui me semble discutable dans votre code est la dernière ligne. L'énoncé dit "Combien suffit-il de tirer de points pour que Pn constitue une approximation de π à 102 près, avec une probabilité supérieure ou égale à 95%?" => sur 1000 essais au moins 950 devraient être à 102 près. Votre code calcule autre chose.

                -
                Edité par mps il y a environ 4 heures


                La dernière ligne ne sert qu'à tester ce qu'il y avait avant pour déboguer et elle montre que la précision moyenne des valeurs estimées est de 0.0018474897278071376 par exemple (avec un test mais cela peut varier à cause du hasard) pour 1 000 estimations.

                • Partager sur Facebook
                • Partager sur Twitter

                Méthode de Monte-Carlo pour approximer pi

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown