testMinimize.cxx

Go to the documentation of this file.
00001 // @(#)root/minuit2:$Id: testMinimize.cxx 20880 2007-11-19 11:23:41Z rdm $
00002 // Author: L. Moneta    12/2005  
00003 /**
00004    test of a pure minimization passing a user FCN class directly to the 
00005    TFitterMinuit
00006 
00007 */
00008 #include "TH1.h"
00009 #include "TF1.h"
00010 #include "TRandom3.h"
00011 #include "TVirtualFitter.h"
00012 #include "TStyle.h"
00013 #include "Minuit2/FCNBase.h"
00014 #include "TFitterMinuit.h"
00015 #include "TSystem.h"
00016 #include "TStopwatch.h"
00017 
00018 #include <vector>
00019 #include <iostream>
00020 
00021 class MyFCN : public ROOT::Minuit2::FCNBase { 
00022 
00023 public: 
00024 
00025   MyFCN(double a = 100, double b = 1) : fA(a), fB(b) {}
00026 
00027   double operator() (const std::vector<double> & x) const {
00028     // Rosebrock function
00029     return  fA*(x[1] - x[0]*x[0])*(x[1] - x[0]*x[0]) + fB*(1 - x[0])*(1 - x[0]);
00030   } 
00031   
00032   double Up() const { return 1.; }
00033 
00034 private: 
00035 
00036   double fA;
00037   double fB; 
00038 
00039 };
00040 
00041 int testMinimize() { 
00042 
00043   gSystem->Load("libMinuit2");
00044 
00045   TFitterMinuit * minuit = new TFitterMinuit();
00046 
00047   MyFCN fcn;
00048   minuit->SetMinuitFCN(&fcn);
00049   // starting values 
00050   double startX = -1.2; 
00051   double startY = 1.0;
00052   // if not limited (vhigh <= vlow) 
00053   minuit->SetParameter(0,"x",startX,0.1,0,0);
00054   minuit->SetParameter(1,"y",startY,0.1,0,0);
00055   minuit->SetPrintLevel(3);
00056   // create Minimizer (default is Migrad)
00057   minuit->CreateMinimizer();
00058   int iret = minuit->Minimize();
00059   if (iret != 0) { 
00060      return iret; 
00061   }
00062 
00063   std::cout << "\nTest performances........\n\n"; 
00064 
00065   // test performances 
00066   int nMin = 10000; 
00067   TStopwatch w; 
00068   w.Start();
00069   for (int i = 0; i < nMin; ++i) { 
00070      minuit->Clear();
00071      // reset -everything
00072      //minuit->SetMinuitFCN(&fcn); 
00073      minuit->SetParameter(0,"x",startX,0.1,0,0);
00074      minuit->SetParameter(1,"y",startY,0.1,0,0);
00075      minuit->SetPrintLevel(0);
00076      // create Minimizer (default is Migrad)
00077      minuit->CreateMinimizer();
00078      iret = minuit->Minimize();
00079      if (iret != 0) { 
00080         std::cout << "Minimization failed - exit " ; 
00081         return iret; 
00082      }
00083   }
00084   w.Stop();
00085   std::cout << "\nTime: \t" << w.RealTime() << " , " << w.CpuTime() << std::endl;  
00086   return 0; 
00087 }
00088 
00089 #ifndef __CINT__
00090 int main() { 
00091   int iret = testMinimize();
00092   if (iret != 0) { 
00093     std::cerr << "ERROR: Minimize test failed !" << std::endl;
00094     return iret;
00095   }
00096   return 0;
00097 }
00098 #endif

Generated on Tue Jul 5 14:37:13 2011 for ROOT_528-00b_version by  doxygen 1.5.1