połączenie bisekcji i metody Newtona-Rhapsona

0

Witam,
mam do napisania program który znajdzie miejsca zerowe funkcji używając do tego bisekcji i metody N-R
na razie mój kod wygląda następująco:

#include <iostream>
#include <cmath>
using namespace std;

double funkcja(double x)
{      
       return pow(x,2) - 2*x - 2;     
}

double p1(double x)
{
       return 2*x - 2;       
}

int main()
{
double xr=0.7, x=0.4, xl=0.4, tol = 0.000001, xm, xi;
int bi=0, nr=0, i=0;

cout.precision(10);

while(abs((xr-xl)/xr) >= tol)
{
if( xl <= ( x - (funkcja(x) / p1(x)) ) && ( x - (funkcja(x) / p1(x) )) <= xr )
//if( ((x-xl)*p1(x)-funkcja(x))>=0 && ((x-xr)*p1(x)-funkcja(x))<=0 )
{
    x = xl;  
    xi = (x - (funkcja(x)/p1(x)));
    for(i = 1; abs( (xi-x) / xi ) >= tol; i++)
    {     
          xl = xi;
          xi = (x - (funkcja(x)/p1(x)));    
    }
    nr++;
}
else
{
    x = xl;
    xm = (xl+xr)/2;
    cout<<xl<<" "<<xr<<" "<<xm<<endl;
    if((funkcja(xl) * funkcja(xm)) < 0)
    {
             xr = xm;
    }
    else 
    {
             xl = xm;  
    }
    
    bi++;
} 
}  
    
cout << x << endl;
cout << "bi = " << bi << endl;
cout << "nr = " << nr << endl;
system("pause");
return 0;    
}

pytanie: gdzie popełniłem błąd ? czy while() powinien wyglądać właśnie tak ? może pomieszałem gdzieś zmienne ?
zwracany wynik nie zgadza się z oczekiwanym
jeżeli ktoś zauważył jakiś błąd, byłbym wdzięczny za jego wskazanie

0

x^2-2x-2 nie ma miejsca zerowego w przedziale [0.4, 0.7]

1 użytkowników online, w tym zalogowanych: 0, gości: 1