Wie man den (oberen) Transit der Sonne berechnet

Wie in https://physics.stackexchange.com/questions/41450/is-there-a-simple-accurate-formula-for-calculating-transit-times-from-rise-and beschrieben , können die Sonnenaufgangs- und Untergangszeiten genau verwendet werden, um den Sonnentransit zu berechnen. In einigen Fällen sind diese jedoch nicht vorhanden, z. B. in Finnland im Sommer.

Gibt es eine einfachere und / oder allgemeinere Möglichkeit, die Laufzeit (und nur die Laufzeit) bei gegebener UTC und Beobachterposition (Breitengrad, Längengrad, Höhe) zu berechnen?

Die Bibliothek unter http://www.jstott.me.uk/jsuntimes gibt Sonnenaufgang und Sonnenuntergang an, aber nicht die Transitzeit. find_transitat riset_cir.cin https://github.com/brandon-rhodes/pyephem/tree/master/libastro-3.7.7 könnte dies tun, scheint aber zu allgemein und kompliziert zu sein.

Ein Himmelsobjekt geht durch, wenn die lokale Sternzeit seinem rechten Aufstieg entspricht, aber das beantwortet Ihre Frage nicht wirklich.
Wie nah willst du es? Die Laufzeit kann als arithmetisches Mittel der Anstiegs- und Setzzeiten angenähert werden. Und was gibt es nicht? Sonnenaufgangs- und Untergangszeiten? Sie haben bereits eine Website verlinkt, um diese zu erhalten.
@Mick: Die Sonne geht nicht immer überall unter, während der Transit immer existiert.
Meinst du in der Nähe der Pole? Dann müssen Sie einen nicht trivialen Ansatz wählen und ihn aus der RA der Sonne berechnen, wie von Barrycarter erwähnt.
@Mick: ja, auch zB in Nordschweden geht die Sonne nicht immer auf und/oder unter. Haben Sie Hinweise, wie dies zu tun ist (die Genauigkeit kann um Sekunden abweichen, sollte aber nicht um Minuten abweichen)?
Ich habe vor einigen Jahren einige Arbeiten durchgeführt, auf denen ich eine Seite im Internet erstellt habe, auf der ich die (geozentrische) RA & Dec der Sonne für ein bestimmtes Datum mit den Algorithmen in Jean Meeus 'Buch Astronomical Algorithms berechnet habe . Ich kann mich nicht an die Genauigkeit der Berechnungen erinnern und ich habe die Korrekturen für Beobachter-Breite und Länge nicht vorgenommen. Die Webseite befindet sich immer noch auf meinem Server unter sionnagh.com/mtdistcalc.php , und ich freue mich, den BASIC-zu-php-konvertierten Code dahinter zu teilen, wenn das helfen würde.
@Mick: ja, das würde helfen
Ein weiterer wenig hilfreicher Kommentar: Die Sonne geht um UTC- 12-lon/15Stunden durch (der Längengrad westlich von Greenwich ist negativ). Diese Formel gilt für die fiktive "mittlere Sonne" und ist auf 15 Minuten genau. Um diese zusätzlichen 15 Minuten zu korrigieren, siehe Zeitgleichung .

Antworten (1)

Hier ist der Seitencode für meine BASIC-zu-PHP-Implementierung der Algorithmen zur Berechnung der (geozentrischen) RA & Dec der Sonne für ein bestimmtes Datum aus dem Buch Astronomical Algorithms von Jean Meeus sowie zur Berechnung der Winkelentfernung zwischen zwei Himmelsobjekten . Ich kann mich nicht an die Genauigkeit der Berechnungen erinnern und ich habe die Korrekturen für Beobachter-Breite und Länge nicht vorgenommen.

<!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>
Wie würden Sie den Transit-/Sonnenmittag aus RA und Dez berechnen?
Die lokale Sternenzeit ist die RA eines Sterns auf Ihrem Meridian und wird basierend auf Ihrem Längengrad und dem Datum von UT verschoben. Wenn Ihre LST mit der RA der Sonne übereinstimmt, befindet sich die Sonne auf dem Meridian. (Sie brauchen den Dez hier nicht.)
Also muss die LST bei Längengrad (und Breitengrad?) berechnet und an die RA (von 103,0508 °) angepasst werden. Das ist die Zeit des Sonnenmittags? Klingt gut.
Die LST basiert nur auf dem Längengrad (wie auch RA), also ja, wenn LST und RA der Sonne übereinstimmen, dann ist das Sonnenmittag. Die RA der Sonne wird um 8 Uhr Ortszeit etwas anders sein als am lokalen Mittag (12 Uhr) und auch am Sonnenmittag.
Scheint, als wäre das Thema ziemlich tiefgründig. Würden Sie Grundkenntnisse in Astronomie empfehlen? (Oder wäre das alles? In diesem Fall: Ist es in Ordnung, nur die RA von Ihnen ohne Zeitanpassung zu verwenden?)
Es gibt so viele Aspekte außer „Dinge am Himmel zu betrachten“, dass ich zögere, irgendetwas vorzuschlagen, aber Atlas of the Universe von Sir Patrick Moore ist eines der ersten Bücher, die ich gelesen habe. Und wenn diese RA-Berechnung für Sie funktioniert, dann verwenden Sie sie auf jeden Fall.
Am Ende scheinen die modifizierten Java-Versionen einfacher zu bedienen zu sein. Trotzdem war der Einblick in das Warum und Wie hilfreich.