00001
00002
00003
00004
00005
00006
00007 #ifndef CALC_CHEB_H
00008 #define CALC_CHEB_H
00009
00010
00011
00012
00013
00014 #include "Base.h"
00015
00016
00017
00018
00019
00020 namespace calc {
00021
00022
00023
00024
00033
00034
00045 class ChebErr:public Err {
00046
00047 public:
00048
00049
00050
00052 enum ERR_ENUM {
00053 INIT=0 ,
00054 MEMORY ,
00055 BOUNDS ,
00056 ERR_CNT,
00057 };
00058
00059
00060
00067 ChebErr(enum ChebErr::ERR_ENUM indErr):
00068 Err() {
00069 const char* const CLASS_NAME="Cheb";
00070 const char* const ERR_STR[ERR_CNT]={
00071 "object initialization error",
00072 "memory allocation error",
00073 "evaluation point outside interpolation interval"
00074 };
00075 setError(indErr,CLASS_NAME,ERR_STR[indErr]);
00076 }
00077 };
00078
00079
00080
00081
00083
00099 template <typename xType, typename yType>
00100 class Cheb:public Base {
00101
00102
00103
00104 friend class PrtC;
00105
00106 public:
00107
00108
00109
00111 enum CTYPE {
00112 INTERPOLATE=0,
00113 DIFFERENTIATE,
00114 INTEGRATE ,
00115 CTYPE_CNT ,
00116 };
00117
00118
00119
00120 yType eval(xType x) const throw (ChebErr);
00121
00122
00123
00143 operator const yType* (void) const {return (nogo?(yType*)(0):aC);}
00144
00145
00146
00164 const yType* getArray(void) const {return (nogo?(yType*)(0):aC);}
00184 yType getParameter(int iDeg) const
00185 {return ((!nogo)&&(iDeg>=0)&&(iDeg<nData)?aC[iDeg]:(yType)(0));}
00198 enum Cheb<xType,yType>::CTYPE getType(void) const {return cTyp;}
00209 int getCount(void) const {return nData;}
00226 xType getError(void) const {return yErr;}
00235 xType getBound(enum Base::BOUND iBnd) const {return xBnd[iBnd];}
00236
00237
00238
00239 static const int POINT_MIN;
00240 static const int POINT_MAX;
00241
00242 protected:
00243
00244
00245
00246 Cheb(yType (*pFn)(xType), xType x1, xType x2, xType dEps);
00247 Cheb(yType (*pFn)(xType), xType x1, xType x2, int nCount);
00248 Cheb(const yType* const arCn, xType x1, xType x2, int nCount, int iArr);
00249 Cheb(const Cheb &ch);
00250
00254 ~Cheb(void) {if(aC) delete[] aC;}
00255
00256
00257
00258 bool trunCoefs (const yType* ut, xType dEps);
00259 bool trunCoefs (const yType* ut, int nCount);
00260
00271 virtual void putCoefs(yType *ut, const yType* up, int cnt)=0;
00272
00273
00274
00275 enum Cheb<xType,yType>::CTYPE cTyp;
00276 xType xBnd[Base::BOUND_CNT];
00277 yType yOffset;
00278 yType *aC;
00279 int nData;
00281 private:
00282
00283
00284
00285 bool intp (yType (*fn)(xType), yType *up, int cnt) const;
00286
00287 virtual void varInit (void);
00288
00298 bool varAlloc(int nCount) {return (!(aC=new yType[nCount]));}
00299
00300
00301
00302 xType xScale;
00303 xType xOffset;
00304 xType yErr;
00305 int mCnt;
00306 };
00307
00308
00309
00311 template <typename xType, typename yType>
00312 const int calc::Cheb<xType,yType>::POINT_MIN=1;
00314 template <typename xType, typename yType>
00315 const int calc::Cheb<xType,yType>::POINT_MAX=50;
00316
00317
00318
00319
00321
00343 template <typename xType, typename yType>
00344 class Differ:public Cheb<xType,yType> {
00345
00346
00347
00348 using Cheb<xType,yType>::nogo;
00349 using Cheb<xType,yType>::cTyp;
00350 using Cheb<xType,yType>::nData;
00351 using Cheb<xType,yType>::xBnd;
00352 using Cheb<xType,yType>::yOffset;
00353 using Cheb<xType,yType>::aC;
00354 using Cheb<xType,yType>::DIFFERENTIATE;
00355 using Cheb<xType,yType>::LO;
00356 using Cheb<xType,yType>::HI;
00357
00358 public:
00359
00360
00361
00362 Differ(yType (&rFn)(xType), xType x1, xType x2, xType dEps);
00363 Differ(yType (&rFn)(xType), xType x1, xType x2, int nCount);
00364 Differ(const yType *arCn, xType x1, xType x2, int nCount);
00365 Differ(const Cheb<xType,yType> &ch);
00366
00376 Differ(const Differ<xType,yType> &ch):
00377 Cheb<xType,yType>(ch) {cTyp=Cheb<xType,yType>::DIFFERENTIATE;}
00381 ~Differ(void) {}
00382
00383 private:
00384
00385
00386
00387 virtual void putCoefs (yType *ut, const yType *up, int cnt);
00388 };
00389
00390
00391
00392
00394
00416 template <typename xType, typename yType>
00417 class Integr:public Cheb<xType,yType> {
00418
00419
00420
00421 using Cheb<xType,yType>::nogo;
00422 using Cheb<xType,yType>::cTyp;
00423 using Cheb<xType,yType>::nData;
00424 using Cheb<xType,yType>::xBnd;
00425 using Cheb<xType,yType>::yOffset;
00426 using Cheb<xType,yType>::aC;
00427 using Cheb<xType,yType>::INTEGRATE;
00428 using Cheb<xType,yType>::LO;
00429 using Cheb<xType,yType>::HI;
00430
00431 public:
00432
00433
00434
00435 Integr(yType (&rFn)(xType), xType x1, xType x2, xType dEps);
00436 Integr(yType (&rFn)(xType), xType x1, xType x2, int nCount);
00437 Integr(const yType *arCn, xType x1, xType x2, int nCount);
00438 Integr(const Cheb<xType,yType> &ch);
00439
00449 Integr(const Integr<xType,yType> &ch):
00450 Cheb<xType,yType>(ch) {cTyp=Cheb<xType,yType>::INTEGRATE;}
00454 ~Integr(void) {}
00455
00456 private:
00457
00458
00459
00460 void addCoef (yType *ui, const yType *up, int cnt);
00461
00462 virtual void putCoefs (yType *ut, const yType *up, int cnt);
00463 };
00464
00465
00466
00467
00469
00491 template <typename xType, typename yType>
00492 class Interp:public Cheb<xType,yType> {
00493
00494
00495
00496 using Cheb<xType,yType>::nogo;
00497 using Cheb<xType,yType>::cTyp;
00498 using Cheb<xType,yType>::nData;
00499 using Cheb<xType,yType>::yOffset;
00500 using Cheb<xType,yType>::aC;
00501 using Cheb<xType,yType>::INTERPOLATE;
00502
00503 public:
00504
00505
00506
00507 Interp(yType (&rFn)(xType), xType x1, xType x2, xType dEps);
00508 Interp(yType (&rFn)(xType), xType x1, xType x2, int nCount);
00509 Interp(const yType *arCn, xType x1, xType x2, int nCount);
00510
00520 Interp(const Interp<xType,yType> &ch):
00521 Cheb<xType,yType>(ch) {cTyp=Cheb<xType,yType>::INTERPOLATE;}
00531 Interp(const Cheb<xType,yType> &ch):
00532 Cheb<xType,yType>(ch) {cTyp=Cheb<xType,yType>::INTERPOLATE;}
00536 ~Interp(void) {}
00537
00538 private:
00539
00540
00541
00545 virtual void putCoefs(yType *ut, const yType *up, int cnt)
00546 {memCopy(ut,up,cnt);}
00547 };}
00548
00549
00550
00551
00552
00553 #endif
00554
00555
00556
00557
00558
00559 #include "Cheb.cpp"
00560 #include "Differ.cpp"
00561 #include "Integr.cpp"
00562 #include "Interp.cpp"
00563
00564