如何将多参数函数用作单参数函数?
How to use function of multi parameters as function with one parameters?
假设我有一个带有三个参数的函数:
f(x, y, z)
{
return x*x + y*y + z*z;
}
我有一个最小的搜索函数 golden() 只适用于一个参数的函数。
//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;
}
如何将三参f转为一参func
我试过像这样包装 f:
wrapFunc(x)
{
f(x, 0, 0);
}
不过我这里用的是常量y:0、z:0。我想让 y 和 z 可分配?
我需要分别在x、y、z方向搜索。搜索基础是在之前的搜索。
例如。
第一个基是 (1,1,1) x 方向搜索 -> (0, 1, 1) 然后 y 方向搜索 -> (0, 0, 1) 然后 z 方向搜索 -> (0,0,0);
编程语言是javascript。
任何帮助将不胜感激。谢谢
你可以只用一个参数调用f
。所有其他参数的值为“undefined
”:
f(5); // x=5, y=undefined, z=undefined
您可以使用 currying。例如
function curry (y,z) {
return function (x)
{
console.log(x + y + z);
}
}
var addToThis = curry(1,2);
addToThis(3); // 6
addToThis(5); //8
编辑:您添加了更多代码,所以更具体...
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);
假设我有一个带有三个参数的函数:
f(x, y, z)
{
return x*x + y*y + z*z;
}
我有一个最小的搜索函数 golden() 只适用于一个参数的函数。
//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;
}
如何将三参f转为一参func
我试过像这样包装 f:
wrapFunc(x)
{
f(x, 0, 0);
}
不过我这里用的是常量y:0、z:0。我想让 y 和 z 可分配?
我需要分别在x、y、z方向搜索。搜索基础是在之前的搜索。
例如。 第一个基是 (1,1,1) x 方向搜索 -> (0, 1, 1) 然后 y 方向搜索 -> (0, 0, 1) 然后 z 方向搜索 -> (0,0,0);
编程语言是javascript。 任何帮助将不胜感激。谢谢
你可以只用一个参数调用f
。所有其他参数的值为“undefined
”:
f(5); // x=5, y=undefined, z=undefined
您可以使用 currying。例如
function curry (y,z) {
return function (x)
{
console.log(x + y + z);
}
}
var addToThis = curry(1,2);
addToThis(3); // 6
addToThis(5); //8
编辑:您添加了更多代码,所以更具体...
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);