00001 #include "hermitefunction_expansion1d.h"
00002 #include "constants.h"
00003 #include <cmath>
00004 #include "misc.h"
00005
00007 bool CHermiteFunctionExpansion1d::Read(const parameterMap& m){
00008 xscale = parameter::getD(m,"xscale",xscale);
00009 return COrthogonalFuncExpansion1d::Read(m);
00010 }
00011
00013 bool CHermiteFunctionExpansion1d::Write(parameterMap& m){
00014 parameter::set(m,"xscale",xscale);
00015 return COrthogonalFuncExpansion1d::Write(m);
00016 }
00017
00022 double CHermiteFunctionExpansion1d::orthogFunctionValue(double x, int i, int jderiv) const{
00023 if (jderiv==0) return hermite_polynomial(i,x);
00024 if (jderiv==1) return 2.0*double(i)*hermite_polynomial( x, i-1 );
00025 MESSAGE << "Did not implement basisFunction for jderiv != 0 or 1"<<ENDM_WARN;
00026 return 0.0;
00027 }
00028
00029 double CHermiteFunctionExpansion1d::weightFunction(double x, int jderiv) const{
00030 double y = exp(-x*x);
00031 if (jderiv==0) return y;
00032 if (jderiv==1) return -2.0*x*y;
00033 MESSAGE << "Did not implement CHermiteFunctionExpansion1d::weightFunction for jderiv != 0 or 1"<<ENDM_WARN;
00034 return 0.0;
00035 }
00036
00037 double hermite_polynomial( int i, double x ){
00038 if (i < 0) return 0.0;
00039 switch (i) {
00040 case 0: return 1.0;
00041 case 1: return 2.0*x;
00042 case 2: return 4.0*x*x-2.0;
00043 case 3: return (8.0*x*x-12.0)*x;
00044 case 4: return (16.0*x*x-48.0)*x*x+12.0;
00045 default: return 2.0*x*hermite_polynomial(i-1,x)-2.0*(i-1)*hermite_polynomial(i-2,x);
00046 }
00047 return 0.0;
00048 }
00049
00050
00051 double CHermiteFunctionExpansion1d::getLeftSupport(int i) const{return xmin;}
00052 double CHermiteFunctionExpansion1d::getRightSupport(int i) const{return xmax;}