Geografischer Punkt der Sonne

Ich möchte eine Sonne in einer 3D-Szene zeichnen, also dachte ich, der einfachste Weg wäre, den Breiten- und Längengrad des Punktes senkrecht zur Sonnenposition zu berechnen und ihn dann einfach "nach oben" zu verschieben.

Als Ausgangspunkt möchte ich die äquatorialen Koordinaten berechnen: Deklination und Rektaszension.

Ich habe die Anweisungen von dieser Seite befolgt und auch Querverweise zu dieser Seite erstellt

Hier ist mein Code (in Swift):

import Foundation

class Astronomy {

  static func julianDays(since: Date) -> Double {
    return since.timeIntervalSince1970 / 86400 + 2440587.5
  }

  static func daysSinceJ2000(for date: Date) -> Double {
    return julianDays(since: date) - 2451545
  }

  static func sunAxialTilt(for daysSinceJ200: Double) -> Double {
    return 23.4393 - 3.563e-7 * daysSinceJ200
  }

  static func sunEquatorialPosition(on date: Date) -> (declination: Double, RA: Double, distance: Double) {
    let daysSinceGreenwichNoon = daysSinceJ2000(for: date)
    var meanLongitude = 280.460 + 0.9856474*daysSinceGreenwichNoon
    var meanAnomaly = 357.528 + 0.9856003*daysSinceGreenwichNoon
    meanLongitude = meanLongitude.rangedUpTo360
    meanAnomaly = meanAnomaly.rangedUpTo360
    let eclipticLongitude = meanLongitude + 1.915*sin(meanAnomaly.radians) + 0.020*sin(2*meanAnomaly.radians)

    let distanceToEarth = 1.00014 - 0.01671*cos(meanAnomaly.radians) - 0.00014*cos(2*meanAnomaly.radians)

    let axialTilt = sunAxialTilt(for: daysSinceGreenwichNoon)
    let rightAscension = atan2(cos(axialTilt.radians)*sin(eclipticLongitude.radians), cos(eclipticLongitude.radians))
    let declination = asin(sin(axialTilt.radians)*sin(eclipticLongitude.radians))

    return (declination: declination.degrees, RA: rightAscension.degrees, distance: distanceToEarth)
  }
}

extension Double {
  var radians: Double {
    return self * .pi / 180
  }

  var degrees: Double {
    return self  * 180 / .pi
  }

  var rangedUpTo360: Double {
    let multiples = (self/360).rounded(.down)
    return self - 360*multiples
  }
}

Allerdings scheint es nicht richtig zu funktionieren. Als ich diesen Artikel schreibe, ist das Ergebnis declination -16.98772292697088, RA -44.80674952684117. Verglichen mit https://theskylive.com/sun-info ist die Deklination ungefähr richtig (-17° 03' 38”), aber die Rektaszension ist weit entfernt: 20h 59m 43s, was laut dieser Seite 314,93 Grad entspricht

Was schief gelaufen ist?

Bearbeiten: Da sich herausstellte, dass nichts falsch war, kann ich zum zweiten Teil kommen: Berechnung des geografischen Punktes. (der Titel lässt es doch erahnen)

AFAIK für den Breitengrad kann ich die Deklination so verwenden, wie sie ist, und für den Längengrad muss ich den Greenwich Hour Angle (GHA) berechnen

Nachdem ich mehrere Artikel untersucht hatte, fand ich diese Gleichungen:

SHA[°] = 360 – 15 · RA[h] 
GHAAries[°] = 15 · GST[h] 
GHA = SHA + GHAAries 

In meinem Fall nehme ich an, dass ich RA so verwenden kann, wie es ist, ohne seine Stundenkomponente mit 15 zu multiplizieren. Was mich ein bisschen verwirrt, ist die GST:

  1. Kann ich stattdessen die Greenwich Mean Sidereal Time verwenden, wenn ich nicht brauche, dass die Berechnungen superpräzise sind?
  2. Gibt es eine „GST für Dummies“? Alle Berechnungen, die ich gefunden habe, beruhen auf einem schwebenden Sekunden-Offset. Ich habe diese Tabelle gefunden, habe aber keine Ahnung, wie man sie verwendet.
Ich glaube nicht, dass etwas schief gelaufen ist ... 314,93 - -44,807 sind ungefähr 360 Grad ... was bedeutet, dass es die gleiche Rektaszension ist. Der Grund für die geringfügige Ungenauigkeit hat wahrscheinlich mit der ganzzahligen Gleitkommagenauigkeit und der Tatsache zu tun, dass es sehr schwierig ist, den Rektaszension der Sonne in der Praxis sehr genau zu messen.
Ich stimme dafür, diese Frage als nicht zum Thema gehörend zu schließen, da es eher um Codierung als um Astronomie geht.
@Tosic ahh ich verstehe, also muss ich 360 addieren, wenn mein resultierender Wert < 0 wäre, vielen Dank!
@Chappo Ich bin anderer Meinung, es geht nicht darum, etwas zu codieren, sondern darum, die Ergebnisse zu interpretieren, da der Code im Wesentlichen Mathematik ist
@Chappo Ich bin auch mit dem Schließen nicht einverstanden; Eine große Anzahl von Formeln in der Astronomie erfordern eine Renormierung in den Bereich 0..360 (oder 0..2PI in Radianten). Einige Texte sind gut darin, Ihnen zu sagen, dass Sie dies tun müssen, andere nicht. Eine Frage, die die Notwendigkeit veranschaulicht, Größen wie RA oder GST oder planetare Längen neu zu normalisieren, um die richtige Antwort zu erhalten, ist meiner Meinung nach nützlich.
@ethamine Nicht unbedingt sehr "dummies" -artig, aber hier ist eine Erklärung der Sternzeit . GMST ist eine Funktion von UT1, die eigentlich eher ein Rotationswinkel der Erde als eine Zeit ist. Sie könnten den 'UT1-UTC'-Wert von Ihrem Link zu Ihrer UTC-Uhrzeit in Ihrem Code hinzufügen, aber die Differenz wird durch Schaltsekunden <0,9 s gehalten. Wenn Sie Ihren Längengrad (Ost positiv) zu GMST addieren, normalisieren und dann die RA der Sonne subtrahieren, erhalten Sie den lokalen Stundenwinkel. Lassen Sie den Längengrad weg und Sie haben den Greenwich-Stundenwinkel (Stundenwinkel bei 0 Grad Länge)
@astrosnapper danke, ich glaube, ich fange an zu verstehen. Ich fand diese Frage sehr nützlich. Ich glaube, ich habe einen Fehler in meinem Code entdeckt. Für die Berechnung der julianischen Tage nehme ich ein Datum, aber in meinem Code liegt dieses Datum in der lokalen Zeitzone. Gehe ich richtig in der Annahme, dass alle Daten, die ich verwende, in Anbetracht des Ziels in der Greenwich-Zeitzone UTC + 0 liegen sollten?
Ja, Sie sollten UTC intern in Ihrem Code verwenden und nur bei der Eingabe (falls zutreffend) und zur Anzeige am Ende in und aus einer lokalen Zeitzone konvertieren. Die andere Zeit, die Sie benötigen, wenn Sie irgendetwas berechnen, das mit den Positionen von zB Sonne/Erde zu tun hat, ist eine dynamische Zeit, entweder TDB oder TT (die durch Schaltsekunden verursachten Schritte in UTC machen sie ungeeignet). TT ist einfacher und für fast alle Zwecke gut genug; TT-UTC ist derzeit 69,184 s, bestehend aus TT-TAI=32,184 s (für immer fixiert) und TAI-UTC=37 s (aktuell; ändert sich mit Schaltsekunden, siehe maia.usno.navy.mil/ser7/tai-utc.dat ). Vergangenheitswerte)

Antworten (1)

Wenn wir einen Kreis zeichnen und auf diesem Kreis einen Winkel von 315 Grad gegen den Uhrzeigersinn zeichnen, würden wir ungefähr den gleichen Punkt erhalten, als würden wir einen Winkel von 44,8 Grad in die entgegengesetzte Richtung zeichnen (das Äquivalent von -44,8 in der gleiche Richtung), weil 315+45=360. Es scheint also keinen Fehler in Ihren Ergebnissen zu geben ... Optisch sind die beiden Winkel gleich. Was die geringfügige Ungenauigkeit anbelangt, so kann sie auf Gleitkomma-Präzisionsfehler oder Messfehler zurückzuführen sein.
Wenn Sie eine positive Rektaszension wollen, müssen Sie nur 360 hinzufügen, wenn es negativ ist. Bevor Sie dies tun (dies ist ein allgemeiner Ratschlag, der für Ihren Code möglicherweise nicht wichtig ist), sollten Sie den Dezimalteil subtrahieren, den Rest beim Teilen durch 360 erhalten und den Dezimalteil erneut hinzufügen.
Bearbeiten: Der Unterschied zwischen GST und GMST wird als Zeitgleichung (für Grinich) bezeichnet und wächst nicht über 16 Minuten hinaus. Ich denke, Sie können ihn für Schätzungen verwenden, aber dann wäre es sinnlos, Ihre Ergebnisse zu runden die zehnte Dezimalstelle oder so. Ich weiß ehrlich gesagt nicht, ob es eine "GST für Dummies" gibt (normalerweise würde ich keine unvollständige Antwort posten, aber die Frage wurde bearbeitet), aber die Verwendung von GMST sollte ausreichen, wenn die Fehlerspanne von 16 Minuten akzeptabel ist.

Könnten Sie bitte erläutern, warum es ratsam ist, Berechnungen mit dem Dezimalteil auf diese Weise durchzuführen?
Ich bin mit Swift nicht vertraut, aber in C++ kann man das Modulo einer Gleitkomma-Ganzzahl nicht nehmen, also habe ich diese Vorgehensweise empfohlen.
Ahh ich verstehe, danke für die Klarstellungen. Swift ermöglicht das Modulo einer Gleitkommazahl. Könnten Sie bitte einen Blick auf meine aktualisierte Frage werfen?
Bearbeitet. Entschuldigung, dass es so lange gedauert hat, das ist die beste Antwort, die ich geben kann. Kein Thema, aber ich empfehle dringend, beim nächsten Mal eine neue Frage zu stellen, anstatt Ihre alte zu aktualisieren, um ein neues Thema aufzunehmen, da sie auf diese Weise viel mehr Aufmerksamkeit erhält.
Vielen Dank. Ich dachte daran, eine separate Frage zu erstellen, aber da der Titel "geografischer Punkt" und nicht "rechter Aufstieg" sagte, wäre der Thread sonst unvollständig