domingo, diciembre 14, 2008

Cálculo de Pi en Fortran

Actualizado el 5 de Febrero de 2012.

Hola,

Como os decía el otro día quiero hacer un programa en Fortran-Linux y el mismo en XP-C# y comparar los tiempos de ejecución.

Lo primero es encontrar un algoritmo matemático en Fortran con cierto interés.

He pensado en el cálculo de PI. Ya sabéis, ese número irracional (y por lo tanto con infinitos decimales).

Hay un bonito método llamado "Método de Montecarlo" que paso a resumir. Se llama montecarlo por su relación con juegos de azar como la ruleta.

Advertencia: He encontrado varias web donde se confunde este método de Montecarlo con otro llamado de las agujas propuesto por el naturalista francés conde de Buffon.

Supongamos que tenemos una diana que consiste en un círculo dentro de un cuadrado de 2x2 (me recuerda la cuadratura del círculo, pero eso es otra historia). El área total del cuadrado es 4, y el del círculo pi x r cuadrado. Al ser el radio del círculo 1, su área es pi.
Si tiráramos los dardos de forma totalmente aleatoria, la probabilidad de que los dardos se clavaran dentro del círculo sería pi / 4 porque el área total es 4 y el área del círculo pi.

Entonces lo único que hace falta es un programa que calcule valores de x,y aleatorios para un montón de tiradas. Multiplicamos el número de aciertos por 4 y dividimos entre el número total de tiradas. El resultado es una aproximación a pi.

probabilidad de acierto = pi / 4

pi = 4 x probabilidad de acierto

pi = 4 x (aciertos / tiradas)

En mi Kubuntu me he encontrado un bonito editor llamado Kate que reconoce perfectamente la sintaxis del Fortran:

El programa me lo he bajado de http://www.dartmouth.edu/~rc/classes/soft_dev/F77_simple_ex.html

Con 1.000 intentos me ha estimado un valor de pi = 3,176 (bastante malo) :-(
Con 10.000 intentos sale pi = 3,1444 (sigue siendo una ruina).

Podéis hacer unos cuantos intentos del método en este sitio, pero he probamos con 10.000 intentos por ejemplo y me da pi = 3,1248.

Ya vemos que esto no va a funcionar. Conseguir series de números realmente aleatorios no es fácil.

La importancia de este tipo de métodos (agujas, Montecarlo, etc.) es que abrió la posibilidad de utilizar el azar para cálculos analíticos. Algo que se puede utilizar en la práctica con los ordenadores.

Saludos.

Actualización del 5/2/2012:

A raiz del comentario de Miguel, me ha entrado la curiosidad. ¿Se conseguirá una precisión de 3 decimales con 1 millón de iteraciones?

El resultado que sí, con el millón se llega a pi=3,142. Exactamente lo que ha predicho Miguel.




Saludos,

3 comentarios:

Anónimo dijo...

Muy bueno, claro y ameno.
Me ha servido de ayuda.

Miguel dijo...

la precisión de este método es de 1/sqrt(n) Vamos, que con 1 millon de iteraciones tienes una precisión de 3 decimales.

Mikelats dijo...

Gracias por la información Miguel. Esto hay que probarlo. Esta noche vemos el resultado con un millón.
Saludos,
Aitor.