ニュートン法の単純な再帰バージョンを作成しました。
#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
ます。