#include <iostream>
#include <fstream>
#include <iomanip>
#include <cmath>
using namespace std;
#include "misfunciones.cpp"

double f(double x){
  //pow(x,3) = x*x*x
  return (pow(x,3)-3*x*x+1)*cos(x*x+1);
}

double deriva_f(double x){
  return (3*x*x - 6*x )*cos(x*x+1) -
         (pow(x,3)-3*x*x+1)*2*x* sin(x*x+1);
}

int main(){
  //Obtiene los ceros de la funcion f en el intervalo (-2,2)
  double eps, cero, x0, x1; int niter, is;
  fstream resultados("p6_resultados.txt",fstream::out);
  resultados<<setprecision(13);


  //METODO BISECCION
    resultados<<"Metodo Biseccion. Primer cero, para probar funcion."<<endl;
    eps = 1E-12;
    x0 = -2; x1 = -1.8;
    cero = biseccion(f, x0, x1, eps, niter, is);
    if(is == 0) resultados<<"N = "<<niter<<" R = "<<cero<<"\n";

    resultados<<"\n Metodo Biseccion. Bucle para obtener todos los ceros"<<endl;
    double x,xmin=-2,xmax=2, delta = 0.1;
    x = xmin;
    while(x < xmax){
      x0 = x; x1 = x + delta; niter=0;
      cero = biseccion(f, x0, x1, eps, niter, is);
      if(is == 0) resultados<<"N = "<<niter<<" R = "<<cero<<"\n";
      x = x + delta;
    }

  
  //METODO NEWTON
    resultados<<"\n \n \n Metodo Newton. Primer cero"<<endl;
    eps = 1E-12;
    x0 = -1.8;
    cero = newton(f,deriva_f, x0, eps, niter, is);
    if(is == 0) resultados<<"N = "<<niter<<" R = "<<cero<<"\n";

    resultados<<"\n Metodo Newton. Bucle para obtener todos los ceros"<<endl;
    x = xmin;
    while(x < xmax){
      x0 = x; x1 = x + delta;
      cero = newton(f,deriva_f, x0, eps, niter, is);
      if(is == 0) resultados<<"N = "<<niter<<" x0 = "<<x0<<" R = "<<cero<<"\n";
      x = x + delta;
    }

    resultados<<"\n Metodo Newton. Obtencion de todos los ceros"<<endl;
    x0 = -1.9;
    cero = newton(f,deriva_f, x0, eps, niter, is);
    if(is == 0) resultados<<"N = "<<niter<<" R = "<<cero<<"\n";

    x0 = -0.8;
    cero = newton(f,deriva_f, x0, eps, niter, is);
    if(is == 0) resultados<<"N = "<<niter<<" R = "<<cero<<"\n";

    x0 = -0.5;
    cero = newton(f,deriva_f, x0, eps, niter, is);
    if(is == 0) resultados<<"N = "<<niter<<" R = "<<cero<<"\n";

    x0 = 0.6;
    cero = newton(f,deriva_f, x0, eps, niter, is);
    if(is == 0) resultados<<"N = "<<niter<<" R = "<<cero<<"\n";

    x0 = 0.8;
    cero = newton(f,deriva_f, x0, eps, niter, is);
    if(is == 0) resultados<<"N = "<<niter<<" R = "<<cero<<"\n";

    x0 = 1.9;
    cero = newton(f,deriva_f, x0, eps, niter, is);
    if(is == 0) resultados<<"N = "<<niter<<" R = "<<cero<<"\n";

    
    
  //METODO SECANTE
    resultados<<"\n \n \n Metodo Secante. Primer cero"<<endl;
    eps = 1E-12;
    x0 = -2; x1 = -1.8;
    cero = secante(f, x0, x1,  eps, niter, is);
    if(is == 0) resultados<<"N = "<<niter<<" R = "<<cero<<"\n";

    resultados<<"\n Metodo Secante. Bucle para obtener todos los ceros"<<endl;
    x = xmin;
    while(x < xmax){
      x0 = x; x1 = x + delta;
      cero = secante(f, x0, x1,  eps, niter, is);
      if(is == 0) resultados<<"N = "<<niter<<" x0 = "<<x0<<" R = "<<cero<<"\n";
      x = x + delta;
    }    

    resultados<<"\n Metodo Secante. Obtencion de todos los ceros \n";
    x0 = -1.9; x1 = -1.85;
    cero = secante(f, x0, x1,  eps, niter, is);
    if(is == 0) resultados<<"N = "<<niter<<" R = "<<cero<<"\n";

    x0 = -0.8; x1 = -0.75;
    cero = secante(f, x0, x1,  eps, niter, is);
    if(is == 0) resultados<<"N = "<<niter<<" R = "<<cero<<"\n";

    x0 = -0.5; x1 = -0.4;
    cero = secante(f, x0, x1,  eps, niter, is);
    if(is == 0) resultados<<"N = "<<niter<<" R = "<<cero<<"\n";

    x0 = 0.5; x1 = 0.6;
    cero = secante(f, x0, x1,  eps, niter, is);
    if(is == 0) resultados<<"N = "<<niter<<" R = "<<cero<<"\n";

    x0 = 0.8; x1 = 0.9;
    cero = secante(f, x0, x1,  eps, niter, is);
    if(is == 0) resultados<<"N = "<<niter<<" R = "<<cero<<"\n";

    x0 = 1.85; x1 = 1.9;
    cero = secante(f, x0, x1,  eps, niter, is);
    if(is == 0) resultados<<"N = "<<niter<<" R = "<<cero<<"\n";

}
