Integrale par Monte-Carlo

Integrale par Monte-Carlo

Messagepar petitoliv » 03 Jan 2010 21:33

Bonjour,

voici un fichier donnant un exemple d'illustration du calcul d'une intégrale par la méthode de Monte-Carlo.
La fonction est stockée dans la macro "f"
Le calcul se fait par la macro : "Monte_Carlo(a,b,N)" (a et b : bornes d'intégration, N : nombre de points tirés aléatoirement).
Remarque lorsque N dépasse 1000, le tracé devient assez lent avec la version 1.94 du logiciel (ce qui n'était pas le cas avec 1.93). On peut remédier à ce problème par exemple en utilisant les commandes Pixel et Scr2Pixel. Des explications sont données par Patrick dans le post : http://texgraph.tuxfamily.org/forum/viewtopic.php?f=6&t=120

Cordialement,
Olivier.
Monte_carlo.teg
(1.72 Kio) Téléchargé 991 fois
petitoliv
 
Messages: 9
Inscription: 02 Jan 2010 23:19

Re: Integrale par Monte-Carlo

Messagepar P.Fradin » 03 Jan 2010 23:45

Merci olivier,

Je me suis penché un peu sur ce problème de vitesse lié à la commande Point. J'ai repris ton fichier et je l'ai modifié en ajoutant une nouvelle macro Qdot qui permet de dessiner rapidement les points (pixels en fait) et qui a son propre export. C'est un peu technique, mais ton exemple s'y prête bien. Voici la macro Qdot:

Code: Tout sélectionner
{Qdot( liste )}
MyExport("Qdot",%1)   


Elle appelle simplement la commande MyExport avec le suffixe Qdot et la liste de points. Tout réside dans la commande MyExport, elle fait ceci:

-> lors du rendu écran, la commande MyExport("Qdot", liste) va exécuter la macro DrawQdot( liste ), c'est à nous d'écrire cette macro, voici sa définition:

Code: Tout sélectionner
{DrawQdot( liste )}
Pixel(for $z in %1 do Scr2Pixel(z),Color od)


-> lors d'un export, la commande MyExport("Qdot", liste) va exécuter la macro ExportQdot( liste ), c'est à nous d'écrire cette macro, voici sa définition:

Code: Tout sélectionner
{ExportQdot( liste )}
[
$coul:=Lcolor(Color),
if ExportMode=tkz Or ExportMode=pgf then
   WriteFile([
   "\begin{pgfscope}%",LF,
   "\pgfsetfillcolor{rgb,1:red,",Round(coul[1],4),";green,",Round(coul[2],4),";blue,",Round(coul[3],4),"}",LF,
   $nb:=0,
   for $z in %1 do
       $A:=TeXCoord(z),Inc(nb,1),
       "\pgfpathcircle{\pgfxy(",Round(Re(A),4),",",Round(Im(A),4),")}{",Width/10,"pt}",
       "\pgfusepath{fill}",
       if nb=3 then LF, nb:=0 fi,
   od,
   "\end{pgfscope}%"])

elif ExportMode=eps then
     WriteFile([
     Round(coul[1],4)," ",Round(coul[2],4)," ",Round(coul[3],4)," setrgbcolor",LF,
     $nb:=0,
     for $z in %1 do
       $A:=EpsCoord(z),Inc(nb,1),
       Round(Re(A),4)," ",Round(Im(A),4)," 0.35 0 360 arc closepath fill ",{point assez fin}
       if nb=10 then LF, nb:=0 fi,
     od])
fi
]


J'ai mis un export pour tikz/pgf et un pour eps.

Au niveau de la macro Monte-Carlo, très peu de modifications:

Code: Tout sélectionner
[
{ Monte_Carlo(a, b, N)
  a : borne inférieure de l'intégrale
  b : borne supérieur de l'intégrale
  N : nombre de points aléatoire à produire
  Remarque : la fonction à intégrer est stockée dans la macro f}

  { On  évalue le Max de la fonction sur [a,b] }
  $max := \f(%1), $pas:= (%2-%1)/100,
  for x from %1+pas to %2 step $pas do
      $y:=\f(x),
      if y>$max then $max:=y fi,
  od,

  {Algorithme de Monte-Carlo}

  $H:= $max+0.5, $L:=%2-%1,
  $Aire := 0, N:=%3,  DotScale:=0.2,
  for j from 1 to N do
      $x:=Rand()*L+%1, $y:=Rand()*H,
       if ($y<=\f($x)) then
         Inc(Aire,1),
         Insert(blueList,x+i*y),
      else
         Insert(cyanList,x+i*y),
      fi
  od,
  Color:=blue, Qdot(blueList), Color:=cyan, Qdot(cyanList),
  Aire:=(Aire/N)*$H*$L,

  { Affichage du résultat }

  Color:=red,
  Ligne([%1, %2, %2+i*$H, %1+i*$H],1),
  FillStyle := full,
  $x:=(%1+%2)/2, $y:=$max/2,
  $H:=1, $L:=0.125,
  {Ligne([$x-$H+i*($y-$L), $x+$H+i*($y-$L), $x+$H+i*($y+$L), $x-$H+i*($y+$L)],1),}
  LabelStyle:=framed,
  Label($x+i*$y,["Aire = ",@StrNum(Aire)])
]


J'ai réuni les trois éléments graphiques en un seul, avec 10 000 points:

Code: Tout sélectionner
[
view(0,3.5,0,3), size(8),
NewBitmap(), {pour le dessin des pixels}
Arrows:=1,
axeX([0,1],pi/2,Nil,Nil,1,"\pi",2), axeY([0,1],1),
Arrows:=0,
tMin:=0, tMax:=pi, Cartesienne(f(x)),
Monte_Carlo(0,pi,10000)
]


J'ai aussi ajouté une macro exportPsf() qui m'exporte le graphique en eps avec l'utilisation de psfrag, met tout ça dans un document TeX, compile le tout vers pdf et affiche le résultat (taper [i]exportPsf()(/i] dans la barre de commande):

Monte_Carlo.png
Monte_Carlo.png (34.99 Kio) Consulté 8225 fois


Monte_carlo.teg
(3.23 Kio) Téléchargé 1007 fois
P.Fradin
Avatar de l’utilisateur
P.Fradin
Administrateur du site
 
Messages: 1887
Inscription: 29 Oct 2008 15:04

Re: Integrale par Monte-Carlo

Messagepar petitoliv » 04 Jan 2010 00:25

Waouh, :P

merci pour tout ce travail. Les résultats sont excellents, tant au niveau de l'interface que du résultat PS. L'exécution est rapide, même avec 10000 points !
J'ai essayé l'export Tikz, mais n'ai pas tenté de l'intégrer dans un fichier TeX (fichier .tkz autour de 600Ko !) car je ne sais pas ce que cela peut donner !

Le coup du MyExport pour exporter quand même les bitmaps est une super idée. Coïncidence, j'étais justement en train de plancher sur cette commande pour voir (en m'inspirant du post sur exportpst...) si l'on pouvait sans trop de difficultés faire un export Tikz avec des commandes de "haut-niveau", mais bien sûr pour des dessins très simples. Je trouve en effet sympa l'idée de pouvoir obtenir un code "human-readable", en tout cas pour des figures élémentaires...
Pour l'instant je me suis contenté de traduire la commande LabelDot en \coordinate... Lorsque j'aurai le temps, je continuerai mes investigations !

Encore bravo pour le travail accompli et merci pour le fichier précédent bien abouti.
Cordialement,
Olivier.
petitoliv
 
Messages: 9
Inscription: 02 Jan 2010 23:19


Revenir vers Analyse

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 9 invités

cron