Con la tecnología de Blogger.

Cálculo del número irracional π


Cálculo del número irracional π

package pi;

public class PiApp {


public static void main(String[] args) {
//polígonos inscritos en una circunferencia de radio unidad
double perimetro=3*Math.sqrt(3);
//triángulo equilátero inscrito
long n=3;
int i=0;
while(i<30){
perimetro=2*n*Math.sqrt(2.0-Math.sqrt(4.0-(perimetro/n)*(perimetro/n)));
n=2*n;
i++;
System.out.println(i+" -- "+perimetro/2);
}

try {
//espera la pulsación de una tecla y luego RETORNO
System.in.read();
}catch (Exception e) { }
}
}

Para hallar la longitud de una circunferencia de radio R, primero se calcula el perímetro de un triángulo equilátero (3 lados) inscrito en dicha circunferencia, luego, de un hexágono (6 lados), un dodecágono (12 lados), y así sucesivamente. El límite de la sucesión de perímetros es precisamente la longitud de la circunferencia 2π R.

Si tomamos una circunferencia de radio unidad, al dividir entre dos los valores de los perímetros iremos obteniendo las sucesivas aproximaciones del número irracional π .

Tomando como radio R, la unidad


Para un triángulo, n=3, la longitud del lado es a3=2sen60o, y el perímetro

Para un hexágono, n=6, la longitud del lado es a6=2sen30o=1, y el perímetro P6=6.

y así sucesivamente.

Para obtener las sucesivas aproximaciones del número irracional π mediante la fórmula anterior procedemos del siguiente modo:

1. Partimos del valor del perímetro P de un triángulo equilátero inscrito en una circunferencia de radio unidad, el valor de n es 3.

2. Calculamos el perímetro P de un polígono de 2n lados a partir del valor del perímetro de un polígono regular de n lados.

3. El valor obtenido P será el valor del perímetro de un polígono regular de n=2n lados.

4. Se imprime el valor de P dividido entre dos (aproximación de π)

5. Se vuelve al paso 2.

Ahora, hemos de trasladar las fórmulas matemáticas a código, y aquí es donde podemos llevarnos algunas sorpresas.

En primer lugar, hemos de tener en cuenta que la expresión es matemáticamente equivalente a 
pero no lo es cuando trabajamos con números en el ordenador.

Por ejemplo si n es tipo de dato int. Al evaluar el denominador en la primera expresión obtenemos el cuadrado de n que crece muy rápidamente con n, sobrepasándose (overflow) el valor máximo que puede guardar una variable entera dado por Integer.MAX_VALUE. 


Integer es la clase que describe los números enteros. Por tanto, al realizar los cálculos en el ordenador es aconsejable emplear la segunda expresión en vez de la primera, incluso si cambiamos el tipo de dato de n de int a long.

El cálculo de π implica un número infinito de iteracciones, ya que como hemos visto no es posible al sobrepasarse el valor máximo que puede guardar una variable entera, nuestra primera intención sería la programar un bucle que realice el máximo número de iteracciones:

double perimetro=3*Math.sqrt(3);

//triángulo equilátero inscrito

long n=3;

int i=0;

//número de iteracciones

while(n<Long.MAX_VALUE){

perimetro=2*n*Math.sqrt(2.0-Math.sqrt(4.0-(perimetro/n)*(perimetro/n)));

n=2*n;

i++;

System.out.println(i+" -- "+perimetro/2);

}

Con cierta sorpresa observamos la salida del programa cuando se ha completado el bucle, se imprime un cero, en vez de 3.14159265358979323846.

Si observamos las 30 primeras iteracciones vemos, tal como se muestra en la figura inferior, que la valor

más próximo a π se obtiene en las iteracciones 13, 14, 15, y 16.

while(i<30){

//...

}

La conclusión final, es que hemos de tener mucho cuidado al trasladar las fórmulas matemáticas a código.

Los datos de tipo predefinido solamente pueden guardar valores entre un máximo y un mínimo, tal como hemos visto en su definición.Por otra parte, una variable de tipo double tiene una precisión limitada por lo que no representa a todos los números reales sino a un conjunto finito de éstos.
Share on Google Plus

Sobre Rafa

Soy un apasionado de las nuevas técnologias, Internet, los videojuegos, la cultura japonesa y de USA.
    Blogger Comment
    Facebook Comment

0 comentarios:

Publicar un comentario

Gracias por comentar ;-)