TODOPIC

Misceláneas - Interés General => Off Topic => Mensaje iniciado por: jfmateos2 en 17 de Abril de 2007, 06:46:38

Título: Calcular fases lunares
Publicado por: jfmateos2 en 17 de Abril de 2007, 06:46:38
Llevo dos días peleándome con el método que describen en http://en.wikipedia.org/wiki/Full_moon_cycle para calcular las lunas nuevas y llenas, y soy incapaz de entender cómo funciona.

Me he interesado en este método porque su sencillez lo hacen aplicable a la capacidad de cálculo de un PIC (a diferencia de los pesados algoritmos de Meeus).

Aparentemente está todo muy claro, pero cuando lo programo no obtengo el resultado que indican los autores. Por ejemplo, en el caso de la tabla de las lunas nuevas, empiezo con la del 29 de julio de 1992 y la siguiente (28 de agosto de 1992) me sale bien, pero rellenando todas las que faltan hasta la del 6 de enero de 2000 no obtengo el resultado que ellos indican.

¿Podría echarme alguien una mano? o ¿proponerme otro método para calcular las fases lunares con cierta precisión?



Título: Re: Calcular fases lunares
Publicado por: jfmateos2 en 15 de Noviembre de 2007, 12:20:13
Olvidé comentar que al final resolví el problema.

La cuestión es que lo estaba programando con PHP, y las funciones de manejo de fechas de este lenguaje (en sus últimas versiones) tienen en cuenta los cambios de horario de verano/invierno (cosa que yo desconocía). Esto provocaba un corrimiento general de las fechas.

Les dejo aquí el código porque creo que puede ser útil para implementar relojes con fases lunares mediante PIC (algoritmo sencillo, cálculo fundamentalmente con números enteros y muy preciso).

Código: [Seleccionar]
<table style="text-align:center;">
    <tr>
        <th>New moon date</th>
        <th>Full moon cycle cycle</th>
        <th>Full moon cycle phase</th>
        <th>Initial accumulator</th>
        <th>Full moon cycle correction</th>
        <th>Cyclic accumulator</th>
        <th>Solar correction</th>
        <th>Computed local Jerusalem time of syzygy</th>
    </tr>
<?php
    $referencia
=mktime(0,0,0,7,29,1992,0);
    
$correccionCiclo=array(0,-8,-15,-19,-20,-16,-9,0,9,16,20,19,15,8);    
    
$correccionSolar=array(0,4,7,8,7,4,0,-4,-7,-8,-7,-4,0);      
    
$acumulador=43;
    
$ciclo=13;
    
$superCiclo=17
    
$cicloCorreccionSolar=7;    
    
$agno=1992;
    for(
$i=1;$i<400;$i++){
        if (
$ciclo==13){
            if(
$superCiclo==17){
                
$superCiclo=0;
                
$ciclo=1;
            }else{
                
$superCiclo++;
                
$ciclo=0;
            }
        }else{
            
$ciclo++;
        }        
        
$acumulador+=26;             
        if (
$acumulador>=49){   
            
$acumulador=$acumulador-49;         
            
$dias=30;            
        }else{
            
$dias=29;
        }            
        
$referencia=$referencia+(($dias)*86400);        
        
$acumuladorCorregido=$acumulador;                
        
$acumuladorCorregido+=$correccionCiclo[$ciclo];             
        
        
$incremento=0;
        if(
date("Y",$referencia)>$agno){
            
$cicloCorreccionSolar=0;
            
$agno++;            
        }else{
            
$cicloCorreccionSolar++;
        }
        
$acumuladorCorregido+=$correccionSolar[$cicloCorreccionSolar];          
        if (
$acumuladorCorregido>=49){                     
            
$incremento=86400;
            
$acumuladorCorregido=$acumuladorCorregido-49;            
        }elseif(
$acumuladorCorregido<0){            
            
$incremento=-86400;
            
$acumuladorCorregido=49+$acumuladorCorregido;
            
        }                               
        
            echo 
"<tr><td>".date("M-d-Y",$referencia+$incremento)."</td>";
        
        
        echo 
"<td>$superCiclo</td><td>$ciclo</td>";
        echo 
"<td>$acumulador</td><td>$correccionCiclo[$ciclo]</td>";
        echo 
"<td>$acumuladorCiclico</td><td>$correccionSolar[$cicloCorreccionSolar]</td><td>".($acumuladorCorregido/49 24)."</tr>";
        
    }    
?>

Título: Re: Calcular fases lunares
Publicado por: todopic en 15 de Noviembre de 2007, 12:37:36
 :-/ :-/ Interesante trabajo!, estaria bueno implementaro en un   RTC  :-/

Un abrazo

Norberto
Título: Re: Calcular fases lunares
Publicado por: Chaly29 en 16 de Noviembre de 2007, 01:59:17
Hola jfmateos2, interesante tema, y e estado mirando el link que as colocado pero no logro entender los cálculos que realizan, y como de C no se nada pues no puedo deducir tampoco los cálculos que haces.

Sería posible una corta explicación de los mismos?

Un saludo y muchas gracias por el aporte.

Atte. CARLOS.

Título: Re: Calcular fases lunares
Publicado por: jfmateos2 en 16 de Noviembre de 2007, 04:58:19
Hola Chaly. El tema es realmente peliagudo, a pesar de que a priori parece sencillo, pues los desarrolladores son judíos y refieren todo a la hora de Jerusalem (Universal Time + 2h 20m 56s o aproximadamente + 2h 21m) y al molad del calendario hebreo, que no es precisamente sencillo para los que estamos acostumbrados a los calendarios gregorianos.

Voy a intentar implementar el código para PIC como sugería TodoPIC incluyendo la opción de calcular también las lunas llenas (y los cuartos). Creo que lo haré con C; pero publicaré también el pseudo-código por si alguien quiere portarlo a otros lenguajes.

Lo que sí quiero advertir es que con este algoritmo se logra una precisión mínima de +/-4 horas; no es un algoritmo tan preciso como los de Meeus.

Estudiando este tema me he sorprendido de lo importante que sigue siendo la luna para algunos colectivos como los pescadores, cazadores, ganaderos, ...
Título: Re: Calcular fases lunares
Publicado por: Nocturno en 16 de Noviembre de 2007, 05:32:35
También lo es para el Rondador Nocturno (http://it.dada.net/freeweb/eumreborn/Patrulla-X/RondadorNocturno.html), Juanfe
Título: Re: Calcular fases lunares
Publicado por: jfmateos2 en 16 de Noviembre de 2007, 05:39:31
Nocturno, no tengo ni idea de quién es "Rondador Nocturno", lo que está claro es que menos mal que no es hijo del marido de su madre, porque se ve que éste (Barón Christian Wagner) no era precisamente un lince:

Citar
Kurt nació de la relación adúltera de Raven Wagner y Azazel, un mutante milenario con habilidades teleportadoras. Como el marido de Raven, el Barón Christian Wagner, era esteril, sospechó de la relación de su esposa con el misterioso Azazel

Siendo estéril, yo tendría mas que una sospecha de que el "Rondador Nocturno" no era hijo mío...
Título: Re: Calcular fases lunares
Publicado por: Nocturno en 16 de Noviembre de 2007, 05:57:59
Bueno, al menos sospechó  :mrgreen:
Título: Re: Calcular fases lunares
Publicado por: Chaly29 en 16 de Noviembre de 2007, 12:21:55
Hola jfmateos2, y gracias por responder, si e visto que la cosa no es nada sencilla!! por eso te preguntaba si era posible una corta explicación, ahora si llegaras a subir el .hex si podría entenderlo.

Pero bueno, veremos como avanza el tema.

Un saludo y gracias.

Atte. CARLOS.

Título: Re: Calcular fases lunares
Publicado por: IAO en 16 de Noviembre de 2007, 16:12:16
Holaaaa:

Sr. jfmateos2:
El el foro de w.masmforum.com, un sr. en la parte de proyecto elaboró un programa de
fases lunares muy interesante. Esta en ingles.
Se lo comento por si le sirve de alguna ayuda.

Bye('_').
Título: Re: Calcular fases lunares
Publicado por: jfmateos2 en 16 de Noviembre de 2007, 16:56:42
Gracias IAO, he mirado el código del programa que me recomiendas (originado a partir de este otro http://www.fourmilab.ch/moontoolw/) y está basado en las fórmulas de Meeus. El problema de estas fórmulas es que son demasiado complejas para un PIC (incluyen series trigonométricas), aunque son muy precisas.

El algoritmo del que yo estoy hablando aquí consiste simplemente en sumar y restar y, siempre con números enteros, por lo que es muy rápido y accesible para un PIC (aunque no tan preciso como las fórmulas de Meeus).
Título: Re: Calcular fases lunares
Publicado por: PalitroqueZ en 16 de Noviembre de 2007, 19:35:20
no he revisado el código y puede ser que diga una tonteria. jfmateos2 y ¿se podria resolver usando tablas?

Título: Re: Calcular fases lunares
Publicado por: jfmateos2 en 17 de Noviembre de 2007, 05:21:36
Sí, Palitroquez, la alternativa es usar tablas como las que proporciona la NASA en http://sunearth.gsfc.nasa.gov/eclipse/phase/phases2001.html.
Título: Re: Calcular fases lunares
Publicado por: jfmateos2 en 17 de Noviembre de 2007, 06:00:18
Usando tablas se necesitan unos 64Kbits para almacenar las fases de unos 100 años.
Título: Re: Calcular fases lunares
Publicado por: jfmateos2 en 17 de Noviembre de 2007, 10:14:18
OK, Chaly, intentaré explicarlo sin entrar en los detalles.

Me ha quedado un poco largo, si no tienes tiempo, pasa de leértelo. El lunes pondré directamente el pseudo-código.

El tiempo que transcurre entre dos fases idénticas sucesivas de la Luna se denomina lunación y, de media, es aproximadamente 29.53 días (oscila entre 29.26 y 29.80 debido a la velocidad areolar constante en torno a la Tierra y, en menor medida, a la influencia del Sol y otros astros). Consecuentemente, conocida la fecha de una fase, podríamos calcular cuándo se volvería a adoptar "aproximadamente" esa misma fase sumando 29.53 días. Por cuestiones de cálculo (para que sólo intervengan enteros), en lugar de sumar 29.53 días, se suman sólo 29, y el 0.53 se tiene en cuenta mediante un acumulador entero que indica aproximadamente la hora del día a la que se produce la fase. Como 0.53 es aproximadamente 26/49, al acumulador se le suman 26 unidades y, cada vez que excede de 49, se devuelve a su módulo 49 y se suma un día más. Consecuentemente, la hora se obtiene con una precisión de 1/49 de día.

Lo interesante es que esta variación (entre 29.26 y 29.80) se repite cíclicamente exactamente "casi" cada 14 lunaciones, de tal modo que podemos paliar el "aproximadamente" del párrafo anterior aplicando un término corrector según la posición del ciclo de 14 lunaciones en la que nos encontremos. Los términos correctores se aplican sobre el acumulador y son los siguientes:

0, -8, -15, -19, -20, -16, -9, 0, 9, 16, 20, 19, 15, 8

Para intentar corregir el "casi" del párrafo anterior, cada 18 ciclos de 14 lunaciones debemos saltarnos el término correctivo del primer ciclo y aplicar directamente el del segundo. De este modo tenemos un superciclo de 18x14-1=251 lunaciones.

Con lo anterior conseguiríamos simular la órbita elíptica de la Luna, pero para tener una mejor aproximación también podemos modelar la influencia del Sol con otro término correctivo. Cada año gregoriano la Luna puede adoptar la misma fase 12 o 13 veces. Estos términos correctivos también se aplican sobre el acumulador y son los siguientes:

0, 4, 7, 8, 7, 4, 0, -4, -7, -8, -7, -4, 0

El procedimiento para realizar el cálculo es el siguiente (lo ejemplifico con las lunas nuevas tomando como origen la del 29-VII-1992, que se produjo a las 19:35 UT, que precisamente era la última luna de un superciclo de 251 lunaciones, que tenía un acumulador inicial de 43 unidades, y que era la 8ª que se producía en el año gregoriano 1992):

1. Sumar 29 días a la fecha de la luna nueva anterior:

29-VII-1992 + 29 días = 27-VIII-1992.

2. Sumar 26 unidades al acumulador y si excede de 49, incrementar la fecha en un día y asignar al acumulador su módulo 49. ATENCIÓN: esta fecha y este acumulador serán los que se utilicen para calcular la siguiente luna nueva (no los resultantes de aplicar las correcciones que se explican a continuación):

43+26=69. Como excede de 49, sumo un día a la fecha de la fase, que pasa a ser el 28-VIII-1992, y asigno al acumulador el valor 20 (=69%49).

3. Corregir el acumulador según el estado del ciclo de 14 lunaciones en el que nos encontremos, teniendo en cuenta que si estamos al principio de un superciclo de 251 lunaciones debemos saltarnos el primer término correctivo:

Como estamos iniciando un superciclo de 251 lunaciones nos saltamos el primer término correctivo (0) y aplicamos directamente el segundo (-8): 20-8=12.

4. Corregir el acumulador según la lunación del año gregoriano que estemos calculando, y tomarlo como la hora de la fase teniendo en cuenta que indica la fracción del día entre 49 posibles y que está aplicada al meridiano de Jerusalén.

Como estamos calculando la 9ª, aplicamos el término correctivo -7, resultando el acumulador final 5 (12-7).

En definitiva, la siguiente luna nueva fue el 28-VIII-1992 transcurridos 5/49 del día en hora de Jerusalén, es decir, a las 5/49*24=2.44. Como la hora de Jerusalem es UT +2.35 horas, la hora que obtenemos finalmente es 0.09 UT. La fase se produjo realmente a las 2.25 UT, de modo que el error es 2.16 horas.

5. Repetir el procedimiento anterior partiendo del acumulador y la fecha obtenidos en el paso 2.
5.1. 28-VIII-1992 + 29 días= 26-IX-1992
5.2. Acumulador= 20+ 26= 46 (OJO siempre se utiliza el valor del acumulador antes de las correcciones)
5.3. Acumulador con corrección de ciclo= 46-15= 31
5.4. Acumulador con corrección solar = 31-8=23. La fecha calculada para la luna nueva es 26-IX-1992 a las 8.91 UT (11.2653 – 2.35). En realidad fue a las 10.24 UT.

6. Siguiente iteración:
6.1. 26-IX-1992 + 29 días = 25-X-1992
6.2. Acumulador= 46 + 26= 72 = 23 + 1 día
6.3. Acumulador con corrección de ciclo= 23 -19 = 4
6.4. Acumulador con corrección solar= 4 – 7 = - 3, es decir el día anterior. La fecha calculada sería entonces 25-X-1992 a las 20.18 UT. En realidad fue a las 20.20 UT.

7. Siguiente iteración:
7.1. 26-X-1992 + 29 días = 24-XI-1992 (OJO, siempre se toma como origen la fecha resultante del paso 2, aunque las correcciones trasladen la hora al día anterior o siguiente)
7.2. Acumulador= 23 + 26= 49 = 0 + 1 día
7.3. Acumulador con corrección de ciclo= 0 – 20= -20
7.4. Acumulador con corrección solar= -20 – 4 = - 24, es decir el día anterior. La fecha calculada sería entonces 24-XI-1992 a las 9.89 UT. En realidad fue a las 9.06 UT.

8. Siguiente iteración
8.1. 25-XI-1992 + 29 días = 24-XII-1992 (OJO, siempre se toma la fecha resultante del paso 2, aunque las correcciones trasladen la hora al día anterior o siguiente)
7.2. Acumulador= 0 + 26 =26
7.3. Acumulador con corrección de ciclo= 26 – 16= 10
7.4. Acumulador con corrección solar= 10 +0  = 10. La fecha calculada sería entonces 24-XII-1992 a las 2.54 UT. En realidad fue a las 0.25 UT.

9. Siguiente iteración
9.1. 24-XII-1992 + 29 días = 22-I-1993
9.2. Acumulador= 26 + 26 = 52 = 3 + 1 día
9.3. Acumulador con corrección de ciclo= 3 – 9 = -6
9.4. Acumulador con corrección solar= -6 +0  = -6. (OJO, como empezamos año tomamos el primer factor correctivo solar). La fecha calculada sería entonces 22-I-1993 a las 18.71 UT. En realidad fue a las 18.16 UT.

10. Siguiente iteración
9.1. 23-I-1993 + 29 días = 21-II-1993
9.2. Acumulador= 3 + 26 = 29
9.3. Acumulador con corrección de ciclo= 29 +0 = 29
9.4. Acumulador con corrección solar= 29 + 4  = 33. La fecha calculada sería entonces 21-II-1993 a las 13.81 UT. En realidad fue a las 13.03 UT.

… y así sucesivamente…


Título: Re: Calcular fases lunares
Publicado por: Chaly29 en 17 de Noviembre de 2007, 11:06:58
Hola jfmateos2, expectacular explicación, ahora si que me queda mucho más claro, veremos si lo podemos pasar a .asm t trataremos de hacer el aporte :mrgreen:

Muchas gracias.

Un saludo.

Atte. CARLOS.

Título: Re: Calcular fases lunares
Publicado por: Nocturno en 17 de Noviembre de 2007, 12:38:53
Juanfe, menuda currada de explicación. Hasta yo me he enterado.

De todas formas tengo una duda. Como salta a la vista, este gráfico también representa "velocidad areolar". ¿Crees que habrá que introducir muchos factores de corrección en la fórmula para calcular cuándo te daran en la cara?
(http://rprida.vtrbandaancha.net/nurse2.gif)
Título: Re: Calcular fases lunares
Publicado por: jfmateos2 en 17 de Noviembre de 2007, 13:24:37
Los sábados por la tarde son "terrific" en el foro.

Intentaré contestarte:

Todo depende de cómo modelemos el problema:

Si lo modelamos como el problema de los dos cuerpos (http://es.wikipedia.org/wiki/Problema_de_los_dos_cuerpos) no tendríamos que introducir ningún término correctivo, pues este problema tiene solución exacta. Sin embargo, este modelo se revelaría como inapropiado para este caso pues establece que los dos cuerpos mantienen sus trayectorias dentro de un plano, y es obvio que no ocurre así. Es entonces cuando conseguimos levantar los ojos de esos dos magníficos senos y nos damos cuenta de que hay un tercer cuerpo detrás de ellos y aquí empiezan los quebraderos de cabeza, pues el problema de los 3 cuerpos ya no tiene solución exacta (http://es.wikipedia.org/wiki/Problema_de_los_tres_cuerpos). Es más, percibimos encontes que los 3 cuerpos están unidos, con lo cual estamos ante un problema de elasticidas y resistencia de materiales, o quizás de mecánica de fluidos, o quizás aeroelasticidad. No estoy seguro, tendría que estudiarlo con más detalle...

Vas a conseguir que este hilo se convierta en el más caliente del fin de semana...

¿Por dónde cogno navegas para encontrarte estas cosas?
Título: Re: Calcular fases lunares
Publicado por: Nocturno en 17 de Noviembre de 2007, 13:42:47
Jajaja, no me podía imaginar que saldrías con semejante resolución matemática. Eres un crack
Título: Re: Calcular fases lunares
Publicado por: jfmateos2 en 26 de Noviembre de 2007, 13:55:30
Sólo a título informativo, por si alguien se basa en este hilo:

Los desarrolladores de este algoritmo (CALNDR-L@LISTSERV.ECU.EDU) están actualmente trabajando en otro que en lugar de predecir la hora de las fases, calcule las fechas exactas. El problema del actual es, por ejemplo, que puede decirte que la luna nueva fue el día 22 a las 01:34, cuando en realidad ocurrió el día anterior a las 23:09.

El nuevo algoritmo que están diseñando pretende predecir la fecha con certeza, olvidándose de la hora.
Título: Re: Calcular fases lunares
Publicado por: jfmateos2 en 28 de Noviembre de 2007, 04:52:07
Un proyecto relacionado con este asunto y desarrollado con un PIC 16F627: http://www.techlib.com/Karen/micro.htm#Orrery

(http://www.techlib.com/Karen/Orrery.jpg)

Se trata de un orrery, que es una especie de plantetario plano. Utiliza un interruptor reed para detectar el inicio de cada vuelta, y señala incluso la posición de la Luna. Es una pena que no haya ningún vídeo de su funcionamiento.

Yo hubiera utilizado un LED azul para la Tierra en lugar de verde.
Título: Re: Calcular fases lunares
Publicado por: SavageChicken en 28 de Noviembre de 2007, 13:29:12
Me gustó más el modelo que puso Manolo jajajajaj  :D :D :D :D :D