Cómo calcular el tránsito (superior) del sol

Como se detalla en https://physics.stackexchange.com/questions/41450/is-there-a-simple-accurate-formula-for-calculating-transit-times-from-rise-and , las horas de salida y puesta pueden utilizarse con precisión para calcular el tránsito del sol. Sin embargo, en algunos casos, estos no existen, por ejemplo, en Finlandia en el verano.

¿Existe una forma más fácil y/o más general de calcular el tiempo de tránsito (y solo el tiempo de tránsito) dado el UTC y la posición del observador (latitud, longitud, altura)?

La biblioteca en http://www.jstott.me.uk/jsuntimes muestra el amanecer y el atardecer, pero no el tiempo de tránsito. find_transiten https://github.com/brandon-rhodes/pyephem/tree/master/libastro-3.7.7riset_cir.c podría hacer esto, pero parece demasiado general y complicado.

Un objeto celeste transita cuando el tiempo sideral local es igual a su ascensión recta, pero eso realmente no responde a su pregunta.
¿Qué tan cerca lo quieres? El tiempo de tránsito se puede aproximar como la media aritmética de los tiempos de subida y puesta. ¿Y qué no existe? ¿Horas de salida y puesta? Ya se vinculó a un sitio para obtenerlos.
@Mick: el sol no siempre se pone en todas partes, mientras que el tránsito siempre existe.
¿Quieres decir cerca de los polos? Luego, deberá adoptar un enfoque no trivial y calcularlo a partir de la RA del Sol, como lo menciona barrycarter.
@Mick: sí, incluso, por ejemplo, en el norte de Suecia, el sol no siempre sale o se pone. ¿Tiene algún consejo sobre cómo hacer esto (la precisión puede estar errada por segundos, pero no debería estarlo por minutos)?
Hice un trabajo hace algunos años donde hice una página en la web donde calculé la RA y Dec (geocéntrica) del Sol para una fecha determinada usando los algoritmos del libro Astronomical Algorithms de Jean Meeus . No recuerdo la precisión de los cálculos y no hice las correcciones para la latitud y longitud del observador. La página web todavía está en mi servidor en sionnagh.com/mtdistcalc.php , y estoy feliz de compartir el código convertido de BASIC a php si eso ayuda.
@Mick: sí, eso ayudaría
Otro comentario inútil: el sol transita a las 12-lon/15horas UTC (la longitud es negativa al oeste de Greenwich). Esta fórmula es para el "sol medio" ficticio y tiene una precisión de 15 minutos. Para corregir esos 15 minutos adicionales, consulte Ecuación del tiempo .

Respuestas (1)

Aquí está el código de página para mi implementación de BASIC a php de los algoritmos para calcular la AR (geocéntrica) y la Dec del Sol para una fecha determinada del libro Astronomical Algorithms de Jean Meeus, así como calcular la distancia angular entre dos objetos celestes . No recuerdo la precisión de los cálculos y no hice las correcciones para la latitud y longitud del observador.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-1" />
 <base href="sionnagh.com" />
<title>Mick Todd Distance Calculator</title>
<STYLE TYPE="text/css">
<!--
BODY
   {
   font-family:sans-serif;
   }
A:link{color:white}
A:visited{color:yellow}
-->
</STYLE>
</head>
<body>
<?php include("mtheader.php"); ?>
<h1>Mick Todd Distance Calculator</h1>
<?php 
$earthincl=23.44;	//Earth's axial tilt
$sollat=0;

$fdate = $_POST["fdate"];
if ($fdate=="") {
	$fdate=getdate(date("U")-date("Z"));
	$fday=$fdate[mday];
	if (strlen($fday)==1) {$fday="0".$fday;}
	$fmonth=$fdate[mon];
	if (strlen($fmonth)==1) {$fmonth="0".$fmonth;}
	$fyear=$fdate[year];
	//$fdate=$fdate[mday]."/".$fdate[mon]."/".$fdate[year];
	$fdate=$fday."/".$fmonth."/".$fyear;
}
else {
	$fday=substr($fdate,0,2);
	$fmonth=substr($fdate,3,2);
	$fyear=substr($fdate,6,4);
}
$fra1 = $_POST["fra1"];
$fra1 = strtolower($fra1);
if ($fra1<>"") {
  if (strpos($fra1,"h")==0) {
  $frad1=$fra1;
  $fra1=converttohms($fra1);
  }
  else {
    $frad1=converthtod($fra1);
  }
}
$fdec1 = $_POST["fdec1"];
$fdec1 = strtolower($fdec1);
if ($fdec1<>"") {
  if (strpos($fdec1,"d")==0) {
    $fdecd1=$fdec1;
    $fdec1=converttodms($fdec1);
  }
  else {
    $fdecd1=convertdtod($fdec1);
  }
}
$fra2 = $_POST["fra2"];
$fra2 = strtolower($fra2);
if ($fra2<>"") {
  if (strpos($fra2,"h")==0) {
    $frad2=$fra2;
    $fra2=converttohms($fra2);
  }
  else {
    $frad2=converthtod($fra2);
  }
}
$fdec2 = $_POST["fdec2"];
$fdec2 = strtolower($fdec2);
if ($fdec2<>"") {
  if (strpos($fdec2,"d")==0) {
    $fdecd2=$fdec2;
    $fdec2=converttodms($fdec2);
  }
  else {
    $fdecd2=convertdtod($fdec2);
  }
}

function JulianDay ($fday, $fmonth, $fyear, $fUT) {
    $JDpartsign=(100*$fyear+$fmonth-190002.5)/abs(100*$fyear+$fmonth-190002.5);
	$JD = 367*$fyear - floor((7*($fyear+floor(($fmonth+9)/12)))/4) + floor((275*$fmonth)/9) + $fday + 1721013.5 + $fUT/24 - 0.5*$JDpartsign + 0.5;
	return $JD;
}
function converttodms($inval) {
	if ($inval==0) {
	  $fdsign=1;
	}
	else {
	  $fdsign=$inval/abs($inval);
	}
	$inval=abs($inval);
	$fddeg=floor($inval);
	$remain=($inval-$fddeg)*60;
	$fdmin=floor($remain);
	if (strlen($fdmin)==1) { $fdmin="0".$fdmin; }
	$remain=($remain-$fdmin)*60;
	$fdsec=round($remain*100)/100;
	if (strpos($fdsec,".")==1) { $fdsec="0".$fdsec; }
	$fddeg=$fdsign*$fddeg;
	$fdms=$fddeg."d".$fdmin."m".$fdsec."s";

    return $fdms;
}
function converttohms($inval) {
    $inval=$inval/15;
    $fddeg=floor($inval);
    $remain=($inval-$fddeg)*60;
	$fdmin=floor($remain);
	if (strlen($fdmin)==1) { $fdmin="0".$fdmin; }
    $remain=($remain-$fdmin)*60;
	$fdsec=round($remain*100)/100;
	if (strpos($fdsec,".")==1) { $fdsec="0".$fdsec; }
    $fdms=$fddeg."h".$fdmin."m".$fdsec."s";

    return $fdms;
}
function converthtod($inval) {
  $posh=strpos($inval,"h");
  $posm=strpos($inval,"m");
  $poss=strpos($inval,"s");
  $temph=substr($inval,0,$posh);
  if ($posm) {
    $tempm=substr($inval,$posh+1,$posm-($posh+1));
  }
  if ($poss) {
    $temps=substr($inval,$posm+1,$poss-($posm+1));
  }

  $fdms=($temph+$tempm/60+$temps/3600)*15;

  return $fdms;
}
function convertdtod($inval) {
  $posd=strpos($inval,"d");
  $posm=strpos($inval,"m");
  $poss=strpos($inval,"s");
  $tempd=substr($inval,0,$posd);
  if ($posm) {
    $tempm=substr($inval,$posd+1,$posm-($posd+1));
  }
  if ($poss) {
    $temps=substr($inval,$posm+1,$poss-($posm+1));
  }
  $fdms=$tempd+$tempm/60+$temps/3600;

  return $fdms;
}

function SolarCoords($fday, $fmonth, $fyear, $fUT) {
//Julian Day of 1991/ 5/19 at 13 UT         JD = 2448396.04167
//Julian day of 2000/01/01 at 12 UT         JD = 2451545.0
//number of Julian days since 2000/01/01 at 12 UT               -3148.95833
//number of Julian centuries since 2000/01/01 at 12 UT  T = - 3148.95833/36525
//used by the algorithm for L                                                           = 0.086213780

    $k = 2*pi()/360;
  $T = (JulianDay($fday, $fmonth, $fyear, $fUT)-2451545.0)/36525;
    //echo "\$T: ".$T."<br />";
	//mean anomaly, degree
	$M = 357.52910 + 35999.05030*$T - 0.0001559*$T*$T - 0.00000048*$T*$T*$T;
    //echo "\$M: ".$M."<br />";

    // mean longitude, degree
    $L0 = 280.46645 + 36000.76983*$T + 0.0003032*$T*$T;
    //echo "\$L0: ".$L0."<br />";

    $DL = (1.914600 - 0.004817*$T - 0.000014*$T*$T)*sin($k*$M) + (0.019993 - 0.000101*$T)*sin($k*2*$M) + 0.000290*sin($k*3*$M);
	//echo "\$DL: ".$DL."<br />";

    // true longitude, degree
    $L = $L0 + $DL;
	if (abs($L)>360) {
        $divsign=($L/360)/abs($L/360);
		$div=floor(abs($L/360));
		$L=$L-$divsign*$div*360;
		if ($L<0) { $L=$L+360; }
    }
    $L=round($L*10000)/10000;

    return $L;

}

?>
<script type="text/javascript">
    <!--
    function settoday() {
        var d=new Date();
        dday=d.getDate();
        if (dday<10) { dday="0" + dday; }
        dmonth=d.getMonth()+1;
        if (dmonth<10) { dmonth="0" + dmonth; }
        dyear=d.getFullYear();

        ddate= dday + "/" + dmonth + "/" + dyear;

        return ddate;

    }

    //-->
</script>
<form METHOD="POST" ACTION="mtdistcalc.php" name="mtdistcalc">


<p>Date <input type="text" name="fdate" id="fdate" size=10 value="<?php echo $fdate; ?>"> <input type="button" value="Now" onclick="fdate.value=settoday();"></p>
<p>Object coordinates (#1) RA <input type="text" name="fra1" id="fra1" size=15 value="<?php echo $fra1; ?>">  Decl <input type="text" name="fdec1" id="fdec1" size=15 value="<?php echo $fdec1; ?>"></p>
<p>Object coordinates (#2) RA <input type="text" name="fra2" id="fra2" size=15 value="<?php echo $fra2; ?>">  Decl <input type="text" name="fdec2" id="fdec2" size=15 value="<?php echo $fdec2; ?>"></p>
  <p><input TYPE=SUBMIT VALUE="Calculate distances"></p>


</form>
<?php
echo "<table><tr><td>Date:</td><td>".$fday."/".$fmonth."/".$fyear." "."0000UT</td></tr>";
echo "<tr><td>Julian Day: </td><td>".JulianDay($fday,$fmonth,$fyear,"0")."</td></tr>";
echo "<tr><td>Ecliptic latitude of the Sun: </td><td>".$sollat."&deg; (assumed)</td></tr>";
$sollong = SolarCoords($fday,$fmonth,$fyear,"0");
echo "<tr><td>Ecliptic longitude of the Sun: </td><td>".$sollong."&deg; (".converttodms($sollong).")</td></tr>";
echo "<tr><td>Earth's axial inclination: </td><td>".$earthincl."&deg;</td></tr></table><br />";

//echo "\$feclong ".$feclong."<br /><br />";

$deltaSol = round(asin(sin($sollat*M_PI/180)*cos($earthincl*M_PI/180) + cos($sollat*M_PI/180)*sin($earthincl*M_PI/180)*sin($sollong*M_PI/180))*180/M_PI*10000)/10000;
$alphaSol = round(acos(cos($sollong*M_PI/180)*cos($sollat*M_PI/180) / cos($deltaSol*M_PI/180))*180/M_PI*10000)/10000;
if ($sollong>180) {
	$alphaSol = 360-$alphaSol;
}
echo "<table><tr><td colspan=2>Sol</td></tr><tr><td>RA: </td><td>".$alphaSol."&deg; (".converttohms($alphaSol).")</td></tr><tr><td>Dec:</td><td>".$deltaSol."&deg; (".converttodms($deltaSol).")</td></tr></table><br />";

//spherical angular distance
//cos(theta) = sin(delta_a) sin(delta_b) + cos(delta_a) cos(delta_b) cos(alpha_a-alpha_b)
if ($fra1<>"" AND $fdec1<>"") {
  $theta1 = round(acos(sin($deltaSol*M_PI/180)*sin($fdecd1*M_PI/180) + cos($deltaSol*M_PI/180)*cos($fdecd1*M_PI/180)*cos(($alphaSol-$frad1)*M_PI/180))*180/M_PI*1000)/1000;
}
if ($fra2<>"" AND $fdec2<>"") {
  $theta2 = round(acos(sin($deltaSol*M_PI/180)*sin($fdecd2*M_PI/180) + cos($deltaSol*M_PI/180)*cos($fdecd2*M_PI/180)*cos(($alphaSol-$frad2)*M_PI/180))*180/M_PI*1000)/1000;
}

if ($fra1<>"" AND $fdec1<>"" AND $fra2<>"" AND $fdec2<>"") {
  $theta3 = round(acos(sin($fdecd1*M_PI/180)*sin($fdecd2*M_PI/180) + cos($fdecd1*M_PI/180)*cos($fdecd2*M_PI/180)*cos(($frad1-$frad2)*M_PI/180))*180/M_PI*1000)/1000;
  echo "<p><font color=\"#0000FF\">Angular distance between Object #1 and Object #2 is: ".$theta3."&deg;</font></p>";
}

if (($fra1<>"" and $fdec1<>"") or ($fra2<>"" and $fdec2<>"")) {
  echo "<table><tr><td>&nbsp;</td><td align=center><b>RA</b></td><td align=center><b>Dec</b></td><td><b>Solar elong.</b></td></tr>";
}
if ($fra1<>"" AND $fdec1<>"") {
  echo "<tr><td>Object #1:</td><td><font color=Maroon>".$fra1."</font></td><td><font color=Maroon>".$fdec1."</font></td><td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color=Maroon>".$theta1."&deg;</font></td></tr>";
}
if ($fra2<>"" AND $fdec2<>"") {
  echo "<tr><td>Object #2:</td><td>".$fra2."</td><td>".$fdec2."</td><td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;".$theta2."&deg;</td></tr>";
}


?>
</body>
</html>
¿Cómo calcularía el tránsito/mediodía solar a partir de RA y dec?
La hora sideral local es la RA de una estrella en su meridiano y se compensa con la UT en función de su longitud y la fecha. Cuando su LST coincide con la RA del Sol, entonces el Sol está en el meridiano. (No necesita el Dec aquí).
Entonces, el LST en longitud (¿y latitud?) debe calcularse y coincidir con el RA (de 103.0508 °). ¿Ese es el tiempo del mediodía solar? Suena bien.
El LST solo se basa en la longitud (al igual que RA), así que sí, cuando LST y RA del Sol coinciden, entonces es el mediodía solar. La RA del Sol será ligeramente diferente a las 8 am hora local que al mediodía local (12 pm) y también al mediodía solar.
Parece que el tema es bastante profundo. ¿Recomendaría algún manual básico sobre astronomía? (¿O eso sería todo? En cuyo caso, ¿está bien simplemente usar el RA de usted sin ningún ajuste de tiempo?)
Hay tantos aspectos además de "mirar cosas en el cielo" que dudo en sugerir algo, pero Atlas of the Universe de Sir Patrick Moore es uno de los primeros libros que leí. Y si ese cálculo de RA funciona para usted, entonces utilícelo.
Al final, las versiones modificadas de Java parecen más fáciles de usar. Aún así, el vistazo al por qué y cómo fue útil.