algorithme (méthode de Monté-Carlo)
-
Zzinastar dernière édition par
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
-
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]
-
Zzinastar dernière édition par
*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 nombreDEBUT 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.
-
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)=xe−x2 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 ...
-
Zzinastar dernière édition par
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.
-
Zzinastar dernière édition par
Oui pour la fonction j'ai enfin compris où était mon erreur ! Merci de m'avoir éclairé !
-
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.
-
Zzinastar dernière édition par
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 ?
-
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"
-
Zzinastar dernière édition par
D'accord, merci beaucoup pour vos réponses simples et efficaces, bonne continuation !
-
De rien.
Bonne continuation à toi aussi !