#include "sopnamsp.h" #include "machdefs.h" #include "pexceptions.h" #include "tsfunran.h" #include //////////////////////////////////////////////////////////////////////////// /*! \class SOPHYA::TsFunRan \ingroup NTools Classe for generating random variables from 1D function */ /********* Methode *********/ /*! Creator from a function. \verbatim - if pdf==true: f est une densite de probabilite (PDF) non necessairement normalisee if pdf==false: f est une fonction de distribution (DF). non necessairement normalisee - 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 (ou de la DF) au centre du bin: h(i)=f(BinCenter(i)) - Les valeurs retournees sont les valeurs du centre des bins pour le tirage non interpole et toutes les valeurs entre [xmin,xmax] pour le tirage interpole - La pdf doit etre interpretee comme etant nulle pour des x<=xmin et x>=xmax - Dans le bin "i" entre [x1,x2[ et de centre x0, h(i)=pdf(x0). Pour le tirage interpole, la DF est approximee par un segment et pdf(x0) est l'exces de proba entre x1 et x2: bin 0 entre [xmin,BinHighEdge(0)[ : la pdf va de 0 a pdf(BinCenter(0)) bin 1 entre [BinLowEdge(1),BinHighEdge(1)[: la pdf va de pdf(BinCenter(0)) a pdf(BinCenter(1)) ... bin n-1 entre [BinLowEdge(n-1),xmax[: la pdf va de pdf(BinCenter(n-2)) a pdf(BinCenter(n-1)) \endverbatim */ TsFunRan::TsFunRan(TsFunRan::Func f, r_8 xMin, r_8 xMax, int_4 nBin, bool pdf) : Histo(xMin,xMax,nBin) { if(nBin<=1) throw RangeCheckError("TsFunRan::TsFunRan less than 2 bins requested"); for(int_4 i=0;i& tab, int_4 nBin, bool pdf) : Histo(-0.5,nBin-0.5,nBin) { if(nBin<=1) throw RangeCheckError("TsFunRan::TsFunRan less than 2 bins requested"); for(int_4 i=0;i& tab, int_4 nBin, r_8 xMin, r_8 xMax, bool pdf) : Histo(xMin,xMax,nBin) { if(nBin<=1) throw RangeCheckError("TsFunRan::TsFunRan less than 2 bins requested"); for(int_4 i=0;iFlat01(); for(int_4 i=0;iFlat01(); int ibin = mBins-1; for(int_4 i=0;iFlat01(); int ibin = mBins-1; r_8 z1=0., z2; for(int_4 i=0;i