Wie der Titel schon sagt, versuche ich, Sonnenkoordinaten der Sonne für einen bestimmten Ort und eine bestimmte Zeit zu berechnen. Ich habe viele 10 Stunden ohne Erfolg damit verbracht, also würde ich aufrichtig Hilfe dazu schätzen. Mein RA-Wert scheint richtig zu sein, aber Dec, Alt und Az sind aus.
Der Alt-Wert liegt innerhalb von 6 Grad, aber ich kann nicht herausfinden, warum er so nah ist, da der Breitengrad in Bogenmaß und nicht in Grad wie bei den anderen Werten angegeben ist. Wenn ich den Breitengrad in Grad ändere, ergeben die Werte nicht einmal einen Sinn.
Ich habe alle Werte der Zwischenvariablen eingefügt, um auf einen Blick zu sehen, was möglicherweise nicht stimmt. Ich habe den JD und den lokalen Stundenwinkel fest codiert, nur um diese aus der Gleichung für das Debugging herauszunehmen. Es werden Links angezeigt, woher ich diese Werte habe.
Der C#-Code ist unten, obwohl die Programmiersprache keine Rolle spielt. Die Formeln sind in jeder Sprache gleich.
//for formulas
double D = 2458599.125000 - 2451545.0; //the first term is the jd of interest; 2nd term is jd of 1-1-2000 at 12:00:00.0
double Latitude = 41.369341;
double Longitude = 81.885493;
double gTmp = 357.529 + 0.98560028 * D; //mean anomaly of the sun = 7310.0765751550007
double gTmp1 = (gTmp % 360); //subtract multiples of 360 (returns remainder in degrees) = 110.07657515500068
double g = gTmp1 * Math.PI / 180; //Convert to radians = 1.9211986657737494
double qTmp = 280.459 + 0.98564736 * D; //mean longitude of the sun = 7233.33868336
double qTmp1 = (qTmp % 360); //subtract multiples of 360 (returns remainder in degrees) = 33.338683359999777
double q = qTmp1; //don't convert to radians here; convert after terms in degrees are added in the computation of L; =33.338683359999777
double L_tmp = q + 1.915 * Math.Sin(g) + 0.020 * Math.Sin(2 * g);//geocentric apparent ecliptic longitude of the sun(adjusted for aberration) = 35.124421105295383
var L = (L_tmp % 360) * Math.PI / 180; //Convert to radians; //subtract multiples of 360 = 0.61303679614439033
double eTmp = 23.4393 - 0.00000036 * D; // = 23.436760515
double e = eTmp * Math.PI / 180; //Convert to radians; = 0.40904863698815186
//http://www.neoprogrammics.com/de405_usno_ae98/DE405_Sun.php
// formulas per https://aa.usno.navy.mil/faq/docs/SunApprox.php
double RA = (Math.Atan2(Math.Cos(e) * Math.Sin(L), Math.Cos(L))) * 180 / Math.PI; //right ascension converted from radians to degrees = 32.838762087228496
double dec = (Math.Asin(Math.Sin(e) * Math.Sin(L))) * 180 / Math.PI; //declination converted from radians to degrees = 3.228747909189217
string[] sunCoordinates = new string[2];
sunCoordinates[0] = ToHMSStr(RA); // = "2h 11m 21.3s"
sunCoordinates[1] = ToDMSstr(dec); // = "13d 13m 43.49s"
//compute alt and az per https://aa.usno.navy.mil/faq/docs/Alt_Az.php and https://aa.usno.navy.mil/faq/docs/GAST.php
//LHA for testing is from https://ssd.jpl.nasa.gov/horizons.cgi#results and https://www.vercalendario.info/en/how/convert-ra-degrees-hours.html
//from http://www.neoprogrammics.com/de405_usno_ae98/DE405_Sun.php
double LHA = 307.39; //Local Hour Angle
double lat = Latitude * Math.PI / 180; //Convert to radians; //Latitude is defined above; We get sign (below) after converted to Rad???? = 0.72203120983028346
double alt = (Math.Cos(LHA) * Math.Cos(dec) * Math.Cos(lat) + Math.Sin(dec) * Math.Sin(lat)) * 180 / Math.PI; //convert from radians = 53.266598643452909
double az =Math.Atan2(-Math.Sin(LHA) * Math.PI / 180, (Math.Tan(dec)*Math.Cos(lat) * Math.PI / 180 - Math.Sin(lat) * Math.Cos(LHA)) * Math.PI / 180); //convert each term to radians = 2.4585704411338072
az = az * 180 / Math.PI; //convert from radians = 140.86570991258415
```
Für die Sonne bei JD 2458599,125 sind RA = 32,8° und dec = 13,2° unabhängig vom geografischen Standort korrekt. In der alt/az - Berechnung
LHA
sollte 323,6° sein und in Radiant umgewandelt werden, undalt
benötigt einen Aufruf von Math.Asin
.Trigonometrische Ausdrücke sind einfacher zu überprüfen, wenn sie keine Inline-Einheitenkonvertierung enthalten. Speichern Sie Winkel möglichst im Bogenmaß; Machen Sie es andernfalls mit einem Namenszusatz wie _deg
.
Bei der Berechnung des lokalen Stundenwinkels können Sie GAST mit GMST annähern. Die Differenz eqeq ist kleiner als der Näherungsfehler des von Ihnen verwendeten Sonnenpositionsalgorithmus , und die alternative GMST-Formel gilt für D innerhalb weniger Jahrhunderte nach J2000.0.
Ich empfehle Ihnen, Astropy zu verwenden, es ist ein Python-Paket mit vielen astronomischen Bibliotheken.
Sehen Sie sich dieses Tutorial zum Bestimmen und Zeichnen der Höhe/Azimut eines Himmelsobjekts an .
Sie haben die spezifische Funktion
from astropy.coordinates import get_sun
Ich hoffe es hilft.
Fil
äh
keine CodeMonkeys
keine CodeMonkeys
Benutzer21
keine CodeMonkeys
Benutzer21
double Longitude = 81.885493;
dritte Zeile unkommentierter Code