#include "sopnamsp.h" #include "machdefs.h" #include "pexceptions.h" #include "perandom.h" #include "pemath.h" #include //////////////////////////////////////////////////////////////////////////// /*! \class SOPHYA::FunRan \ingroup NTools Classe for generating random variables from 1D function */ /********* Methode *********/ /*! Createur. f is a probability density function (PDF). Le tirage aleatoire est fait sur un histogramme Histo(xMin,xMax,nBin) (voir convention dans Histo). Chaque bin de l'histogramme contient la valeur de la PDF au centre du bin. Les valeurs retournees sont les valeurs du centre des bins. Si binw est la largeur du bin, les valeurs retournees vont de xmin+binw/2 a xmax-binw/2. */ FunRan::FunRan(FunRan::Func f, r_8 xMin, r_8 xMax, int_4 nBin) : Histo(xMin,xMax,nBin) { if(nBin<0) throw RangeCheckError("FunRan::FunRan less than 2 bins requested"); // On cree la fonction de distribution a partir de la PDF (*this)(0) = f(BinCenter(0)); for(int_4 i=1;i=0; i--) delete ranY[i]; delete[] ranY; delete ranX; } /********* Methode *********/ /*! Tirage avec retour du numeros de bin. */ void FunRan2D::BinRandom(int_4& x, int_4& y) { x = ranX->BinRandom(); y = ranY[x]->BinRandom(); } /********* Methode *********/ /*! Tirage avec retour abscisse et ordonnee du bin interpole. */ void FunRan2D::Random(r_8& x, r_8& y) { x = ranX->Random(); int_4 i = int_4(ceil(x)); y = ranY[i]->Random(); } ///////////////////////////////////////////////////////////////// /* --- Remarque sur complex< r_8 > ComplexGaussRan(double sig) x = r cos(t) tire gaussien: pdf f(x) = 1/(sqrt(2Pi) Sx) exp(-(x-Mx)^2/(2 Sx^2)) y = r sin(t) tire gaussien: pdf f(y) = 1/(sqrt(2Pi) Sy) exp(-(y-My)^2/(2 Sy^2)) x,y independants --> pdf f(x,y) = f(x) f(y) - On cherche la pdf g(r,t) du module et de la phase (r=sqrt(x^2+y^2,t=atan2(y,x)) --> (x,y): le Jacobien = r g(r,t) = r f(x,y) = r f(x) f(y) = r/(2Pi Sx Sy) exp(-(x-Mx)^2/(2 Sx^2)) exp(-(y-My)^2/(2 Sy^2)) - Le cas general est complique (cf D.Pelat cours DEA "bruits et signaux" section 4.5) - Cas ou "Mx = My = 0" et "Sx = Sy = S" g(r,t) = r/(2Pi S^2) exp(-r^2/(2 S^2)) La distribution de "r" est donc: g(r) = Integrate[g(r,t),{t,0,2Pi}] = r/S^2 exp(-r^2/(2 S^2)) La distribution de "t" est donc: g(t) = Integrate[g(r,t),{r,0,Infinity}] = 1 / 2Pi (distribution uniforme sur [0,2Pi[) Les variables aleatoires r,t sont independantes: g(r,t) = g(r) g(t) */