00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "Minuit2/FCNGradientBase.h"
00011
00012 namespace ROOT {
00013
00014 namespace Minuit2 {
00015
00016
00017 class Quad4F : public FCNBase {
00018
00019 public:
00020
00021 Quad4F() {}
00022
00023 ~Quad4F() {}
00024
00025 double operator()(const std::vector<double>& par) const {
00026
00027 double x = par[0];
00028 double y = par[1];
00029 double z = par[2];
00030 double w = par[3];
00031
00032 return ( (1./70.)*(21*x*x + 20*y*y + 19*z*z - 14*x*z - 20*y*z) + w*w );
00033 }
00034
00035 double Up() const {return 1.;}
00036
00037 private:
00038
00039 };
00040
00041
00042 class Quad4FGrad : public FCNGradientBase {
00043
00044 public:
00045
00046 Quad4FGrad() {}
00047
00048 ~Quad4FGrad() {}
00049
00050 double operator()(const std::vector<double>& par) const {
00051
00052 double x = par[0];
00053 double y = par[1];
00054 double z = par[2];
00055 double w = par[3];
00056
00057 return ( (1./70.)*(21*x*x + 20*y*y + 19*z*z - 14*x*z - 20*y*z) + w*w );
00058 }
00059
00060 std::vector<double> Gradient(const std::vector<double>& par) const {
00061
00062 double x = par[0];
00063 double y = par[1];
00064 double z = par[2];
00065 double w = par[3];
00066
00067
00068 std::vector<double> g(4);
00069 g[0] = (1./70.) * ( 42. * x - 14. * z );
00070 g[1] = (1./70.) * ( 40. * y - 20. * z );
00071 g[2] = (1./70.) * ( 38. * z - 14. * x - 20. * y );
00072 g[3] = 2. * w;
00073 return g;
00074 }
00075
00076 double Up() const {return 1.;}
00077
00078 private:
00079
00080 };
00081
00082
00083 }
00084
00085 }