input : minimizer name + algorithm name randomSeed: = <0 : fixed value: 0 random with seed 0; >0 random with given seed
import ROOT
import numpy as np
def RosenBrock(vecx):
x = vecx[0]
y = vecx[1]
return (y - x**2)**2 + (1 - x)**2
def NumericalMinimization(minimizerName="Minuit2",
algoName="",
randomSeed=-1):
if (not minimizer):
raise RuntimeError(
"Cannot create minimizer \"{}\". Maybe the required library was not built?".format(minimizerName))
minimizer.SetMaxFunctionCalls(1000000)
minimizer.SetMaxIterations(10000)
minimizer.SetTolerance(0.001)
minimizer.SetPrintLevel(1)
x0 = np.array([-1., 2.])
print(
"f(-1,1.2) = ",
f(x0))
variable = [-1., 1.2]
step = [0.01, 0.01]
if (randomSeed >= 0):
r = ROOT.TRandom2(randomSeed)
variable[0] = r.Uniform(-20, 20)
variable[1] = r.Uniform(-20, 20)
minimizer.SetFunction(f)
minimizer.SetVariable(0, "x", variable[0], step[0])
minimizer.SetVariable(1, "y", variable[1], step[1])
ret = minimizer.Minimize()
xs = minimizer.X()
print("Minimum: f({} , {}) = {}".format(xs[0],xs[1],minimizer.MinValue()))
if (ret and minimizer.MinValue() < 1.E-4):
print("Minimizer {} - {} converged to the right minimum!".format(minimizerName, algoName))
else:
print("Minimizer {} - {} failed to converge !!!".format(minimizerName, algoName))
raise RuntimeError("NumericalMinimization failed to converge!")
if __name__ == "__main__":
NumericalMinimization()
static ROOT::Math::Minimizer * CreateMinimizer(const std::string &minimizerType="", const std::string &algoType="")
static method to create the corresponding Minimizer given the string Supported Minimizers types are: ...
Documentation for class Functor class.