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