Как вычислить солнечный (верхний) транзит

Как подробно описано в https://physics.stackexchange.com/questions/41450/is-there-a-simple-accurate-formula-for-calculating-transit-times-from-rise-and , время восхода и захода может точно использовать для вычисления транзита солнца. Тем не менее, в некоторых случаях их нет, например, в Финляндии летом.

Существует ли более простой и/или более общий способ вычисления времени прохождения (и только времени прохождения) с учетом UTC и положения наблюдателя (широта, долгота, высота).

Библиотека на http://www.jstott.me.uk/jsuntimes дает информацию о восходе и закате, но не о времени прохождения. find_transitв https://github.com/brandon-rhodes/pyephem/tree/master/libastro-3.7.7riset_cir.c может сделать это , но кажется слишком общим и сложным.

Небесный объект проходит транзитом, когда местное звездное время равно его прямому восхождению, но на самом деле это не отвечает на ваш вопрос.
Как близко вы хотите? Время прохождения может быть аппроксимировано как среднее арифметическое времени подъема и установления. А что не существует? Время восхода и заката? Вы уже ссылались на сайт для их получения.
@Mick: солнце не всегда садится везде, а транзит есть всегда.
Вы имеете в виду около полюсов? Тогда вам нужно будет использовать нетривиальный подход и вычислить его из РА Солнца, как упоминал Баррикартер.
@Mick: да, даже, например, в северной Швеции солнце не всегда восходит и/или заходит. Есть ли у вас какие-либо указания о том, как это сделать (точность может отличаться на секунды, но не на минуты)?
Несколько лет назад я проделал некоторую работу, создав страницу в Интернете, на которой рассчитал (геоцентрическое) прямое восхождение и склонение Солнца для заданной даты, используя алгоритмы из книги Жана Миуса « Астрономические алгоритмы » . Точность вычислений не помню и поправки на широту и долготу наблюдателя не делал. Веб-страница все еще находится на моем сервере по адресу sionnagh.com/mtdistcalc.php , и я рад поделиться кодом, преобразованным из BASIC в php, если это поможет.
@Mick: да, это помогло бы
Еще один бесполезный комментарий: солнце проходит в 12-lon/15часы UTC (долгота отрицательна к западу от Гринвича). Эта формула предназначена для вымышленного «среднего солнца» и имеет точность в пределах 15 минут. Чтобы скорректировать эти дополнительные 15 минут, см. Уравнение времени .

Ответы (1)

Вот код страницы для моей реализации алгоритмов BASIC-to-php для расчета (геоцентрического) восхождения и склонения Солнца для заданной даты из книги Жана Миуса « Астрономические алгоритмы » , а также для расчета углового расстояния между двумя небесными объектами. . Точность вычислений не помню и поправки на широту и долготу наблюдателя не делал.

<!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>
Как бы вы рассчитали транзитный/солнечный полдень по RA и dec?
Местное звездное время — это RA звезды на вашем меридиане, смещенное относительно UT в зависимости от вашей долготы и даты. Когда ваш LST совпадает с RA Солнца, тогда Солнце находится на меридиане. (Здесь декабрь не нужен.)
Таким образом, LST на долготе (и широте?) необходимо вычислить и сопоставить с RA (103,0508°). Это время солнечного полудня? Звучит неплохо.
LST основан только на долготе (как и RA), поэтому да, когда LST и RA Солнца совпадают, это солнечный полдень. RA Солнца будет несколько отличаться в 8 часов утра по местному времени, чем в полдень по местному времени (12 часов дня), а также в солнечный полдень.
Похоже тема достаточно глубокая. Не могли бы вы порекомендовать какие-нибудь учебники по астрономии? (Или это все? В таком случае: можно ли просто использовать RA от вас без какой-либо корректировки времени?)
Есть так много аспектов, кроме «смотреть на вещи в небе», что я не решаюсь предложить что-либо, но «Атлас Вселенной » сэра Патрика Мура — одна из первых книг, которые я прочитал. И если этот расчет RA работает для вас, то обязательно используйте его.
В конце концов, модифицированные версии Java кажутся более простыми в использовании. Тем не менее, взгляд на то, почему и как, был полезен.