Calculo de la Raiz Cuadrada por el Método de Bisección y Newton Raphson en C++

 

#include <iostream>

#include <math.h>

#include <stdio.h>

#include <assert.h>

float raizNR(float x, float epsilon);



/*

// Metodo de Biseccion

float raizBi(float x, float epsilon)

{

 assert (x>=0);          //asume que x es no negativo

 assert (epsilon>0);    //asume que espsilon es mayor a cero


 float bajo = 0;

 

 int ctr=1;

    

    float alto;

    alto = (x,1);

    if(x >1){

        alto = x;

    }

    else{

        alto = 1;

   }

  


 float supuesto = (bajo+alto)/2.0;


 while (fabs(pow(supuesto,2)-x) > epsilon && ctr <= 100)

 {

     printf("%4.10f %4.10f %4.10f \n",bajo,alto,supuesto);


     if (pow(supuesto,2) < x)

        bajo = supuesto;

     else

        alto = supuesto;


   supuesto = (bajo+alto)/2.0;

   ctr += 1;


   //assert(ctr <= 100);

}


   std::cout << "Iteraciones " << ctr << std::endl;

   std::cout << "Estimado " << supuesto << std::endl;


   return supuesto;


}

*/



int main(int argc, char **argv)

{

 /*

    double elev1=pow(2,1000);

    //es un número gigante, tienen un formato interno largo.


    double elev2=pow(2,999);

    double div=elev1/elev2;

    std::cout << "elev1 / elev2: div " << std::endl;

    printf("%4.12f \n %4.12f \n %4.12f \n",elev1,elev2,div);

 */



 /*

       double x,y,z;


       x = 1.2;

       y = 1.1;

       z = x * y;


       float a,b,c;

       a = 1.2;

       b = 1.1;

       c = a * b;


       double f;

       f=x*b;


       std::cout << "double x double:  " << std::endl;

       printf("%4.10f %4.10f %4.10f \n",x,y,z);

       std::cout << "float x float:  " << std::endl;

       printf("%4.10f %4.10f %4.10f \n",a,b,c);

       std::cout << "double x float:  " << std::endl;

       printf("%4.10f %4.10f %4.10f \n",x,b,f);

*/




 /*  double xx=sqrt(2);


   if (xx*xx==2.0)

      std::cout << "son iguales  " << std::endl;

   else

      printf("%4.17f \n",xx*xx);

*/



 /*

   double xx=sqrt(2);

   float epsilon = 0.0000000001;


   if (xx-xx*xx<=epsilon)

      std::cout << "son iguales  " << std::endl;

   else

      printf("%4.17f \n",xx*xx);

*/



      float resultado = raizNR(0.25,0.0001);  //2-4-9

      //float resultado=raizNR(16,0.0001);

      std::cout << "RESULTADO  " << resultado << std::endl;


    return 0;

}





//Metodo de Newton Raphson

float raizNR(float x, float epsilon)

{

 assert (x>=0);          //asume que x es no negativo

 assert (epsilon>0);     //asume que espsilon es mayor a cero


 float dif = 0;

 int ctr=1;


 float supuesto = x/2.0;

 dif = pow(supuesto,2) - x;


      printf("%4.10f %4.10f %4.10f \n",supuesto,dif,2.0*supuesto);


    while (fabs(dif) > epsilon && ctr <= 100)

    {

      supuesto = supuesto-dif/(2.0*supuesto);

      dif = pow(supuesto,2)-x;

      printf("%4.10f %4.10f %4.10f \n",supuesto,dif,2.0*supuesto);

      ctr += 1;

      assert (ctr<=100);

    }


      std::cout << std::endl;

      std::cout << "Iteraciones " << ctr << std::endl;

      std::cout << "Estimado " << supuesto << std::endl;

      return supuesto;

}




Publicar un comentario

0 Comentarios