Mostrando entradas con la etiqueta fortran. Mostrar todas las entradas
Mostrando entradas con la etiqueta fortran. Mostrar todas las entradas

miércoles, diciembre 17, 2008

C# es el nuevo campeón

Hola,

Bueno, solucionados los pequeños problemas con el XP por fin he podido hacer la comparativa.

El campeón ha sido el portátil XP - C# con 50 segundos de ejecución frente al GNU/Linux - FORTRAN (f77-GCC) que ha tardado 1 minuto 37 segundos.

Algunos datos son:

del PC: Intel Pentium 4, 2.5 GHz. 512 Kb caché. 1 Gb RAM. Kubuntu. Compilador GCC (f77).

del portátil: Intel Pentium M 1.5 GHz. 1 Gb RAM. XP SP2. Visual Studio 2005.
Nota: Menos Gigaherzios esta vez no es peor procesador. Podéis verlo aquí.

Programa FORTRAN:


Resultado en Kubuntu con FORTRAN:

Programa C#:


Resultado en C#:

¿Y si hacemos el mismo programa en VB.NET? ¿No ganará el querido VB al feo C#?

lunes, diciembre 15, 2008

Comparativa C#, FORTRAN...mañana :-(

Hoy no va a poder ser.

No es culpa de Windows. Simplemente mi portátil está en estado crítico por desatención extrema.

Cada dos por tres se apaga solo. He pasado a C# el programita de pi con el método de montecarlo, pero no tengo ganas de estar arrancándolo cada 5 minutos para ver si termina la prueba.

Voy a aprovechar para explicar una cosa que igual no ha quedado clara.

Si alguien se fija en el programita FORTRAN verá que aleatoriamente genera un valor de 0 a 1 y se lo asigna a X. Luego hace lo mismo con la Y.

Esa X y la Y son la coordenada de un punto.

El círculo tiene un radio = 1.

Recordando un poco de geometría:

X^2 + Y^2 = R^2 es la ecuación que cumplen los puntos de la circunferencia (el borde exterior).

En una circunfernecia de radio 1, los puntos que cumplen X^2 + Y^2 <=1 son los que están dentro o en el borde del círculo.

Por eso en el programa se cuentan los casos que cumplen la condición anterior.

Saludos.

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,