牛顿的方法返回NaN

时间:2012-11-15 17:18:53

标签: c++ nan newtons-method

我写了牛顿方法的简单递归版本:

#include <cmath>

using namespace std;

double DeriveAt(double (*f)(double), double x){
    return( (f(x+0.001)-f(x-0.001))/0.002 );
};

double FindRoot(double (*f)(double), double x0){
    double corr=f(x0)/DeriveAt(f,x0);
    if(abs(corr) > 1.E-7)
            FindRoot(f, x0-corr);
    else return(x0);
};

如果我拨打我的电话,例如FindRoot(sin, 4)NaN被退回。我通过在每一步之后打印x0的值来检查函数,并且所有内容似乎都在最后一次迭代中工作。出于某种原因,该函数调用自身的次数超过实际应用的次数,可能在计算最后0/0时创建类似corr的内容。

1 个答案:

答案 0 :(得分:3)

如果我改变

if(abs(corr) > 1.E-7)
        FindRoot(f, x0-corr);

if(abs(corr) > 1.E-7)
        return FindRoot(f, x0-corr);

然后FindRoot(sin, 4)返回一些近似于Pi的内容。