Меня попросили написать программу поиска root, которая использует метод секущих. Хотя само упражнение несложно, я прохожу только 2 из 5 заявленных примеров, и я не знаю почему. Моя функция выглядит так:
template <class T >
bool secant ( double &x , T f , double x0 , double x1 , double eps , int n = 1000){
x = x0;
double c, xp, xInter, xm;
if(eps<=0){cout << "Wrong epsilon" << endl; return false;}
if(n<=0){cout << "Wrong n" << endl; return false;}
if(f==nullptr){cout <<"No function" << endl; return false;}
if (f(x0)*f(x1)<0){
do{
//intermediate value
xInter = (x0*f(x1)-x1*f(x0))/(f(x1)-f(x0));
cout << n << endl;
c = f(xInter)*f(x0);
x0 = x1;
x1 = xInter;
n--;
if (c==0){
break;
}
if (n==0){
cout << "Number of iterations exceeded.";
break;
}
xm = (x0*f(x1)-x1*f(x0))/(f(x1)-f(x0));
} while(abs(xm - xInter)>= eps);
}
x = xInter;
return true;
}
И вызывается в основном так:
double x;
for ( auto fx : { f1 , f2 , f3 , f4 , f5 }) {
for ( auto eps : {0.1 , 0.01 , 0.001 , 0.0001 , 0.0000001}) {
if ( secant (x , fx , 0.1 , 3 , eps )) {
cout << setprecision (8) << "eps = " << eps
<< "\t root = " << x << endl;
} else {
cout << " Unable to find root " <<endl;
}
}
cout << endl ;
}
Есть 5 функций для тестирования:
- x ^ 2
- x ^ 2-2
- e ^ x + x-1
- log (x) -x + 1
- sin (x + 0.5 )
И 2-я, и 5-я функции дают хорошие результаты (1.4142136 и 2.6415926, как и ожидалось), но все остальные функции возвращают те же числа:
- (для epsilon = 0.1): 8.0 ... e-307
- (для каждого второго эпсилона): 1.5 ... e + 231
Что я делаю не так?