Example of using Python functions as inputs to numerical algorithms using the ROOT Functor class.
Use Functor1D for wrapping one-dimensional function and compute integral of f(x) = x^2-1integral-1D value = 5.999999999999999Use Functor for wrapping a multi-dimensional function, the Rosenbrock Function r(x,y) and find its minimum****************************************Minimizer is Minuit2 / MigradMinFCN = 1.687e-08NDf = 0Edm = 1.68896e-08NCalls = 146Par_0 = 0.999952 +/- 1.00372Par_1 = 0.999892 +/- 2.00986Use GradFunctor1D for making a function object implementing f(x) and f'(x)Found root value x0 : f(x0) = 0 : 1.0Use GradFunctor for making a function object implementing f(x,y) and df(x,y)/dx and df(x,y)/dy****************************************Minimizer is Minuit2 / MigradMinFCN = 2.72222e-08NDf = 0Edm = 2.72448e-08NCalls = 76Par_0 = 0.999954 +/- 1.00444Par_1 = 0.999892 +/- 2.01131import ROOTimport arraytry:import numpy as npexcept:print("Failed to import numpy.")exit()## example 1D functiondef f(x):return x*x -1func = ROOT.Math.Functor1D(f)#example of using the integralprint("Use Functor1D for wrapping one-dimensional function and compute integral of f(x) = x^2-1")ig = ROOT.Math.Integrator()ig.SetFunction(func)value = ig.Integral(0, 3)print("integral-1D value = ", value)expValue = 6print("Error computing integral - computed value - different than expected, diff = ", value - expValue)# example multi-dim functionprint("\n\nUse Functor for wrapping a multi-dimensional function, the Rosenbrock Function r(x,y) and find its minimum")def RosenbrockFunction(xx):x = xx[0]y = xx[1]tmp1 = y-x*xtmp2 = 1-xreturn 100*tmp1*tmp1+tmp2*tmp2func2D = ROOT.Math.Functor(RosenbrockFunction,2)### minimize multi-dim function using fitter classfitter = ROOT.Fit.Fitter()#use a numpy array to pass initial parameter arrayinitialParams = np.array([0.,0.], dtype='d')fitter.FitFCN(func2D, initialParams)if (not ROOT.TMath.AreEqualRel(fitter.Result().Parameter(0), 1, 1.E-3) or not ROOT.TMath.AreEqualRel(fitter.Result().Parameter(1), 1, 1.E-3)) :print("Error minimizing Rosenbrock function ")## example 1d grad function## derivative of f(x)= x**2-1print("\n\nUse GradFunctor1D for making a function object implementing f(x) and f'(x)")gradFunc = ROOT.Math.GradFunctor1D(f, g)#check if ROOT has mathmoreprevLevel = ROOT.gErrorIgnoreLevelret = ROOT.gSystem.Load("libMathMore")ROOT.gErrorIgnoreLevel=prevLevelif (ret < 0) :print("ROOT has not Mathmore")print("derivative value at x = 1", gradFunc.Derivative(1) )else :rf.SetFunction(gradFunc, 3)rf.Solve()value = rf.Root()print("Found root value x0 : f(x0) = 0 : ", value)if (value != 1):print("Error finding a ROOT of function f(x)=x^2-1")print("\n\nUse GradFunctor for making a function object implementing f(x,y) and df(x,y)/dx and df(x,y)/dy")def RosenbrockDerivatives(xx, icoord):x = xx[0]y = xx[1]#derivative w.r.t xif (icoord == 0) :return 2*(200*x*x*x-200*x*y+x-1)else :return 200 * (y - x * x)gradFunc2d = ROOT.Math.GradFunctor(RosenbrockFunction, RosenbrockDerivatives, 2)fitter = ROOT.Fit.Fitter()#here we use a python array to pass initial parametersinitialParams = array.array('d',[0.,0.])fitter.FitFCN(gradFunc2d, initialParams)if (not ROOT.TMath.AreEqualRel(fitter.Result().Parameter(0), 1, 1.E-3) or not ROOT.TMath.AreEqualRel(fitter.Result().Parameter(1), 1, 1.E-3)) :print("Error minimizing Rosenbrock function ")ROOT::Detail::TRangeCast< T, true > TRangeDynCastTRangeDynCast is an adapter class that allows the typed iteration through a TCollection.Definition TCollection.h:358void Print(Option_t *option="") const overrideDefinition TCollection.h:311GradFunctor1D class for one-dimensional gradient functions.Definition Functor.h:271GradFunctor class for Multidimensional gradient functions.Definition Functor.h:144User Class for performing numerical integration of a function in one dimension.Definition Integrator.h:98User Class to find the Root of one dimensional functions.Definition RootFinder.h:73Definition callcontext.h:13
Definition in file exampleFunction.py.