So berechnen Sie Sonnenkoordinaten. (Rektaszension, Deklination und letztendlich die Höhe und das Azimut der Sonne)

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

```
Welche Programmiersprache verwenden Sie für diese Berechnung?
Wenn einige Ressourcen in dieser Antwort oder speziell in dieser Antwort hilfreich sind, können Sie gerne eine kurze Antwort auf Ihre eigene Frage schreiben.
Ist wertvoll. Eigentlich war mir die Cis-Umsetzung der Sofa Library bereits bekannt. Es ist akribisch gefertigt, aber selbst der Typ, der es geschrieben hat, sagte, er habe keine Zeit gehabt, es tatsächlich zu benutzen. Daher ist die Implementierungsdokumentation etwas lückenhaft.
Die Tabelle, für die ein Link enthalten ist, ist ein Kunstwerk. Alle Formeln sind leicht sichtbar und können in der Programmiersprache Ihrer Wahl implementiert werden. Wissen Sie, ob es eine solche Tabelle für Mond-Ephemeriden gibt?
Bist du sicher, dass dein Längengrad positiv ist? Damit liegt der Standort im Westen Chinas. Daran ist nichts auszusetzen, aber negativ, dieser Längengrad bringt Sie in NE Ohio.
Nein, es ist definitiv negativ. Ich muss meinen Code noch einmal überprüfen, weil ich sehe, wo ich ihn nicht als negativ zeige. Danke, dass du das angesprochen hast. Ich bin gerade auf StackExchange Mobile
double Longitude = 81.885493;dritte Zeile unkommentierter Code

Antworten (2)

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

  • LHAsollte 323,6° sein und in Radiant umgewandelt werden, und
  • der Ausdruck for altbenö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.

Danke, aber das wird am Ende in einer mobilen App verwendet, also ist C# die Sprache der Wahl. Glauben Sie, ich hätte Glück, wenn ich Python verwenden würde, nur um die Formeln zu erhalten und sie selbst in C# zu implementieren. Alles, was ich brauche, sind die Formeln und eine Erklärung, wann und wo sie in und von Radiant usw. konvertiert werden müssen. Ich habe Python noch nie verwendet, aber das wäre ziemlich einfach.
@noCodeMonkeys für Python verwenden Skyfield oder das (inzwischen veraltete) PyEphem . Skyfield verwendet eine Ephemeride und muss regelmäßig Informationen herunterladen (eine kleine Tabelle zum Interpolieren), aber PyEphem verwendet etwas anderes. Das wird auf einem Computer Spaß machen, aber nicht für eine mobile App.