Changeset 3615 in Sophya for trunk/SophyaLib/BaseTools/randinterf.cc
- Timestamp:
- May 1, 2009, 1:34:31 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/SophyaLib/BaseTools/randinterf.cc
r3611 r3615 28 28 29 29 \sa frand01 drand01 frandpm1 drandpm1 30 \sa Gau Rnd PoissRand30 \sa Gaussian Poisson 31 31 32 32 */ … … 62 62 } 63 63 64 void RandomGeneratorInterface::ShowRandom() 65 { 66 cout<<"RandomGenerator is RandomGeneratorInterface i.e. UNDEFINED"<<endl; 67 } 64 68 65 69 ///////////////////////////////////////////////////////////////////////// … … 172 176 } 173 177 178 void RandomGeneratorInterface::AutoInit(int lp) 179 { 180 printf("RandomGeneratorInterface::AutoInit(): undefined code !!!\n"); 181 throw MathExc("RandomGeneratorInterface::AutoInit(): undefined code !!!"); 182 } 183 174 184 ///////////////////////////////////////////////////////////////////////// 175 185 ///////////////////////////////////////////////////////////////////////// … … 773 783 } 774 784 785 ///////////////////////////////////////////////////////////////////////// 786 ///////////////////////////////////////////////////////////////////////// 787 ///////////////////////////////////////////////////////////////////////// 788 789 int 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 { 826 double a,b,sa; 827 828 if( ro <= -1. || ro >= 1. ) return 1; 829 830 while( (b=Flat01()) == 0. ); 831 b = sqrt(-2.*log(b)); 832 a = 2.*M_PI * Flat01(); 833 sa = sin(a); 834 835 x = mx + sx*b*(sqrt(1.-ro*ro)*cos(a)+ro*sa); 836 y = my + sy*b*sa; 837 838 return 0; 839 } 840 841 void 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 { 864 double c,s,X,Y; 865 866 while( (s = Flat01()) == 0. ); 867 s = sqrt(-2.*log(s)); 868 c = 2.*M_PI * Flat01(); 869 870 X = sa*s*cos(c); 871 Y = sb*s*sin(c); 872 873 c = cos(teta); s = sin(teta); 874 x = mx + c*X - s*Y; 875 y = my + s*X + c*Y; 876 } 775 877 776 878 } /* namespace SOPHYA */ … … 780 882 ///////////////////////////////////////////////////////////////// 781 883 /* 782 **** Remarques sur complex< r_8 > ComplexGauss Ran(double sig) ****884 **** Remarques sur complex< r_8 > ComplexGaussian(double sig) **** 783 885 784 886 --- variables gaussiennes x,y independantes
Note:
See TracChangeset
for help on using the changeset viewer.