Я написал простую рекурсивную версию метода Ньютона:
#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
,
Если я изменю
if(abs(corr) > 1.E-7)
FindRoot(f, x0-corr);
в
if(abs(corr) > 1.E-7)
return FindRoot(f, x0-corr);
затем FindRoot(sin, 4)
возвращает что-то, приближающее Пи.
Других решений пока нет …