0

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

#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在计算 last 时创建类似的东西corr

4

1 回答 1

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 的东西。

于 2012-11-15T17:25:09.500 回答