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 (34.99 Kio) Consulté 9594 fois