I am attempting to minimize an objective function with multiple local minima, and would like to ask Mata to try multiple initial values so that I can identify which local minimum is the global minimum. The code below shows that obj() has local minimums around x = -6 and x = 4, and which minimum is realized depends on the initial value. How might I do this for say 30 random values in a given range?
This is the output.
Code:
void obj(real scalar todo, real scalar x, fval, grad, hess) { fval = x * sin(x+1) } // minimize S = optimize_init() optimize_init_evaluator(S, &obj()) optimize_init_which(S, "min") optimize_init_params(S, 4) xstar1 = optimize(S) xstar1 fval1 = optimize_result_value(S) fval1 S = optimize_init() optimize_init_evaluator(S, &obj()) optimize_init_which(S, "min") optimize_init_params(S, -6) xstar2 = optimize(S) xstar2 fval2 = optimize_result_value(S) fval2 end
Code:
. mata: mata clear . mata ------------------------------------------------- mata (type end to exit) ---------------------------------- : void obj(real scalar todo, real scalar x, fval, grad, hess) > { > fval = x * sin(x+1) > } note: argument todo unused note: argument grad unused note: argument hess unused : : // minimize : S = optimize_init() : optimize_init_evaluator(S, &obj()) : optimize_init_which(S, "min") : optimize_init_params(S, 4) : xstar1 = optimize(S) Iteration 0: f(p) = -3.8356971 Iteration 1: f(p) = -3.8392227 Iteration 2: f(p) = -3.8392229 : xstar1 3.9597575 : fval1 = optimize_result_value(S) : fval1 -3.839222897 : : S = optimize_init() : optimize_init_evaluator(S, &obj()) : optimize_init_which(S, "min") : optimize_init_params(S, -6) : xstar2 = optimize(S) Iteration 0: f(p) = -5.7535456 Iteration 1: f(p) = -5.7975924 Iteration 2: f(p) = -5.7976005 Iteration 3: f(p) = -5.7976005 : xstar2 -5.880822144 : fval2 = optimize_result_value(S) : fval2 -5.797600501 : end