#include "f.hh"; #include #include #include using namespace std; inline double signof(double a) { return (a == 0) ? 0 : (a<0 ? -1 : 1); } 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 TrovaAscissaZero () {return (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 TrovaAscissaZero () { double x, y0, y1; int n = 0; while (fabs(x1-x0)>eps){ y0=f(x0); y1=f(x1); x = (x0*y1 - x1*y0)/(y1-y0); n++; //Test di convergenza x0=x1; x1=x; if(n>=nPassi){ cout <<"Attenzione: troppi passi nel metodo della secante" << endl; break; } } cout << "Metodo della secante. Lo zero e' stato trovato dopo " <eps){ y0=f(x0); x= x0 + (x1-x0)/2; // calcolo del valore medio yy=f(x); n++; if (n >= nPassi) { cout << "Attenzione: troppi passi nel metodo della bisezione" << endl; break; } if (signof(yy*y0) == 0 ) break; if (signof(yy)*signof(y0)<0) x1=x; else x0=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 = 100; Secante sec1(x0, x1, pre, nPassi); double xZero= sec1.TrovaAscissaZero(); double yZero = f(xZero); cout << "Intervallo di incertezza [" << setprecision(6)<< fixed << x0<< "," <