/** \file normed_dgauss1d.hpp \brief normalized double gaussian distribution \author Junhua Gu */ #ifndef NDGAUSS_MODEL_H_ #define NDGAUSS_MODEL_H_ #define OPT_HEADER #include #include #include namespace opt_utilities { template class normed_dgauss1d :public model,optvec,optvec,std::string> { private: normed_dgauss1d* do_clone()const { return new normed_dgauss1d(*this); } const char* do_get_type_name()const { return "1d double normed gaussian"; } public: normed_dgauss1d() { this->push_param_info(param_info >("x01",0)); this->push_param_info(param_info >("sigma1",1)); this->push_param_info(param_info >("x02",0.1)); this->push_param_info(param_info >("sigma2",1)); this->push_param_info(param_info >("theta",1)); } public: optvec do_eval(const optvec& x,const optvec& param) { const double pi=3.14159265358979323846; T x01=get_element(param,0); T sigma1=get_element(param,1); T x02=get_element(param,2); T sigma2=get_element(param,3); T theta=get_element(param,4); if(sigma1*sigma1::epsilon()) { sigma1=std::numeric_limits::epsilon(); } if(sigma2*sigma2::epsilon()) { sigma2=std::numeric_limits::epsilon(); } T N1=1/sqrt(sigma1*sigma1*pi*2); T N2=1/sqrt(sigma2*sigma2*pi*2); optvec y1=(x-x01)/sigma1; optvec y2=(x-x02)/sigma2; T r1=sin(theta); T r2=cos(theta); return r1*r1*N1*exp(-y1*y1/2.)+r2*r2*N2*exp(-y2*y2/2.);; } private: std::string do_get_information()const { return ""; } }; } #endif //EOF