algorithme (méthode de Monté-Carlo)


  • Z

    Je dois programmer l'algorithme suivant sur algobox mais il ne fonctionne pas certainement à cause d'une mauvaise entrée de données de ma part.

    initialisation: affecter à n la valeur 0.

    traitement: pour k allant de 1 à 1000
    -affecter à x un nombre aléatoire sur [0;1]
    -affecter à y un nombre aléatoire sur [0;1]
    -si y≤ xe^-x^2, alors:
    -affecter à n la valeur n+1
    fin de "si".
    fin de "pour".

    sortie: I prend la valeur n/1000.
    afficher I.

    D'après moi, cet algorithme devrait m'afficher I, soit le nombre de boucles où les valeurs de y sont inférieures ou égales à la fonction xe^-x^2


  • mtschoon

    Bonjour ! ( un petit "Bonjour" fait plaisir )

    Ta démarche est bonne , mais il y a quelques erreurs de syntaxe.

    Je viens de taper un algorithme ( peu élégant ! ) qui fonctionne et donne une valeur approchée de l'intégrale très correcte. Modifie le comme tu le souhaites.

    *Remarques :

    avec Algobox , la valeur par défaut d'une variable nombre est 0 ; l'initialisation de n à 0 est automatique mais rien n'empêche que tu l'écrives dans l'algorithme pour que ton professeur ne pense pas que tu l'as oubliée...*

    La fonction random donne un nombre aléatoire compris entre 0 ( inclus) et 1 (exclus ), c'est à dire appartenant à [0,1[
    Adapte si tu veux avoir [0,1]

    fichier math


  • Z

    *Bonjour oui (désolée)

    Merci beaucoup pour la réponse, je vais le tester de mon côté mais il me semble qu vous ayez tout à fait raison !

    En attendant votre réponse voici ce que j'avais testé, j'ai eu beaucoup de mal à entrer la fonction sur algobox 😕

    VARIABLES:

    n est du type nombre
    k est du type nombre
    x est du type nombre
    y est du type nombre
    i est du type nombre

    DEBUT ALGORITHME
    n PREND LA VALEUR 0
    POUR K ALLANT DE 1 à 1000
    DEBUT POUR
    X PREND LA VALEUR RANDOM()
    Y PREND LA VALEUR RANDOM ()
    SI Y<=xexp(pow(-x,2)) ALORS
    DEBUT SI
    n PREND LA VALEUR n+1
    FIN SI
    i PREND LA VALEUR n/1000
    AFFICHER i
    FIN ALGORITHME

    (après plusieurs essais celui ci fut également peu concluant)

    Merci encore.


  • mtschoon

    Dans ton algorithme , l'écriture de la fonction est bizarre car tu as élevé -x à la puissance 2

    Regarde bien ton énoncé

    f(x)=xe−x2f(x)=xe^{-x^2}f(x)=xex2 veut dire que c'est x qui est à la puissance 2 , non -x ( tu peux utiliser pow(x,2) au lieu dex×xx\times xx×xsi tu le souhaites ( c'est pareil )

    Si -x était à la puissance 2 , ce serait f(x)=xe(−x)2f(x)=xe^{(-x)^2}f(x)=xe(x)2

    Comme (-x)²=x² , f(x)=xex2f(x)=xe^{x^2}f(x)=xex2 ...


  • Z

    Je viens de tester l'algorithme.
    Effectivement il fonctionne, merci !

    J'ai cependant quelques questions:

    j'ai changer le Random() car il exclut 1, je l'ai remplacé par ALGOBOX_ALEA_ENT(0;1)
    Cela convient-il ?

    et je ne comprends pas le "AFFICHER i voisin de"
    Je ne peux pas mettre simplement AFFICHER la variable i en cochant ajouter un retour à la ligne ?

    Modifié ainsi l'algorithme marche aussi 🙂

    Merci de votre réponse par avance.


  • Z

    Oui pour la fonction j'ai enfin compris où était mon erreur ! Merci de m'avoir éclairé !


  • mtschoon

    Je te conseille de vérfier la signification de ALGOBOX_ALEA_ENT(0;1) ...

    "AFFICHER I voisin de" est seulement du texte pour rendre le résultat plus convivial
    Il y a ainsi écrit "I voisin de" qui sera suivi de la valeur numérique de n/1000
    Mais , tu fais à ta façon !

    Pour que tu puisses vérifier ( en testant ton algorithme ) je te mets les valeurs

    Mathématiquement :

    $\Bigint_0^1xe^{-x^2}dx=\frac{1-e^{-1}}{2}$ à la calculette cela fait environ 0.316

    L'agorithme demandé doit donner environ0.306

    Remarque : si tu modifies les valeurs de k en faisant varier k de de 1 à 10000 , l'algorithme de donnera environ 0.313
    Plus le nombre de tours est grand , plus la précision est bonne.


  • Z

    Sur algobox il est indiqué que ALGOBOX_ALEA_ENT(p,n) renvoie un entier pseudo-aléatoire compris entre p et n.
    J'ai pensé que c'était mieux par rapport au "random()" car 1 ne doit pas être exclus et je ne savais pas comment faire autrement...

    Lorsque k varie j'avais également remarqué la même chose, on obtient un résultat avec 10^-4.

    Le calcul de mon intégrale était bon également, en revanche je ne comprends pas comment on peut obtenir le 0.306 avec l'algorithme car celui ci me donne toujours un nombre aléatoire compris entre 0 et 1; j'obtiens par exemple 0.313 0.313 ou 0.287 ... A priori je pense que c'est normal donc je ne dois pas obtenir forcément 0.306 ?


  • mtschoon

    x et y sont des réels compris entre 0 et 1

    On n'obtient pas forcement 0.306 vu que les points sont "aléatoires"


  • Z

    D'accord, merci beaucoup pour vos réponses simples et efficaces, bonne continuation !


  • mtschoon

    De rien.
    Bonne continuation à toi aussi !


Se connecter pour répondre