Autor Tema: Calcular fases lunares  (Leído 17868 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado jfmateos2

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3145
Calcular fases lunares
« 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?




Desconectado jfmateos2

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3145
Re: Calcular fases lunares
« Respuesta #1 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>";
        
    }    
?>


Desconectado todopic

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3495
    • http://www.todopicelectronica.com.ar
Re: Calcular fases lunares
« Respuesta #2 en: 15 de Noviembre de 2007, 12:37:36 »
 :-/ :-/ Interesante trabajo!, estaria bueno implementaro en un   RTC  :-/

Un abrazo

Norberto
Firmat - Santa Fe - Argentina

www.TodoPic.net

Solo se tiran piedras, al arbol que tiene frutos...

Desconectado Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
Re: Calcular fases lunares
« Respuesta #3 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.

La teoría es cuando se sabe todo y nada funciona. La práctica es cuando todo funciona y nadie sabe por qué.

Desconectado jfmateos2

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3145
Re: Calcular fases lunares
« Respuesta #4 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, ...

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: Calcular fases lunares
« Respuesta #5 en: 16 de Noviembre de 2007, 05:32:35 »
También lo es para el Rondador Nocturno, Juanfe

Desconectado jfmateos2

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3145
Re: Calcular fases lunares
« Respuesta #6 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...

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: Calcular fases lunares
« Respuesta #7 en: 16 de Noviembre de 2007, 05:57:59 »
Bueno, al menos sospechó  :mrgreen:

Desconectado Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
Re: Calcular fases lunares
« Respuesta #8 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.

La teoría es cuando se sabe todo y nada funciona. La práctica es cuando todo funciona y nadie sabe por qué.

Desconectado IAO

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 702
Re: Calcular fases lunares
« Respuesta #9 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('_').
"No hay caminos para lograr la PAZ. La PAZ es el camino"... (Mahatma Gandhi).
Mentes Superiores discuten Ideas, Proyectos. Mentes Promedio discuten Acontecimientos y Sucesos. Mentes Pobres discuten sobre Personas.

Desconectado jfmateos2

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3145
Re: Calcular fases lunares
« Respuesta #10 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).

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5490
    • Electrónica Didacta
Re: Calcular fases lunares
« Respuesta #11 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?

La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado jfmateos2

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3145
Re: Calcular fases lunares
« Respuesta #12 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.

Desconectado jfmateos2

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3145
Re: Calcular fases lunares
« Respuesta #13 en: 17 de Noviembre de 2007, 06:00:18 »
Usando tablas se necesitan unos 64Kbits para almacenar las fases de unos 100 años.

Desconectado jfmateos2

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3145
Re: Calcular fases lunares
« Respuesta #14 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…




 

anything