Возможные ошибки при реализации метода секущих? - PullRequest
0 голосов
/ 06 мая 2020

Меня попросили написать программу поиска 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 функций для тестирования:

  1. x ^ 2
  2. x ^ 2-2
  3. e ^ x + x-1
  4. log (x) -x + 1
  5. sin (x + 0.5 )

И 2-я, и 5-я функции дают хорошие результаты (1.4142136 и 2.6415926, как и ожидалось), но все остальные функции возвращают те же числа:

  1. (для epsilon = 0.1): 8.0 ... e-307
  2. (для каждого второго эпсилона): 1.5 ... e + 231

Что я делаю не так?

...