1

Suppose I have a function with three parameters:

f(x, y, z)
{
  return x*x + y*y + z*z;
}

and I have a minimum search function golden() only works for function with one parameter.

      //Given a function myFunc, and a bracketing triplet of abscissas ax bx cx(such that bx is between ax and cx, and myFunc(bx) is less than both myFunc(ax) and myFunc(cx)). This routine performs a golden section searhc for the minimum, isolating it to a fractional precision of about tol. The abscissa of the minumum is xmin.
      function golden(ax, bx, cx, myFunc, tol)
      {
        var r = 0.61803399;
        var c = 1.0 - r;
        var f1, f2, x0, x1, x2, x3, xmin;

        x0 = ax;            //At any given time we will keep track of four points, x0, x1, x2, x3.
        x3 = cx;
        if(Math.abs(cx - bx) > Math.abs(bx - ax))   //Make x0 to x1 the smaller segment
        {
            x1 = bx;
            x2 = bx + c * (cx - bx);                 //and fill in the new poit to be tried
        }else
        {
            x2 = bx;
            x1 = bx - c * (bx - ax);
        }
        f1 = myFunc(x1);        //the initial funciton evaluations. Note that we never neeed to evaluate the function at the original endpoints.
        f2 = myFunc(x2);
        while(Math.abs(x3 - x0) > tol * (Math.abs(x1) + Math.abs(x2)))
        {
          if(f2 < f1)           //One possible outcome,
          {
            x0 = x1; x1 = x2; x2 = r  * x1 + c * x3;    //its housekeeping,
            f1 = f2; f2 = myFunc(x2);                   //and a new funciton evaluation
          }else                 //The other outcome,
          {
            x3 = x2; x2 = x1; x1 = r * x2 + c * x0;
            f2 = f1; f1 = myFunc(x1);                   //and its new funciton evaluation.
          }
        }                       //Back to see if we are done.
        if(f1 < f2)             //We are done. Output the best of the two current values.
        {
            xmin = x1;
            //return f1;
        }else
        {
            xmin = x2;
            //return f2;
        }
        return xmin;
      }

How can I trans the f with three parameters to func with one parameter.

I have tryed to wrap the f like so:

wrapFunc(x)
{
  f(x, 0, 0);
}

But I use a constant y:0, z:0 here. I want to make the y, and z assiginable?

I need to search in x, y, z direction separately. And the search base is on the prior search.

For example. First base is (1,1,1) x direction search -> (0, 1, 1) then y directon search -> (0, 0, 1) then z direction search -> (0,0,0);

The programming language is javascript. Any help will be appreciated. Thanks

2
  • 1
    it depends on the calculation, you make. please add the rest as well and have a look here minimal reproducible example. Commented Dec 12, 2016 at 10:08
  • @NinaScholz I have edit it. Commented Dec 12, 2016 at 10:24

2 Answers 2

2

You can use currying. E.g.

function curry (y,z) {
    return function (x)
    {
       console.log(x +  y + z);
    }
}

var addToThis = curry(1,2);
addToThis(3); // 6
addToThis(5); //8

Edit: You added some more code, so more specifically...

function presetGoldenBxCx(bx, cx) {
    return function golden(ax, myFunc, tol)
          {
            var r = 0.61803399;
            var c = 1.0 - r;
            var f1, f2, x0, x1, x2, x3, xmin;

            x0 = ax;            //At any given time we will keep track of four points, x0, x1, x2, x3.
            x3 = cx;
            if(Math.abs(cx - bx) > Math.abs(bx - ax))   //Make x0 to x1 the smaller segment
            {
                x1 = bx;
                x2 = bx + c * (cx - bx);                 //and fill in the new poit to be tried
            }else
            {
                x2 = bx;
                x1 = bx - c * (bx - ax);
            }
            f1 = myFunc(x1);        //the initial funciton evaluations. Note that we never neeed to evaluate the function at the original endpoints.
            f2 = myFunc(x2);
            while(Math.abs(x3 - x0) > tol * (Math.abs(x1) + Math.abs(x2)))
            {
              if(f2 < f1)           //One possible outcome,
              {
                x0 = x1; x1 = x2; x2 = r  * x1 + c * x3;    //its housekeeping,
                f1 = f2; f2 = myFunc(x2);                   //and a new funciton evaluation
              }else                 //The other outcome,
              {
                x3 = x2; x2 = x1; x1 = r * x2 + c * x0;
                f2 = f1; f1 = myFunc(x1);                   //and its new funciton evaluation.
              }
            }                       //Back to see if we are done.
            if(f1 < f2)             //We are done. Output the best of the two current values.
            {
                xmin = x1;
                //return f1;
            }else
            {
                xmin = x2;
                //return f2;
            }
            return xmin;
          }
}

const golden11= presetGoldenBxCx(1, 1);
const answer = golden11(1);
Sign up to request clarification or add additional context in comments.

3 Comments

is the const necessary?
looks well, I'll check it. Thank you.
thank you. Save me a lot of time, otherwise I've to reconstruct my cod.
1

you can just call f with one parameter. all the other params will have the value 'undefined':

f(5); // x=5, y=undefined, z=undefined

2 Comments

Came here to say this
How I search in the y direction? And how can I search in the x directionn from the begin{x:4, y:5, z:4}?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.