#include "f.hh"; #include #include #include using namespace std; class TrovaZeri { protected: //precisione eps,[x0, x1] intervallo di incertezza, numero passi Npass double x0, x1, eps; int nPassi; public: TrovaZeri (); TrovaZeri (double, double, double, int); virtual double FindAscissaZero () {return (0);} //virtual double FindAscissaZero () = 0; }; TrovaZeri :: TrovaZeri (double xin, double xfin, double prec, int nSteps ) { x0 = xin; x1 = xfin; eps = prec; nPassi = nSteps; } TrovaZeri :: TrovaZeri () { x0 = -10; x1 = +10; eps= 1e-6; nPassi = 100; } class Secante : public TrovaZeri { public: //Applico il metodo della secante Secante (double , double , double , int ); // costruttore double FindAscissaZero () { double x, y0, y1; int n = 0; while (fabs(x1-x0)>eps){ y0=f(x0); y1=f(x1); // Controllo per y1 -y0 troppo piccolo!! // if(fabs(y1-y0)<0.001) y1 += 0.001; x = (x0*y1 - x1*y0)/(y1-y0); n++; //Test di convergenza x0=x1; x1=x; if(n>=nPassi){ cout << "Error : Too many steps in secant method" << endl; break; } } cout << "Metodo della secante. Lo zero e' stato trovato dopo " <eps){ y0=f(x0); x= x0 + (x1-x0)/2; // x=(x0+x1)/2; yy=f(x); n++; if (n >= nPassi) { cout << "Error: too many steps in bisection method" << endl; break; } if (yy*y0==0) break; if (yy*y0<0) {x1=x;} else {x0 = x;} //if (yy*y0>0) x0=x; //if (sign(yy)*sign(y0)<0) x1=x; } cout << "Metodo della bisezione. La zero e' trovato dopo " << n << " passi." << endl; return (x); } }; int main() { double x0 = -7.5; double x1 = +8.9; double pre = 1e-6; int nPassi = 200; Secante sec1(x0, x1, pre, nPassi); double xZero= sec1.FindAscissaZero(); double yZero = f(xZero); cout << "Intervallo di incertezza [" << setprecision(6)<< fixed << x0<< "," <