C++:牛顿拉夫森和重载函数

标签 c++ function iteration newtons-method

我编写了牛顿拉夫森求根算法的简单实现,该算法需要初始猜测 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 个参数,而不仅仅是一两个(请忽略这些函数的想法我在示例中展示的是简单的线性函数,这只是一个示例)。有没有办法为不同数量的参数实现该函数,或者我是否必须为每种情况编写一个实现?

谢谢

NAX

注意

正如您现在所知,这个问题实际上并不是关于牛顿拉夫森的,但如果我用它作为实际问题的示例,它会变得更容易,这是不同数量参数的函数的单一实现.

更新

下面的一些答案使用 std::bindstd::function解决问题,这实际上比所选答案更好地解决了我的问题;然而,它们是 c++11 库类/函数(不要误会我的意思,我强烈敦促每个 c++ 程序员继续学习),在撰写本文时,我面临一些问题使用它们;使用 g++ 4.7(兼容 c++11)的 Eclipse Juno 仍然无法识别 std::function ,因此我决定坚持使用下面检查过的答案,这也很好用。

最佳答案

我认为您要求的是可变参数函数:

A variadic function – a function declared with a parameter list ending with ellipsis (...) – can accept a varying number of arguments of differing types. Variadic functions are flexible, but they are also hazardous. The compiler can't verify that a given call to a variadic function passes an appropriate number of arguments or that those arguments have appropriate types. Consequently, a runtime call to a variadic function that passes inappropriate arguments yields undefined behavior. Such undefined behavior could be exploited to run arbitrary code. From here:

https://www.securecoding.cert.org/confluence/display/cplusplus/DCL31-CPP.+Do+not+define+variadic+functions

但是,正如上面引用的,它们存在许多问题。

最值得注意的是,它仅适用于编译时!

但是,如果您有兴趣实现一个,这里有一篇文章,里面有一个很好的示例:

http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=138

更新:

IMO,我认为最好定义采用结构或对象参数(即通用函数对象)的函数,并编写显式处理这些参数的函数。

另一个选择是做一些编译时 reflection - 这很有用,但在这样的例子中做起来太麻烦了。另外,C++ 中的“反射”并不是“真正的”反射,而是其糟糕且不完整的实现。

关于C++:牛顿拉夫森和重载函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15469800/

相关文章:

c++ - 私有(private)析构函数友元函数

java - 如何将十进制转换为十六进制?

c++ - Qt中如何在tabview中设置一个新的item,并保存之前的

c++ - 输出随机数

c - 函数原型(prototype)声明

c - BST 的插入迭代方法 (C)

python - 如何在 python 中解压嵌套元组?

c++ - 在可变参数模板中实现 STL 函数

c++ - 在 C++ 中实现 >2 维的多元高斯概率密度函数

MySQL日期差异迭代查询——精简查询或优化数据结构