我写了一个牛顿拉夫森求根算法的简单实现,它以初始猜测init
、一元函数f
和容差tol
作为参数,如下所示:
bool newton_raphson(double& init,
double(*f)(double),
double tol){
const int max_iter = 10000;
double next_x, soln = init;
int i = 0;
while(++i < max_iter){
next_x = soln - f(soln)/fp_x(f, soln);
if(fabs(next_x - soln) < tol){
init = next_x;
return true;
}
soln = next_x;
}
return false;
}
double fp_x(double(*f)(double),
double x){
const double h = 0.000001;
return (f(x + h) - f(x - h))/2.0/h;
}
我的问题是:虽然这对于一元函数非常有效,但我想更改实现,使其适用于f
具有多个参数的函数,但除一个参数之外的所有函数都具有常量值。澄清一下:如果我有一个函数 f(x) = 3x + 2 如下所示
double f(double x){
return (3*x + 2);
}
然后我的实现工作。但是,我也希望它适用于具有任何给定数量参数的任何函数,但只有第一个参数是可变的。所以,如果我有一个函数 f(x,y) = 3x + 2y
double f(double x, double y){
return (3*x + 2*y);
}
我想使用相同的函数找到 f(x,2) 或 f(x,3) 的根,等等 n 个参数,而不仅仅是一个或两个(请忽略我在该示例是简单的线性函数,这只是一个示例)。有什么方法可以为不同数量的参数实现函数,还是我必须为每种情况编写一个实现?
谢谢,
纳克斯
笔记
正如您现在所知道的那样,这个问题实际上并不是关于 newton-raphson,但是如果我将它用作实际问题的示例,它会变得更容易,这是针对不同数量参数的函数的单一实现。
更新
下面的一些答案使用std::bind
和std::function
解决问题,实际上比选择的答案更好地解决了我的问题;但是,它们是 c++11 库类/函数(请不要误会,这是我强烈敦促每个 c++ 程序员继续学习的东西),在撰写本文时,我正面临一些问题使用它们; 使用 g++ 4.7(符合 c++11)的 Eclipse Juno 仍然无法识别std::function
,因此我决定继续使用下面的检查答案,这也很好用。