Changeset 3098 in Sophya for trunk/SophyaLib/NTools/integ.cc


Ignore:
Timestamp:
Nov 2, 2006, 3:32:37 PM (19 years ago)
Author:
ansari
Message:

correction bug lie au delete de ClassFunc ds Integrator / petite amelioration interface Integrator - Reza 02/11/2006

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/SophyaLib/NTools/integ.cc

    r2808 r3098  
    1717
    1818  On fournit une fonction double f(double) au constructeur, ou
     19  une classe-fonction (ClassFuc) ou
    1920  une GeneralFunction avec des paramètres définis.
    2021  L'objet Integrator est convertible en valeur double qui est la valeur
     
    2829//!  Constructeur par défaut. L'objet n'est pas utilisable en l'état.
    2930Integrator::Integrator()
    30 : mFunc(NULL), mGFF(NULL), mGFFParm(NULL),
     31: mFunc(NULL), mClFun(NULL), mGFF(NULL), mGFFParm(NULL),
    3132  mNStep(50), mDX(-1), mReqPrec(-1),
    3233  mXMin(0), mXMax(1)
     34{}
     35
     36//! Constructeur à partir d'une classe-fonction, et des bornes d'intégration.
     37Integrator::Integrator(ClassFunc const & f, double xmin, double xmax)
     38: mFunc(NULL), mClFun(&f), mGFF(NULL), mGFFParm(NULL),
     39  mNStep(50), mDX(-1), mReqPrec(-1),
     40  mXMin(xmin), mXMax(xmax)
    3341{}
    3442
    3543//! Constructeur à partir de la fonction double->double, et des bornes d'intégration.
    3644Integrator::Integrator(FUNC f, double xmin, double xmax)
    37 : mFunc(f), mGFF(NULL), mGFFParm(NULL),
     45: mFunc(f), mClFun(NULL), mGFF(NULL), mGFFParm(NULL),
    3846  mNStep(50), mDX(-1), mReqPrec(-1),
    3947  mXMin(xmin), mXMax(xmax)
    4048{}
    4149
    42 //! Constructeur à partir de la fonction double->double, et des bornes d'intégration.
    43 Integrator::Integrator(fun f, double xmin, double xmax)
    44 : mFunc(new Function(f)), mGFF(NULL), mGFFParm(NULL),
    45   mNStep(50), mDX(-1), mReqPrec(-1),
    46   mXMin(xmin), mXMax(xmax)
    47 {}
    48 
     50
     51/*!
     52  Constructeur a partir d'une classe-fonction
     53  sans spécifier les bornes. Elles sont positionnées
     54  à [0,1], et on pourra les modifier plus tard.
     55*/
     56Integrator::Integrator(ClassFunc const & f)
     57: mFunc(NULL), mClFun(&f), mGFF(NULL), mGFFParm(NULL),
     58  mNStep(50), mDX(-1), mReqPrec(-1),
     59  mXMin(0), mXMax(1)
     60{}
    4961
    5062/*!
     
    5365*/
    5466Integrator::Integrator(FUNC f)
    55 : mFunc(f), mGFF(NULL), mGFFParm(NULL),
    56   mNStep(50), mDX(-1), mReqPrec(-1),
    57   mXMin(0), mXMax(1)
    58 {}
    59 
    60 /*!
    61   Constructeur sans spécifier les bornes. Elles sont positionnées
    62   à [0,1], et on pourra les modifier plus tard.
    63 */
    64 Integrator::Integrator(fun f)
    65 : mFunc(new Function(f)), mGFF(NULL), mGFFParm(NULL),
     67: mFunc(f), mClFun(NULL), mGFF(NULL), mGFFParm(NULL),
    6668  mNStep(50), mDX(-1), mReqPrec(-1),
    6769  mXMin(0), mXMax(1)
     
    7476*/
    7577Integrator::Integrator(GeneralFunction* gff, double* par, double xmin, double xmax)
    76 : mFunc(NULL), mGFF(gff), mGFFParm(par),
     78: mFunc(NULL), mClFun(NULL), mGFF(gff), mGFFParm(par),
    7779  mNStep(50), mDX(-1), mReqPrec(-1),
    7880  mXMin(xmin), mXMax(xmax)
     
    8890*/
    8991Integrator::Integrator(GeneralFunction* gff, double* par)
    90 : mFunc(NULL), mGFF(gff), mGFFParm(par),
     92: mFunc(NULL), mClFun(NULL), mGFF(gff), mGFFParm(par),
    9193  mNStep(50), mDX(-1), mReqPrec(-1),
    9294  mXMin(0), mXMax(1)
     
    9698
    9799Integrator::~Integrator()
    98 {if(mFunc) delete mFunc;}
     100{
     101}
     102
    99103
    100104/*!
     
    121125{
    122126  mDX = d;
    123   mNStep = mReqPrec = -1;
     127  mNStep = -1;
     128  mReqPrec = -1.;
    124129  StepsChanged();
    125130  return *this;
     
    154159//! Spécifie la fonction à intégrer, sous forme double f(double).
    155160Integrator&
    156 Integrator::Func(FUNC f)
    157 {
    158   mFunc = f;
     161Integrator::SetFunc(ClassFunc const & f)
     162{
     163  mFunc = NULL;
     164  mClFun = &f;
    159165  mGFFParm = NULL;
    160166  mFunc = NULL;
     
    163169}
    164170
     171//! Spécifie la fonction à intégrer, sous forme double f(double).
     172Integrator&
     173Integrator::SetFunc(FUNC f)
     174{
     175  mFunc = f;
     176  mClFun = NULL;
     177  mGFFParm = NULL;
     178  mFunc = NULL;
     179  FuncChanged();
     180  return *this;
     181}
     182
    165183/*!
    166184  \brief Spécifie la fonction à intégrer, sous forme de GeneralFunction
     
    168186*/
    169187Integrator&
    170 Integrator::Func(GeneralFunction* gff, double* par)
     188Integrator::SetFunc(GeneralFunction* gff, double* par)
    171189{
    172190  mGFF = gff;
     
    181199Integrator::FVal(double x) const
    182200{
    183   DBASSERT( mFunc || (mGFF && mGFFParm) );
    184   return mFunc ? (*mFunc)(x) : mGFF->Value(&x, mGFFParm);
    185   }
     201  DBASSERT( mFunc || mClFun || (mGFF && mGFFParm) );
     202  if (mFunc) return mFunc(x);
     203  else return mClFun ? (*mClFun)(x) : mGFF->Value(&x, mGFFParm);
     204}
    186205
    187206double
     
    197216 cout<<"Integrator between "<<mXMin<<" and "<<mXMax
    198217     <<" in "<<mNStep<<" steps"<<endl;
    199  if(lp>1) cout<<"mFunc="<<mFunc<<"mGFF="<<mGFF
     218 if(lp>1) cout<<"mFunc="<<mFunc<<"mClFun="<<mClFun<<"mGFF="<<mGFF
    200219              <<"mReqPrec="<<mReqPrec<<"mDX="<<mDX<<endl;
    201220}
     
    220239{}
    221240
     241TrpzInteg::TrpzInteg(ClassFunc const & f, double xmin, double xmax)
     242: Integrator(f, xmin, xmax)
     243{}
     244
    222245TrpzInteg::TrpzInteg(FUNC f, double xmin, double xmax)
    223246: Integrator(f, xmin, xmax)
    224247{}
    225248
    226 TrpzInteg::TrpzInteg(fun f, double xmin, double xmax)
    227 : Integrator(f, xmin, xmax)
     249TrpzInteg::TrpzInteg(ClassFunc const & f)
     250: Integrator(f)
    228251{}
    229252
    230253TrpzInteg::TrpzInteg(FUNC f)
    231 : Integrator(f)
    232 {}
    233 
    234 TrpzInteg::TrpzInteg(fun f)
    235254: Integrator(f)
    236255{}
     
    301320
    302321
     322GLInteg::GLInteg(ClassFunc const & f, double xmin, double xmax)
     323: Integrator(f, xmin, xmax), mXPos(NULL), mWeights(NULL), mOrder(8)
     324{
     325  NStep(1);
     326}
     327
    303328GLInteg::GLInteg(FUNC f, double xmin, double xmax)
    304329: Integrator(f, xmin, xmax), mXPos(NULL), mWeights(NULL), mOrder(8)
     
    307332}
    308333
    309 GLInteg::GLInteg(fun f, double xmin, double xmax)
    310 : Integrator(f, xmin, xmax), mXPos(NULL), mWeights(NULL), mOrder(8)
     334GLInteg::GLInteg(ClassFunc const & f)
     335: Integrator(f), mXPos(NULL), mWeights(NULL), mOrder(8)
    311336{
    312337  NStep(1);
     
    314339
    315340GLInteg::GLInteg(FUNC f)
    316 : Integrator(f), mXPos(NULL), mWeights(NULL), mOrder(8)
    317 {
    318   NStep(1);
    319 }
    320 
    321 GLInteg::GLInteg(fun f)
    322341: Integrator(f), mXPos(NULL), mWeights(NULL), mOrder(8)
    323342{
Note: See TracChangeset for help on using the changeset viewer.