Methode de montecarlo par scilab

Discutez d'informatique ici !
amady89
Messages: 8
Enregistré le: 01 Juin 2012, 12:48

methode de montecarlo par scilab

par amady89 » 02 Juin 2012, 18:59

Bonsoir à tous,

Je dois calculer des intégrales par la méthode de montecarlo c'est à dire l'aire sous la courbe représentative de ces fonctions.
Les deux fonctions sont f(x)= (1+x) / (1+x²) et g(x)=x*sin(2*pi*x) et je dois calculer leur intégrale entre 0 et 1
La fonction f a pour minimum a=1 et pour maximum b=(racine carré de 2) / (4- 2f racine carré de 2) et la fonction g a'= 0 et b'= 1
Pour calculer l'aire sous la courbe de ces fonctions je dois choisir au hasard une valeur alpha entre a et b et une valeur au hasard beta entre 0 et 1
Si beta>f(alpha) alors il a échec sinon succès
on fait N fois l'expérience avec N=100 et l'aire sous la courbe vaut S/N avec S le nombre de succès.
Je propose cet algorithme:

function y=f(x);
y=(1+x)/(1+x*x)endfunction;

function z=g(x);
z=x*sin(2*%pi*x)endfunction;

function a1=aire(N)
S=0;
A=S/N;
a=rand();
b=rand();
if (g(a)>b) then S=S+1;
aire(N)=A;

end
endfunction

Je ne vois pas trop comment le corriger, merci de votre aide. COrdialement.



Joker62
Membre Transcendant
Messages: 5028
Enregistré le: 24 Déc 2006, 20:29

par Joker62 » 03 Juin 2012, 00:41

Bonsoir,

Tu comprends ce que t'as fait là ?

amady89
Messages: 8
Enregistré le: 01 Juin 2012, 12:48

par amady89 » 03 Juin 2012, 12:29

J'ai pris 2 nombres au hasard entre 0 et 1 qui sont les ensembles de départ et d'arrivé, je calcule ensuite l'image du nombre tiré au hasard que je compare avec le 2e nombre tiré au hasard, mon problème est qu j ne vois pas trop comment répété l'expérience 100 fois

Joker62 a écrit:Bonsoir,

Tu comprends ce que t'as fait là ?

Joker62
Membre Transcendant
Messages: 5028
Enregistré le: 24 Déc 2006, 20:29

par Joker62 » 03 Juin 2012, 12:49

Et bien mis à part une boucle (si tu veux le faire comme ton ambition)

Sinon avec Scilab, on évite au maximum de faire des boucles. S'il sait gérer les vecteurs, il faut en user à plein régime.

Code: Tout sélectionner
function y = f(x)
  y = (1+x)./(1+x.^2)
endfunction;

function A = MonteCarlo(n)
  clf();
  x = linspace(0,1,100);
  y = f(x);
 
  X = rand(1,n);
  Y = 2*rand(1,n);
 
  T = [Y <= f(X)];
 
  plot2d(x,y,2);
  plot2d(X,Y,style = 0);
 
  A = 2*sum(T)/n;
endfunction;


On explique :

x = linspace(0,1,100) crée 100 points équi-répartis entre 0 et 1
y = f(x), pour tracer la fonction f. Remarque la définition de la fonction f avec des "points" devant les opérations (Pour permettre de manipuler les vecteurs élément par élément.

X = rand(1,n) On crée une matrice 1 ligne n colonnes avec des entiers entre 0 et 1
Y = 2*rand(1,n) Pareil mais avec des nombres entre 0 et 2 (Car la fonction reste coincée dans le carré [0,1]x[0,2])

T = [Y <= f(X)]; On crée une matrice à une ligne qui va contenir des True ou des False pour tester si le point choisi est sous la courbe ou pas.

On trace les points et la courbe de f

Enfin on compte les T en faisant sum(T), on divise par n car on a fait n points et on multiplie par 2 car on travaille dans un carré d'aire 2.

amady89
Messages: 8
Enregistré le: 01 Juin 2012, 12:48

par amady89 » 06 Juin 2012, 17:03

Merci beaucoup, je vais présenter tout ça lors de ma soutenance en espérant que tout se passe bien.

Joker62 a écrit:Et bien mis à part une boucle (si tu veux le faire comme ton ambition)

Sinon avec Scilab, on évite au maximum de faire des boucles. S'il sait gérer les vecteurs, il faut en user à plein régime.

Code: Tout sélectionner
function y = f(x)
  y = (1+x)./(1+x.^2)
endfunction;

function A = MonteCarlo(n)
  clf();
  x = linspace(0,1,100);
  y = f(x);
 
  X = rand(1,n);
  Y = 2*rand(1,n);
 
  T = [Y <= f(X)];
 
  plot2d(x,y,2);
  plot2d(X,Y,style = 0);
 
  A = 2*sum(T)/n;
endfunction;


On explique :

x = linspace(0,1,100) crée 100 points équi-répartis entre 0 et 1
y = f(x), pour tracer la fonction f. Remarque la définition de la fonction f avec des "points" devant les opérations (Pour permettre de manipuler les vecteurs élément par élément.

X = rand(1,n) On crée une matrice 1 ligne n colonnes avec des entiers entre 0 et 1
Y = 2*rand(1,n) Pareil mais avec des nombres entre 0 et 2 (Car la fonction reste coincée dans le carré [0,1]x[0,2])

T = [Y <= f(X)]; On crée une matrice à une ligne qui va contenir des True ou des False pour tester si le point choisi est sous la courbe ou pas.

On trace les points et la courbe de f

Enfin on compte les T en faisant sum(T), on divise par n car on a fait n points et on multiplie par 2 car on travaille dans un carré d'aire 2.

Joker62
Membre Transcendant
Messages: 5028
Enregistré le: 24 Déc 2006, 20:29

par Joker62 » 06 Juin 2012, 18:42

Une soutenance sur quel sujet ?

Parce que si le sujet c'est scilab faut attendre un peu lol :p

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 10 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite