我写了牛顿方法的简单递归版本:
#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
。