Necesita una ecuación simple para el tiempo de subida, tránsito y puesta

He estado buscando, sin éxito, durante horas un conjunto simple de ecuaciones:

Entrada :
RA y Dec de un objeto
Observadores Lat y Lng
Hora actual

Salida :
Rise Time
Transit Time
Set Time
(y, con suerte) elevación máxima en tránsito
(y, con suerte) actual alt y az del objeto

Parece que esta debería ser una relación simple, pero no he podido encontrarla.
Si una ecuación simplemente da el alt/az actual para un objeto, supongo que podría resolver para az y luego encontrar el máximo para un rango de tiempo dado.

Preguntas :
1. ¿Alguien sabe de tales ecuaciones? O, mejor aún, algún código de muestra.
2. Si no es así, ¿alguien puede indicarme la dirección correcta?

Gracias

Depende de tu definición de "simple". Si está hablando de un objeto fijo (como una estrella), dispuesto a ingresar el tiempo sideral (que se puede calcular con bastante facilidad a partir del tiempo actual) y dispuesto a usar funciones trigonométricas, esto es bastante fácil de hacer.
¡Sí! Solo estoy interesado en objetos "fijos" en la esfera celeste. Por "simple", me refiero a simple para que un programador experimentado lo implemente. Eso sí, si es sencillo de entender, mejor que mejor. Parece que debería ser "simple", pero preferiría no intentar crearlo todo desde cero. Cualquier referencia o puntero sería muy apreciado.
Estoy escribiendo una respuesta basada en idlastro.gsfc.nasa.gov/ftp/pro/astro/hadec2altaz.pro pero es posible que desee echar un vistazo directamente.

Respuestas (4)

No estoy seguro de que califique como "simple", pero usando http://idlastro.gsfc.nasa.gov/ftp/pro/astro/hadec2altaz.pro (y algunos cálculos/simplificaciones adicionales):

Evento Hora ϕ Z Ninguna t broncearse 1 ( porque ( λ ) pecado ( d ) porque ( d ) porque ( α t ) pecado ( λ ) , porque ( d ) pecado ( α t ) ) broncearse 1 ( ( porque ( λ ) pecado ( d ) porque ( d ) porque ( α t ) pecado ( λ ) ) 2 + porque 2 ( d ) pecado 2 ( α t ) , porque ( d ) porque ( λ ) porque ( α t ) + pecado ( d ) pecado ( λ ) ) Aumento α porque 1 ( broncearse ( d ) broncearse ( λ ) ) broncearse 1 ( segundo ( λ ) pecado ( d ) , porque ( d ) 1 broncearse 2 ( d ) broncearse 2 ( λ ) ) 0 Tránsito α { d > λ 0 d = λ Cenit d < λ π π 2 | d λ | Colocar α + porque 1 ( broncearse ( d ) broncearse ( λ ) ) broncearse 1 ( segundo ( λ ) pecado ( d ) , porque ( d ) 1 broncearse 2 ( d ) broncearse 2 ( λ ) ) 0 Punto más bajo α + π { d > λ 0 d = λ Nadir d < λ π | d + λ | π 2

dónde:

  • ϕ es el acimut del objeto

  • Z es la altitud del objeto sobre el horizonte

  • α es la ascensión recta del objeto

  • d es la declinación del objeto

  • λ es la latitud del observador

  • t es la hora sideral local actual

Tenga en cuenta que se requiere la forma de arcotangente de dos argumentos para que los resultados estén en el cuadrante correcto: https://en.wikipedia.org/wiki/Inverse_trigonometric_functions#Two-argument_variant_of_arctangent

Advertencias adicionales:

  • Si | d λ | > π 2 , el objeto siempre está por debajo del horizonte y las ecuaciones para el tiempo de salida y el tiempo de puesta no funcionarán.

  • Si | d + λ | > π 2 , el objeto siempre está por encima del horizonte (circunpolar), y las ecuaciones para el tiempo de salida y puesta tampoco funcionarán.

  • Las medidas anteriores están en radianes. Puedes convertir π 180 para grados.

  • Debido a que usamos el tiempo sideral local, la longitud no aparece en ninguna de las fórmulas anteriores. Sin embargo, lo necesitamos para encontrar la hora sidérea local, como se muestra a continuación.

  • Para encontrar la hora sideral local t en radianes, usamos http://aa.usno.navy.mil/faq/docs/GAST.php y hacemos algunas sustituciones para obtener:

t = 4.894961212735792 + 6.30038809898489 d + ψ

dónde ψ es su longitud en radianes, y d es el número de días (incluidos los días fraccionarios) desde "2000-01-01 12:00:00 UTC". Tradicionalmente, usamos ϕ para la longitud, pero ya lo estoy usando en las fórmulas anteriores para el acimut.

Si combina la fórmula para el tiempo sideral local y el acimut/altitud y asume una precisión excesiva, obtiene mi respuesta a https://astronomy.stackexchange.com/a/8415/21

Cálculos adicionales para estos resultados en: https://github.com/barrycarter/bcapps/blob/master/STACK/bc-rst.m

Iba a agregar algunos gráficos para mostrar cómo la altitud NO es una onda sinusoidal y cómo el azimut NO es una línea recta (aunque es de esperar que lo sean), pero resultaron no ser muy instructivos/útiles.

También puede obtener fórmulas más simples si establece t ser el "ángulo horario" (que es α t en la configuración actual).

¿Puede explicar cómo interpretar los valores de aumento/establecimiento en la columna de tiempo? Sé que están en radianes, pero ¿cómo puedo convertirlos en valores de tiempo reales? ¡Muchas gracias por una gran respuesta por cierto!

Los cálculos no son triviales, pero están encapsulados en bibliotecas de software como pyephem, que tiene ejemplos de cómo encontrar la salida, la puesta y el tránsito . Si desea comprender cómo se calculan, puede leer el código fuente, que se basa en la aplicación xephem.

Un detalle que complica el cálculo es la refracción provocada por la atmósfera, que puede cambiar el momento de fraguado en varios minutos.

Gracias. Echaré un vistazo a pyephem, pero mi pitón es débil. ¿Conoce alguna biblioteca basada en C o .NET?
Pyephem se basa en xephem, que está en C. Xephem es una aplicación gráfica que puede calcular las mismas cosas que hace pyephem.
@W.ChristopherMoses: pyephemparece ser solo una envoltura delgada xephem, cuyo código fuente está incluido.
@W.ChristopherMoses: haz ese libastro

Si desea un sitio web en lugar de un paquete de software como sugiere James, le recomiendo usar la herramienta de visibilidad de objetos INGT que tiene las 3 entradas que solicita y produce un gráfico de elevación con tiempos de subida y puesta, altitud máxima, etc. A continuación se muestra un ejemplo:

ingrese la descripción de la imagen aquí

Mirando la fuente, no parece que haya código disponible en la página. ¿Conoces otros sitios que produzcan una trama tan agradable y tengan el código incrustado?
Hay estos en la parte inferior de la página en la pestaña "Más": iObserve, herramientas de astronomía, JSkyCalc, obstools. Es posible que tengan un código incrustado si los revisa, sin embargo, es posible que desee probar Astroplan ( astroplan.readthedocs.org/en/latest/tutorials/plots.html ), es un paquete afiliado a Astropy que parece muy prometedor como una herramienta de planificación astronómica. debería tener todo el código fuente allí, aunque creo que todavía está en desarrollo.

Meeus proporciona un algoritmo bastante simple en Algoritmos astronómicos. Una implementación de ejemplo está disponible en Rise and Set Algorithm . El código es bastante simple y lo he reproducido a continuación.

Un par de advertencias. La primera es que el algoritmo asume que las longitudes hacia el oeste son positivas, que es lo opuesto a cómo lo devuelven la mayoría de las API de GPS. Y, si el objeto se mueve considerablemente a lo largo del día, es posible que desee volver a calcular la posición para las horas dadas y luego volver a calcular las horas de salida y puesta nuevamente.

//By Greg Miller gmiller@gregmiller.net www.astrogreg.com
//Released as public domain
const toRad=Math.PI/180.0;
const toDeg=180.0/Math.PI;

//Corrects values to make them between 0 and 1
function constrain(v){
    if(v<0){return v+1;}
    if(v>1){return v-1;}
    return v;
}

//All angles must be in radians
//Outputs are times in hours GMT (not accounting for daylight saving time)
//From Meeus Page 101
function getRiseSet(jd,lat,lon,ra,dec){
    const h0=-0.8333 //For Sun
    //const h0=-0.5667 //For stars and planets
    //const h0=0.125   //For Moon

    const cosH=(Math.sin(h0*Math.PI/180.0)-Math.sin(lat)*Math.sin(dec)) / (Math.cos(lat)*Math.cos(dec));
    const H0=Math.acos(cosH)*180.0/Math.PI;

    const gmst=GMST(Math.floor(jd)+.5);

    const transit=(ra*toDeg+lon*toDeg-gmst)/360.0;
    const rise=transit-(H0/360.0);
    const set=transit+(H0/360.0);

    return [constrain(transit)*24.0,constrain(rise)*24.0,constrain(set)*24.0];
}

//Greenwhich mean sidreal time from Meeus page 87
//Input is julian date, does not have to be 0h
//Output is angle in degrees
function GMST(jd){
    const T=(jd-2451545.0)/36525.0;
    let st=280.46061837+360.98564736629*(jd-2451545.0)+0.000387933*T*T - T*T*T/38710000.0;
    st=st%360;
    if(st<0){st+=360;}

    return st;
    //return st*Math.PI/180.0;
}