aboutsummaryrefslogtreecommitdiffstats
path: root/distributions/normed_dgauss1d.hpp
diff options
context:
space:
mode:
authorastrojhgu <astrojhgu@ed2142bd-67ad-457f-ba7c-d818d4011675>2010-10-17 17:34:47 +0000
committerastrojhgu <astrojhgu@ed2142bd-67ad-457f-ba7c-d818d4011675>2010-10-17 17:34:47 +0000
commit9fb6a64e135115b0af416a9b95afe7c7ff79380f (patch)
tree5db85ecfb756bae598ffc9b17b6065dd97b61dd9 /distributions/normed_dgauss1d.hpp
parent28fcd862c8831dd4e29f744d162f9181a6e14ac8 (diff)
downloadopt-utilities-9fb6a64e135115b0af416a9b95afe7c7ff79380f.tar.bz2
git-svn-id: file:///home/svn/opt_utilities@138 ed2142bd-67ad-457f-ba7c-d818d4011675
Diffstat (limited to 'distributions/normed_dgauss1d.hpp')
-rw-r--r--distributions/normed_dgauss1d.hpp75
1 files changed, 75 insertions, 0 deletions
diff --git a/distributions/normed_dgauss1d.hpp b/distributions/normed_dgauss1d.hpp
new file mode 100644
index 0000000..4060fa6
--- /dev/null
+++ b/distributions/normed_dgauss1d.hpp
@@ -0,0 +1,75 @@
+#ifndef NDGAUSS_MODEL_H_
+#define NDGAUSS_MODEL_H_
+#define OPT_HEADER
+#include <core/fitter.hpp>
+#include <cmath>
+#include <misc/optvec.hpp>
+
+namespace opt_utilities
+{
+ template <typename T>
+ class normed_dgauss1d
+ :public model<optvec<T>,optvec<T>,optvec<T>,std::string>
+ {
+ private:
+ normed_dgauss1d* do_clone()const
+ {
+ return new normed_dgauss1d<T>(*this);
+ }
+
+ const char* do_get_type_name()const
+ {
+ return "1d double normed gaussian";
+ }
+ public:
+ normed_dgauss1d()
+ {
+ this->push_param_info(param_info<optvec<T> >("x01",0));
+ this->push_param_info(param_info<optvec<T> >("sigma1",1));
+ this->push_param_info(param_info<optvec<T> >("x02",0.1));
+ this->push_param_info(param_info<optvec<T> >("sigma2",1));
+ this->push_param_info(param_info<optvec<T> >("theta",1));
+ }
+
+
+ public:
+ optvec<T> do_eval(const optvec<T>& x,const optvec<T>& 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<std::numeric_limits<double>::epsilon())
+ {
+ sigma1=std::numeric_limits<double>::epsilon();
+ }
+ if(sigma2*sigma2<std::numeric_limits<double>::epsilon())
+ {
+ sigma2=std::numeric_limits<double>::epsilon();
+ }
+ T N1=1/sqrt(sigma1*sigma1*pi*2);
+ T N2=1/sqrt(sigma2*sigma2*pi*2);
+
+ optvec<T> y1=(x-x01)/sigma1;
+ optvec<T> 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