Ignore:
Timestamp:
May 1, 2009, 1:34:31 PM (16 years ago)
Author:
cmv
Message:

Modifs relatives a l'introduction de RandomGeneratorInterface + delete de srandgen.c, cmv 01/05/2009

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/SophyaLib/BaseTools/randinterf.cc

    r3611 r3615  
    2828
    2929   \sa frand01 drand01 frandpm1 drandpm1
    30    \sa GauRnd PoissRand
     30   \sa Gaussian Poisson
    3131
    3232*/
     
    6262}
    6363
     64void RandomGeneratorInterface::ShowRandom()
     65{
     66  cout<<"RandomGenerator is RandomGeneratorInterface i.e. UNDEFINED"<<endl;
     67}
    6468
    6569/////////////////////////////////////////////////////////////////////////
     
    172176}
    173177
     178void RandomGeneratorInterface::AutoInit(int lp)
     179{
     180  printf("RandomGeneratorInterface::AutoInit(): undefined code !!!\n");
     181  throw MathExc("RandomGeneratorInterface::AutoInit(): undefined code !!!");
     182}
     183
    174184/////////////////////////////////////////////////////////////////////////
    175185/////////////////////////////////////////////////////////////////////////
     
    773783}
    774784
     785/////////////////////////////////////////////////////////////////////////
     786/////////////////////////////////////////////////////////////////////////
     787/////////////////////////////////////////////////////////////////////////
     788
     789int RandomGeneratorInterface::Gaussian2DRho(double &x,double &y,double mx,double my,double sx,double sy,double ro)
     790/*
     791++
     792|       Tirage de 2 nombres aleatoires x et y distribues sur une gaussienne 2D
     793|       de centre (mx,my), de coefficient de correlation rho (ro) et telle que
     794|       les sigmas finals des variables x et y soient sx,sy (ce sont
     795|       les valeurs des distributions marginales des variables aleatoires x et y
     796|       c'est a dire les sigmas des projections x et y de l'histogramme 2D
     797|       de la gaussienne). Retourne 0 si ok.
     798|
     799| - La densite de probabilite (normalisee a 1) sur laquelle on tire est:
     800|   N*exp[-0.5*{[(dx/sx)^2-2*ro/(sx*sy)*dx*dy+(dy/sy)^2]/(1-ro^2)}]
     801|     avec dx = x-mx, dy = y-my et N = 1/[2Pi*sx*sy*sqrt(1-ro^2)]
     802| - Dans ce cas la distribution marginale est (ex en X):
     803|   1/(sqrt(2Pi)*sx) * exp[-0.5*{dx^2/sx^2}]
     804| - La matrice des covariances C des variables x,y est:
     805|   |   sx^2      ro*sx*sy |
     806|   |                      |  et det(C) = (1-ro^2)*sx^2*sy^2
     807|   | ro*sx*sy      sy^2   |
     808| - La matrice inverse C^(-1) est:
     809|   |   1/sx^2      -ro/(sx*sy) |
     810|   |                           | * 1/(1-ro^2)
     811|   | -ro/(sx*sy)      1/sy^2   |
     812|
     813| - Remarque:
     814| le sigma que l'on obtient quand on fait une coupe de la gaussienne 2D
     815| en y=0 (ou x=0) est: SX0(y=0) = sx*sqrt(1-ro^2) different de sx
     816|                      SY0(x=0) = sy*sqrt(1-ro^2) different de sy
     817| La distribution qui correspond a des sigmas SX0,SY0
     818| pour les coupes en y=0,x=0 de la gaussienne 2D serait:
     819|   N*exp[-0.5*{ (dx/SX0)^2-2*ro/(SX0*SY0)*dx*dy+(dy/SY0)^2 }]
     820| avec N = sqrt(1-ro^2)/(2Pi*SX0*SY0) et les variances
     821| des variables x,y sont toujours
     822|  sx=SX0/sqrt(1-ro^2), sy=SY0/sqrt(1-ro^2)
     823--
     824*/
     825{
     826double a,b,sa;
     827
     828if( ro <= -1. || ro >= 1. ) return 1;
     829
     830while( (b=Flat01()) == 0. );
     831b = sqrt(-2.*log(b));
     832a = 2.*M_PI * Flat01();
     833sa = sin(a);
     834
     835x = mx + sx*b*(sqrt(1.-ro*ro)*cos(a)+ro*sa);
     836y = my + sy*b*sa;
     837
     838return 0;
     839}
     840
     841void RandomGeneratorInterface::Gaussian2DAng(double &x,double &y,double mx,double my,double sa,double sb,double teta)
     842/*
     843++
     844|       Tirage de 2 nombres aleatoires x et y distribues sur une gaussienne 2D
     845|       de centre (x=mx,y=my), de sigmas grand axe et petit axe (sa,sb)
     846|       et dont le grand axe fait un angle teta (radian) avec l'axe des x.
     847|
     848| - La densite de probabilite (normalisee a 1) sur laquelle on tire est:
     849| N*exp[-0.5*{ (A/sa)**2+(C/sc)**2 }],  N=1/(2Pi*sa*sc)
     850| ou A et B sont les coordonnees selon le grand axe et le petit axe
     851| et teta = angle(x,A), le resultat subit ensuite une rotation d'angle teta.
     852| - La matrice des covariances C des variables A,B est:
     853|   | sa^2   0   |
     854|   |            |  et det(C) = (1-ro^2)*sa^2*sb^2
     855|   |  0    sb^2 |
     856| - La distribution x,y resultante est:
     857| N*exp[-0.5*{[(dx/sx)^2-2*ro/(sx*sy)*dx*dy+(dy/sy)^2]/(1-ro^2)}]
     858| ou N est donne dans NormCo et sx,sy,ro sont calcules a partir
     859| de sa,sc,teta (voir fonctions paramga ou gaparam). La matrice des
     860| covariances des variables x,y est donnee dans la fonction NormCo.
     861--
     862*/
     863{
     864double c,s,X,Y;
     865
     866while( (s = Flat01()) == 0. );
     867s = sqrt(-2.*log(s));
     868c = 2.*M_PI * Flat01();
     869
     870X = sa*s*cos(c);
     871Y = sb*s*sin(c);
     872
     873c = cos(teta); s = sin(teta);
     874x = mx + c*X - s*Y;
     875y = my + s*X + c*Y;
     876}
    775877
    776878}  /* namespace SOPHYA */
     
    780882/////////////////////////////////////////////////////////////////
    781883/*
    782 **** Remarques sur complex< r_8 > ComplexGaussRan(double sig) ****
     884**** Remarques sur complex< r_8 > ComplexGaussian(double sig) ****
    783885
    784886--- variables gaussiennes x,y independantes
Note: See TracChangeset for help on using the changeset viewer.