Search code examples
javascriptfunctionfunction-parameter

How to use function of multi parameters as function with one parameters?


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


Solution

  • 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);