00001
00012 #ifdef _MSC_VER
00013 #include "msdevstudio/MSconfig.h"
00014 #endif
00015
00016 #include "Novosibirsk.h"
00017
00018 #include "FunctionHelper.h"
00019
00020 #include <cmath>
00021 #include <cassert>
00022
00023 using std::exp;
00024 using std::vector;
00025
00026 using namespace hippodraw;
00027
00028 Novosibirsk::Novosibirsk ( )
00029 {
00030 initialize ();
00031 }
00032
00033 Novosibirsk::Novosibirsk ( double n, double m, double s, double t )
00034 {
00035 initialize ();
00036
00037 m_parms[norm] = n;
00038 m_parms[mean] = m;
00039 m_parms[sigma] = s;
00040 m_parms[tail] = t;
00041 }
00042
00043 void Novosibirsk::initialize ()
00044 {
00045 m_name = "Novosibirsk";
00046
00047 m_parm_names.push_back ( "Norm" );
00048 m_parm_names.push_back ( "Mean" );
00049 m_parm_names.push_back ( "Sigma" );
00050 m_parm_names.push_back ( "Tail" );
00051
00052 resize ();
00053 }
00054
00055 FunctionBase * Novosibirsk::clone () const
00056 {
00057 return new Novosibirsk ( *this );
00058 }
00059
00060 double Novosibirsk::operator () ( double x ) const
00061 {
00062
00063
00064 double qa=0,qb=0,qc=0,qx=0,qy=0;
00065 double result=0;
00066
00067 if(fabs(m_parms[tail]) < 1.e-7)
00068 qc = 0.5*pow((( x -m_parms[mean])/m_parms[sigma]),2);
00069 else {
00070 qa = m_parms[tail]*sqrt(log(4.));
00071 qb = sinh(qa)/qa;
00072 qx = ( x - m_parms[mean])/m_parms[sigma]*qb;
00073 qy = 1.+m_parms[tail]*qx;
00074
00075
00076
00077 if( qy > 1.E-7)
00078 qc = 0.5*(pow((log(qy)/m_parms[tail]),2) + m_parms[tail]*m_parms[tail]);
00079 else
00080 qc = 15.;
00081 }
00082
00083
00084 result = m_parms[norm] * exp(-qc);
00085
00086 return result;
00087 }
00088
00089 void
00090 Novosibirsk::
00091 initialParameters ( const FunctionHelper * helper )
00092 {
00093 double min_x = helper->minCoord ();
00094 double max_x = helper->maxCoord ();
00095 int size = helper->size();
00096 double total = helper->getTotal ();
00097
00098 m_parms[norm] = total * ( max_x - min_x ) / size;
00099 m_parms[mean] = helper->meanCoord ();
00100 m_parms[sigma] = helper->stdCoord ();
00101 m_parms[tail] = 0.;
00102 }
00103
00104 double
00105 Novosibirsk::
00106 derivByParm ( int , double ) const
00107 {
00108 assert ( false );
00109 return 0.;
00110 }
00111
00112 bool
00113 Novosibirsk::
00114 hasDerivatives () const
00115 {
00116 return false;
00117 }