proc(1) = f(par); retp(maxc(par)); endp; proc(1) = brutemin(&f, parms); local f:proc; clearg lsize,lmult,lj,lpar1,lf,lval,lindx,lmultmin; lsize = 1; /* searches from parms - lsize*parms to parms + lsize*parms*/ lshift = 1; /* find vector of all parameters to try */ lmult = (lshift-lsize~lshift~lshift+lsize); lj = 2; do while lj <= rows(parms); lmult = (lmult[1,.].*.ones(1,3))|(ones(1,3).*.lmult); lj = lj+1; endo; lpar1 = parms.*lmult; /* this is a matrix of par vectors */ /* find f at all values of lpar1 */ lf = zeros(cols(lpar1),1); lj = 1; do while lj <= cols(lpar1); lf[lj] = f(lpar1[.,lj]); lj = lj+1; endo; /* find minimum value and its index in f */ lval = minc(lf); lindx = indexcat(lf,lval); /* find corresponding mult */ lmultmin = lmult[.,lindx]; /* update lsize. if min is halfway, make smaller. if min is top or bottom, move up/down, make bigger */ retp(lf); endp; call brutemin(&f,5|7);