Ephemeridenberechnung
Ephemeridenberechnung Elliptische Planetenbahn
images by ESO

Elliptische Planetenbahn

Im Folgenden finden sie eine Beispielrechnung zur Berechnung der Venusposition. Das zugrunde liegende physikalische Problem ist das Zweikörperproblem: Zwei punktförmige Massen (Sonne und Venus) die aufeinander Kräfte (Gravitation) ausüben. In der Astronomie wird das Zweikörperproblem auch als Keplerproblem bezeichnet. Durch die Lösung der Keplergleichung kann man dann die Planetenpositionen berechnen.

Bei der Lösung der Keplergleichung vernachlässigt man die Gravitationskräfte der Planeten untereinander. Deshalb ist die Genauigkeit der berechneten Planetenpositionen auch beschränkt.

Ich versuche in der nachfolgenden Beispielrechnung alle notwendingen Formel zusammen zu tragen. Eine Herleitung der Formeln werden sie allerdings nicht immer finden. Dazu verweise ich auf die restlichen Kapitel bzw. auf die gängige Literatur zu diesem Thema.

In die einzelnen Kapitel eingebettet finden sie jeweils kleine Javascript-Snippets mit Hilfe derer sie die Berechnung Online nachvollziehen können. Die Snippets bauen aufeinander auf. Sie sollten sie also sequentiell ausführen. Das letzte Snippet zeichnet dann noch eine Sternkarte mit der berechneten Position.

Die Javascript-Snippets beruhen auf einer kleiner Astronomie Bibliothek, welche sie auch als ZIP-Archiv herunterladen können. Siehe Abschnitt Downloads .

Julianisches Datum

In der Astronomie ist das Julianische Datum zur Zeitrechnung sehr beliebt. Das Julianische Datum ist definiert als die Zahl der Tage, welche seit dem 1. Januar 4713 v. Chr. 12:00 vergangen sind. In Das Julianische Datum finden sie eine Herleitung der Berechnungsformel.

Berechnungsformeln

  1. Man berechnet zuerst das Julianische Datum \(\mbox{JD}_0\)am 1.1 12 Uhr UT eines Jahrs:
    $$\begin{eqnarray*} \mathrm{JD}_0(y)&=& \mbox{int}(365.25(4712 + y)+0.75) + B \\ \mathrm{B}(y)&=&\left\{ \begin{array}{ll} 0 \\ \mbox{Julianisches Datum, bis einschließlich 4.10.1582} \\ \\ -\mbox{int}(y/100)+\mbox{int}(y/400) +2 \\ \mbox{Gregorianisches Datum} \end{array}\right. \end{eqnarray*}$$
  2. Daraus kann man dann das Julianische Datum \(\mbox{JD}\)zu einem bliebigen Zeitpunkt ermitteln:
    $$ \mathrm{JD}(d,m,y,UT)= \left\{ \begin{array}{l} \mathrm{JD}_0(y)+\mbox{Days}(m-1)+d-1+(UT-12)/24 \\ \mbox{Datum bis zum 28. Februar} \\ \\ \mathrm{JD}_0(y+1)-365+\mbox{Days}(m-1)+d-1+(UT-12)/24 \\ \mbox{Datum nach dem 28. Februar}. \end{array} \right. $$
Symbol Bedeutung
\(d\)Tag
\(m\)Monat
\(y\)Jahr
\(UT\)Weltzeit, gemessen von 0..24h
\(\mbox{days}(m)\)Zahl der Tage eines Monats, \(\mbox{days}(1)=31\), \(\mbox{days}(2)=28\)usw.
\(\mbox{Days}(m) = \sum_{n=1}^{m} \mbox{days}(n)\)Insgesamt vergangene Tage
\(\mbox{JD}\)Julianisches Datum zu einem beliebigen Zeitpunkt
\(\mbox{JD}_0\)Julianisches Datum um 12 Uhr UT am 1.1 eines beliebigen Jahrs

Berechnung des julianischen Datums

Hier finden ein Snippet zur Berechung des Julianische Datums zum aktuellen Datum:
   
// get current date
var now = calc.currentDate();
print("year         :",now.year);
print("month        :",now.month);
print("day          :",now.day);
print("hour         :",now.hour);
print("minute       :",now.minute);

// calculate julian date
global.julianDate = calc.julianDate(now.day, now.month, now.year, now.hour + now.minute / 60.0);
print("julian date  :", global.julianDate);
Die Bibliothek astro.calc.js stellt die entsprechenden Funktionen bereit. Die Implementierung ist nicht schwierig:
   
calc.julianDate = function (day, month, year, ut) {
    var jd = null;
    if (month <= 2) {
        jd = calc.jd0(day, month, year);
    } else {
        jd = calc.jd0(day, month, year + 1) - 365;
    }
    jd += calc.daysUpToMonth(month) + day - 1;
    if (calc.isGregorian(day, month, year))
        jd += -10;
    jd += (ut - 12) / 24.0;
    return jd;
};

calc.jd0 = function (day, month, year) {
    var result = math.int((4712 + year) * 365.25 + 0.75);
    if (calc.isGregorian(day, month, year)) {
        result += calc.LEAPDAYDELTA - math.int(year / 100) + math.int(year / 400);
    }
    return result;
};

Planet: Bahnelemente

Bahnelemente sind Parameter mit Hilfe derer eine Planetenbahn vollständig beschrieben wird. Kennt man die Bahnelemente, dann kann man für jeden beliebiegen Zeitpunkt die Planetenposition berechnen. In Abschitt Bahnelemente finden sie eine Beschreibung der Bahnelemente.

Bahnelemente nach JPL

Wir benutzen für unsere Rechnung die Bahnelemente, die vom Jet Propulsion Laboratory (JPL) zur Verfügung gestellt werden.

Das JPL stellt auf seiner Webpräsenz Bahnelemente für die Planeten bereit. Das JPL benutzt die Bahnelemente \(a, e, i, L, \tilde{\omega}\)und \(\Omega\). Dabei wird die mittlere Länge gemäß der Formel
$$ L=L_0 + \dot{L} T $$
berechnet. Hier ist \(T\)definiert als die Zahl der Jahrhunderte nache dem 1.1.2000:
$$ T=\frac{t-2451545}{36525} $$
Also hat man wie in Abschnitt Bahnelemente festgestellt 7 Bahnelemente ( \(a\), \(e\), \(i\), \(\tilde{\omega}\), \(\Omega\), \(L_0\)und \(\dot{L}\)).
Symbol Bedeutung
\(L\)Mittlere Länge
\(T\)Zahl der Jahrhundert nach dem 1.1.2000
\(t\)Julianisches Datum
Beim Studium des verlinkten JPL-Dokuments werden sie feststellen, daß für die restlichen Bahnelemente eine ähnliche Berechnungformel gilt. Also z.B für die große Halbachse
$$\begin{equation} a=a_0 + \dot{a} \frac{t-2451545}{36525} \end{equation}$$(20)
(2451545 is das Julianische Datum für den 1.1.2000). Gibt es also mehr als sieben Bahnelemente? Wenn Sie das Zweikörperproblem lösen sind tatsächlich nur sieben Bahnelemente notwendig. Im Sonnensysten wechselwirken aber alle Planeten miteinander. Beim Problem der Planetenpositionsberechnung handelt es sich also nur näherungsweise um ein Zweikörperproblem. Die Abweichungen vom Zweikörperproblem kann man (ebenfalls näherungsweise) durch lineare Korrekturterme in den Bahnelementen behandeln. Sie werden aber feststellen, daß die linearen Korrekturterme (z.B. \(\dot{a}_{\textrm{earth}}=0.00000562 \text{AE}/\textrm{Jahrhundert}\)) für die Bahnelemente eher klein sind.

Die Zahlenwerte für die mittlere Länge der Erde \(L_0\)und \(\dot{L}\)kann man auch sehr gut anschaulich verstehen:

Die Umlaufgeschwindigkeit der Erde um die Sonne ist
$$\begin{equation} \dot{L} \approx \frac{360 \textrm{Grad}}{\textrm{Jahr}} = \frac{360 \cdot 100 \thinspace \textrm{Grad}}{\textrm{Jahrhundert}} = 36000 \frac{\textrm{Grad}}{\textrm{Jahrhundert}} \end{equation}$$(21)
Was noch fehlt ist die mittlere Länge \(L_0\)am 1.1.2000, welche ungefähr 100 Grad betrug. Diese Behauptung können Sie auch leicht verifizieren: Am 21.3.2000 (Sonne steht im Frühlingspunkt) betrug die mittlere Länge der Erde 180 Grad. Dann betrug sie am Anfang des Jahres
$$\begin{equation} L_0 = 180^\circ - \frac{31+28+21}{365.25} 360^\circ \approx 100^\circ \end{equation}$$(22)

Berechnung der Bahnelemente

Wir haben nun alles notwendige um die Bahnelmente für z.B. die Venus zu einem konkreten Zeitpunkt zu berechnen. Das folgende Javascript-Snippet erledigt die Berechnung:
    

// orbital elements
var planet = global.planet = calc.orbitalElements(data.venus, global.julianDate);

// orbital elements calculated direclty from JPL tables
print("semi major axis          :", planet.semiMajorAxis);
print("eccentricity             :", planet.eccentricity);
print("inclination              :", math.formatAngle("degrees-simple",planet.inclination));
print("mean longitude           :", math.formatAngle("degrees-simple",planet.meanLongitude));
print("longitude of perihelion  :", math.formatAngle("degrees-simple",planet.longitudePerihelion));
print("longitude ascending node :", math.formatAngle("degrees-simple",planet.longitudeAscendingNode));

// derived orbital elements
print("argument perihelion      :", math.formatAngle("degrees-simple",planet.argumentPerihelion));
print("mean anomaly             :", math.formatAngle("degrees-simple",planet.meanAnomaly))

planet ist eine Instanz der Klasse OrbitalElements . Die Klasse OrbitalElements berechnet die Bahnelemente gemäß der JPL Daten, z.B. gemäß Formel 20 . Die Implementierung der Klassen finden sie in Bibliothek astro.calc.js .

Planet: Exzentrische Anomalie

Keplergleichung

Zuerst müßen wir die Koordinaten des Planeten im Orbitalsystem (siehe Abschnitt Orbitalsystem ) berechnen: Wir interessieren uns für die wahre Anomalie \(\nu\)and den Abstand \(r\)von der Sonne.

Dazu müßen wir allerdings zuerst eine Zwischengröße die exzentrischen Anomalie \(E\)berechnen. Den Zusammenhang zwischen der exzentrischen Anomalie und er wahren Anomalie können sie aus Abbildung 15 entnehmen.

Abbildung 15: Exzentrische Anomalie \(E\)und wahre Anomalie \(\nu\).
Die exzentrische Anomalie kann aus der mittleren Anomalie über die Keplergleichung
$$\begin{equation} E -e \sin (E) = M \end{equation}$$(23)
ermittelt. Diese Gleichung kann man leider nicht so umformen, daß man E direkt aus M berechnen kann. Stattdessen muß man ein Iterationsverfahren verwenden.
$$\begin{equation} E_{i+1} = E_i - \frac{M-E_i+e\sin E_i}{e\cos E_i - 1} \end{equation}$$(24)
Man startet mit \(E_0 =M\)und führt die Iteration dann solange durch bis die gewünschte Genauigkeit \(\left | E_{i+1} - E_i \right | < \epsilon\)erreicht ist.

Berechnung der exzentrischen Anomalie

Mit Hilfe des folgenden Snippets können Sie die exzentrische Anomalie berechnen.
   
var planet = global.planet;
planet.eccentricAnomaly = calc.eccentricAnomaly(planet.meanAnomaly, planet.eccentricity);
print("eccentric anomaly        : ", planet.eccentricAnomaly);
Die Funktion calc.eccentricAnomaly stellt das Iterationsverfahren bereit. Siehe hierzu die Bibliothek astro.calc.js .
   
calc.eccentricAnomaly = function (meanAnomaly, eccentricity) {
    var eccentricAnomaly = meanAnomaly + eccentricity * Math.sin(meanAnomaly);
    var deltaEccentricAnomaly = 1;
    while (Math.abs(deltaEccentricAnomaly) > 0.0000001) {
        deltaEccentricAnomaly = (meanAnomaly - 
                                 eccentricAnomaly + eccentricity * Math.sin(eccentricAnomaly)) /
                                (1 - eccentricity * Math.cos(eccentricAnomaly));
        eccentricAnomaly += deltaEccentricAnomaly;
    }
    return eccentricAnomaly;
};

Planet: Orbitalsystemkoordinaten

Nun kennen wir die exzentrische Anomalie und können daraus die wahre Anomalie und den Abstand zur Sonne berechnen
$$\begin{eqnarray} r&=&a(1-e\cos E)\\ \tan \frac{\nu}{2} &=& \sqrt{\frac{1+e}{1-e}}\tan \frac{E}{2} \end{eqnarray}$$(25)
(26)
Die Umsetzung finden sie in Bibliothek astro.calc.js .
       
calc.orbitalCoordinates = function (semiMajorAxis, eccentricity, eccentricAnomaly) {
    var lambda = 2 * Math.atan(Math.sqrt((1 + eccentricity) /
                 (1 - eccentricity)) * Math.tan(eccentricAnomaly / 2));
    var rad = semiMajorAxis * (1 - eccentricity * Math.cos(eccentricAnomaly));
    return {
        lambda: lambda,
        rad: rad
    };
};
Das folgende Javascript-Snippet führt die Berechnung durch. Aus den Polarkoordinaten \(\nu\)und \(r\)wird dann anschließend ein Vektorobjekt gebaut. Das Vektorobjekt benutzt intern kartesische Koordinaten. In kartesischen Koordinaten sind Vektoradditionen, Subtraktionen oder eine Vektorrotationen sehr einfach. Das Vektorobjekt stellt entpsrechende Methode zur Verfügung, welche im Folgenden nützlich sind.
       
// orbital coordinates 
var planet = global.planet;
planet.orbitalCoordinates = calc.orbitalCoordinates(
    planet.semiMajorAxis, 
    planet.eccentricity, 
    planet.eccentricAnomaly);
print("lambda  : ", math.formatAngle("degrees-simple",planet.orbitalCoordinates.lambda));
print("radius  : ", planet.orbitalCoordinates.rad);

// make vector from orbital coordinates
planet.orbitalPosition = math.vector(
    0, 
    planet.orbitalCoordinates.lambda, 
    planet.orbitalCoordinates.rad, 'spherical');
print("orbital coordinates :", planet.orbitalPosition.format("spherical-degrees"));
Die Vektorklasse ist in Bibliothek astro.math.js definiert.

Planet: Heliozentrisch ekliptikale Koordinaten

Wir wollen nun die Koordinaten vom orbitalen Koordinatensystem in das heliozentrische Koordinatensystem umrechnen. Das orbitale Koordinatensystem geht aus dem heliozentrischen durch die folgenden Drehungen hervor (siehe 18 ). Drehung
  1. um den Winkel \(\Omega\)um die Z-Achse drehen
  2. um den Winkel \(i\)um die (neue) X-Achse drehen
  3. um den Winkle \(\omega\)um die (neue) Z-Achse drehen
Wir benutzen nun Matrixschreibweise für die kartesischen Koordinaten des Planetenvektors \(\vec{r}\). Einmal für die orbitalen kartesischen Koordinaten
$$ \mathbf{x}_{orbital} = \begin{pmatrix} x_{orbital} \\ y_{orbital} \\ z_{orbital}\end{pmatrix} $$
Und auch für die heliozentrischen kartesischen Koordinaten
$$ \mathbf{x}_{heliocentric} = \begin{pmatrix} x_{heliocentric} \\ y_{heliocentric} \\ z_{heliocentric}\end{pmatrix} $$
Nun können wir durch Anwendung von Rotationsmatrizen zwischen den Koordinatensystem umrechnen:
$$ \mathbf{x}_{heliocentric} = R_z(\Omega) R_x(i) R_z(\omega)\mathbf{x}_{orbital} $$
bzw.
$$ \mathbf{x}_{orbital} = R_z(-\omega) R_x(-i) R_z(-\Omega)\mathbf{x}_{heliocentric} $$
Dabei sind \(R_z(\alpha)\)und \(R_x(\alpha)\)Rotationsmatrizen
$$\begin{eqnarray} R_z(\alpha) &=& \begin{pmatrix} \cos \alpha && -\sin \alpha && 0 \\ \sin \alpha && \cos \alpha && 0 \\ 0 && 0 && 1 \end{pmatrix} \\ R_x(\alpha) &=& \begin{pmatrix} 1 && 0 && 0 \\ 0 && \cos \alpha && -\sin \alpha \\ 0 && \sin \alpha && \cos \alpha \end{pmatrix} \end{eqnarray}$$(27)
(28)
Hier das Javascript Snippet um die Berechnung konkret durchzuführen:
   
var planet = global.planet;
planet.heliocentricEclipticPosition = planet.orbitalPosition
    .rotZ(planet.argumentPerihelion)
    .rotX(planet.inclination)
    .rotZ(planet.longitudeAscendingNode);
    
print("heliocentric ecliptic coordinates :",
  planet.heliocentricEclipticPosition.format("spherical-degrees"));
Wir benutzen hier die Rotationsmethoden des Vektorobjekts.
   
vector.rotX =  function (alpha) {
    var result = math.vector();
    result.x = this.x;
    result.y = Math.cos(alpha) * this.y - Math.sin(alpha) * this.z;
    result.z = Math.sin(alpha) * this.y + Math.cos(alpha) * this.z;
    return result;
}
Siehe hierzu die Bibliothek astro.math.js .

Erde: Bahnelemente

Im folgenden müßen wir die Berechnungen für die Erde wiederholen. Wir starten mit den Bahnelementen der Erde.
   

// orbital elements
var earth = global.earth = calc.orbitalElements(data.earth, global.julianDate);

// orbital elements calculated directly from JPL tables
print("semi major axis          :", earth.semiMajorAxis);
print("eccentricty              :", earth.eccentricity);
print("inclination              :", math.formatAngle("degrees-simple",earth.inclination));
print("mean longitude           :", math.formatAngle("degrees-simple",earth.meanLongitude));
print("longitude of perihelion  :", math.formatAngle("degrees-simple",earth.longitudePerihelion));
print("longitude ascending node :", math.formatAngle("degrees-simple",earth.longitudeAscendingNode));

// derived orbital elements
print("argument perihelion      :", math.formatAngle("degrees-simple",earth.argumentPerihelion));
print("mean anomaly             :", math.formatAngle("degrees-simple",earth.meanAnomaly))

Erde: Exzentrische Anomalie

Durch Lösung der Keplergleichung bestimmen wir aus der mittleren Anomalie die exzentrische Anomalie der Erde.
   
var earth = global.earth;
earth.eccentricAnomaly = calc.eccentricAnomaly(earth.meanAnomaly, earth.eccentricity);
print("eccentric anomaly        : ", earth.eccentricAnomaly);

Erde: Orbitalsystemkoordinaten

Aus der exzentrischen Anomalie können wir nun die wahre Anomalie der Erde berechnen.
       
// orbital position
var earth = global.earth;
earth.orbitalCoordinates = calc.orbitalCoordinates(earth.semiMajorAxis, 
                                                   earth.eccentricity, 
                                                   earth.eccentricAnomaly);
print("lambda  : ", math.formatAngle("degrees-simple",earth.orbitalCoordinates.lambda));
print("radius  : ", earth.orbitalCoordinates.rad);

// make vector from orbital coordinates
earth.orbitalPosition = math.vector(0, 
                                    earth.orbitalCoordinates.lambda, 
                                    earth.orbitalCoordinates.rad, 'spherical');
print("orbital coordinates :", earth.orbitalPosition.format("spherical-degrees"));

Erde: Heliozentrisch ekliptikale Koordinaten

Als nächste bestimmen wir die heliozentrischen Koordinaten der Erde indem wir durch Anwendung von Rotationsmatrizen zwischen den Koordinatensystemen umrechnen.
   
var earth = global.earth;
earth.heliocentricEclipticPosition = earth.orbitalPosition
    .rotZ(earth.argumentPerihelion)
    .rotX(earth.inclination)
    .rotZ(earth.longitudeAscendingNode);
print("heliocentric ecliptic coordinates :", 
  earth.heliocentricEclipticPosition.format("spherical-degrees"));

Planet: Geozentrisch ekliptikale Koordinaten

Aus den heliozentrisch ekliptikalen Koordinaten des Planeten und der Erde können wir nun die geozentrisch ekliptikalen Koordinaten des Planeten berechnen.

Das geozentrisch ekliptikalen Koordinatensystem erhält man indem man den Ursprung des heliozentrisch eklipitikalen Koordinatensystems ins Zentrum der Erde verschiebt. Wir können also durch einfache Vektorsubktration die kartesichen Koordinaten eines Planeten zwischen dem heliozentrischen und dem geozentrischen Koordinatensystem umrechnen
$$ \mathbf{x}_{planet,geocentric} = \mathbf{x}_{planet,heliocentric} - \mathbf{x}_{earth,heliocentric} $$

Abbildung 16: Berechung der geozentrisch ekliptikalen Koordinaten eines Planeten.
Hier das Javascript Snippet, welches die Vektorsubtraktion durchführt.
   
var planet = global.planet;
var earth  = global.earth;
planet.geocentricEclipticPosition = planet.heliocentricEclipticPosition
  .subtract(earth.heliocentricEclipticPosition);
print("geocentric eclpitic coordinates :", 
  planet.geocentricEclipticPosition.format('spherical-degrees'));

Planet: Geozentrisch äquatoriale Koordinaten

Als letzten Schritt rechnen wir dir geozentrisch eklipitikalen Koordinaten noch in das geozentrisch äquatoriale System um. Hierzu genügt es eine Rotationsmatrix auf die kartesischen Koordinaten anzuwenden.
$$ \mathbf{x}_{planet, equatorial} = R_x(\epsilon) \mathbf{x}_{planet,geocentric} $$
Hier bei ist \(\epsilon\)der Winkel zwischen Erdäquatoreben und Ekliptikalebene.

Hier das Javascript Snippet um die Berechnung durchzuführen
   
var planet = global.planet;
planet.geocentricEquatorialPosition = planet.geocentricEclipticPosition
  .rotX(calc.eclipticAngle(global.julianDate));
print("geocentric equatorial coordinates :", 
  planet.geocentricEquatorialPosition.format('spherical-hours'));

Sternkarte

Und ganz zum Schluss können wir unsere Planetenposition noch in eine Sternkarte eintragen.
   
var planet = global.planet;

// create map
var mymap = map.simpleMap({
    paper : raphael(document.getElementById("calckeplermap"), 500, 500)
});

// add planet
planet.color="red";
planet.title="Planet";
mymap.addPlanet(planet.geocentricEquatorialPosition);

// draw map
mymap.draw();

Vergleich Kreisbahn mit Ellipsenbahn

Hier ein Vergleich: Die Planetenposition wurde einmal mittels der Kreisbahnnäherung berechnet und ein zweites Mal mit unter Annahme einer elliptischen Bahn: Sternkarte .
Kreisförmige Planetenbahn Kalendersysteme

Kommentar erfassen

Name:
Email (wird nicht veröffentlicht):
Homepage:
Captcha Code:

Kommentare

Kontakt

Kontakt: denknix@denknix.com