lunes, 10 de julio de 2017

Algoritmo por dicotomía para obtener la raíz cuadrada de un número en Javascript

Vamos a calcular la raíz cuadrada de un número usando un algoritmo por dicotomía.

Se denomina por dicotomía ya que lo que se hace es dividir el intervalo en dos mitades y analizar en cuál de las dos mitades debería estar el valor buscado, y luego volver a dividir esa mitad en dos mitades y así sucesivamente.

Primero lo vamos a ver paso a paso en la hoja de cálculo de Google. Este es el enlace:

Para calcular la raíz cuadrada de un número introducimos éste en la celda de color rosa (B3). Creamos una tabla con 100 iteraciones. Veamos cada columna.

  • inf. Es el valor inferior del intervalo en el que se encuentra la raíz del número buscado. Inicialmente es cero, ya que al raíz de un número positivo siempre tendrá como valor inferior el cero.
  • sup. Es el valor superior del intervalo donde estamos buscando la raíz del número buscado.  Inicialmente usamos como límite superior del ese intervalo el propio valor x. Si x es 2 y estamos buscando calcular la raíz de 2, el límite superior inicialmente será 2.
  • med. Es la media. Es el valor medio entre el límite inferior y el límite superior. med = (inf+sup)/2. Este valor se supone que a medida que aumenten las iteraciones irá tendiendo a la raíz de x.
  • med^2. Es la media al cuadrado. Este valor se supone que a medida que se sucedan las iteraciones irá tendiendo al valor de x.
Si x=2 quiere decir que estamos intentando calcular la raíz cuadrada de 2.

Veamos como se calcula el valor inf y sup de las siguientes iteraciones. Se calcula utilizando condicionales IF.

  • Si med^2 es menor que x entonces inf=med. Vea la fórmula de la celda E5: =if(H4<$B$3;G4;E4)
  •  Si med^2 es mayor que x entonces sup=med. Vea la fórmula de la celda E6: =if(H4>$B$3;G4;F4)

Veamos el resultado si x=40.
Veamos el resultado si x=400.

Vamos a implementar este algoritmo en Javascript.

 <!DOCTYPE html>  
 <html>  
  <head>  
   <meta charset="utf-8">  
   <title>Algoritmo de cálculo de la Raíz cuadrada en Javascript</title>  
  </head>  
  <body>  
   <script>  
    var x=Math.floor(prompt("Indique el número",40));  
    var inf=0;  
    var sup=x;  
    var media=(inf+sup)/2;  
    var ciclos=0;  
    console.log("x: "+x);  
    while(Math.abs(Math.pow(media,2)-x)>1e-16 && ciclos<1000){  
    console.log("inf: "+inf);  
    console.log("sup: "+sup);  
    console.log("media: "+media);  
    console.log("_____________");  
    if (Math.pow(media,2)<x){  
     inf=media;  
    }else{  
     sup=media;  
    }  
    media=(inf+sup)/2;  
    ciclos++; //ciclos evita que se quede pillado el código por haber pedido una precisión tan fina  
    //se podría haber quitado ciclos si la precisión fuera 1e-14  
    }  
    document.write(media +" valor calculado"+"<br>");  
    document.write(Math.sqrt(x,2)+" raiz cuadrada"+"<br>");  
    document.write(Math.abs(Math.sqrt(x,2)-media)+" Error");  
   </script>  
  </body>  
 </html>  


El enlace para ver el programa es el siguiente. Vea la consola (pulsando F12 y Console, en Chrome) para comprobar cómo se ha ido produciendo la convergencia.
Después de ejecutar el programa puede ver el código pulsando Control+u.

No hay comentarios:

Publicar un comentario