Nutation berechnen

Status
Es sind keine weiteren Antworten möglich.

André_Knöfel

Aktives Mitglied
Hallo allerseits,

hat sich hier schon mal jemand näher mit der Berechnung der Nutation beschäftigt? Ich bin gerade dabei, ein IDL-Modul zur Nutation schreiben zu wollen (müssen). Im Web wird dabei immer auf die Variante eingegangen, die weniger genau ist. Nun will ich, wenn ich schon mal dabei bin, eine größere Genauigkeit erhalten. Im Meeus wird auf eine genauere Berechnung mit Hilfe periodischer Terme der Nutation eingegangen - das Problem ist nur, das ich genau diese Variante nicht kapiere. Kann mir da jemand helfen?

Gruß
André
 
Hi André,

schade hätte dir folgendes angeboten (TP-Programm)

Funktion: NutationConst(T, NutLon, NutObl)

und hier der Quellcode

(*****************************************************************************)
(* *)
(* Copyright (c) 1991-1992 by Jeffrey Sax *)
(* All rights reserved *)
(* Veroeffentlicht und vertrieben durch *)
(* Willmann-Bell, Inc. *)
(* P.O. Box 35025 *)
(* Richmond, Virginia 23235 *)
(* Voice (804) 320-7016 FAX (804) 272-5920 *)
(* *)
(* *)
(* HINWEIS FUER KOMMERZIELLE SOFTWAREBENUTZER *)
(* *)
(* Vor dem Vertrieb von Software, die diesen Code enth„lt, *)
(* MUESSEN Sie sich schriftlich an Willmann-Bell, Inc. an *)
(* obengenannte Adresse wenden zur Bestaetigung der Serien- *)
(* nummer Ihres Buches (Astronomische Algorithmen von Jean *)
(* Meeus) sowie der Software. Eine weitere Verguetung wird *)
(* nicht gefordert werden, ABER Sie MUESSEN zu Beginn Ihres *)
(* Programmes (Ihrer Programme) folgende Notiz wiedergeben: *)
(* *)
(* Dieses Programm enthaelt Softwarecode *)
(* Copyright (c) 1991-1992 by Jeffrey Sax *)
(* und verteilt durch Willmann-Bell, Inc. *)
(* Serie ####### *)
(* *)
(*****************************************************************************)
(* Module: NUTCONST.PAS *)
(* Version 2.0 *)
(* Zuletzt bearbeitet: 1992 November 1 *)
(*****************************************************************************)

(*****************************************************************************)
(* Name: NutationConst *)
(* Typ: Procedure *)
(* Zweck: berechnet Nutation in L„nge und Schiefe *)
(* Argumente: *)
(* T : Zahl der Jahrhunderte seit J2000 *)
(* NutLon, NutObl : die gesuchte Nutation in L„nge und Schiefe *)
(*****************************************************************************)

procedure NutationConst(T : real; var NutLon, NutObl : real);
var
i, j, k, l : integer;
Flag : boolean;
MS, MM, FF, DD, OM : real;
SinVal, CosVal, ArgSin, ArgCos, Tmp : real;
LonArg, OblArg : real;
SinTab, CosTab : array[1..5] of TSINCOSTAB;

const
{Polynomials page 132}
POm : T3POLY = (125.0445222, -1934.1362608, 0.00207833, 2.22e-6);
PMSun : T3POLY = (357.5277233, 35999.0503400, -0.0001603 ,-3.33e-6);
PMMoon : T3POLY = (134.9629814, 477198.8673981, 0.0086972 , 1.778e-5);
PF : T3POLY = ( 93.2719103, 483202.0175381, -0.00368250, 3.056e-6);
PD : T3POLY = (297.8503631, 445267.1114800, -0.0019142 , 5.278e-6);

{ Tabelle 27.1 }
{ Die Koeffizienten der Winkel D, M, M'... sind in derselben Ordnung }
{ wie im Supplement to the Astronomical Almanac of 1984 (pS23-S25), }
{ anders als in Tabelle 27.1. Die Ordnung ist hier M, M', F, D, }
{ Omega. Argumente sind in Einheiten von 0.0001" und 0.00001" fr }
{ die Konstanten und T-Koefficienten der Nutation. Dies erlaubt es, }
{ alle Koeffiziente als Integer zu speichern. Die ersten Terme }
{ sind zu groá und werden darum seperat berechnet. }
NUTTABTERMS = 62;
NUTTABSIZE = 9;
NutTab : array[1..NUTTABTERMS,1..NUTTABSIZE] of integer =
(( 0, 0, 2,-2, 2,-13187,-16,5736,-31),
( 0, 0, 2, 0, 2, -2274, -2, 977, -5),
( 0, 0, 0, 0, 2, 2062, 2,-895, 5),
( 0, 1, 0, 0, 0, 1426,-34, 54, -1),
( 1, 0, 0, 0, 0, 712, 1, -7, 0),
( 0, 1, 2,-2, 2, -517, 12, 224, -6),
( 0, 0, 2, 0, 1, -386, -4, 200, 0),
( 1, 0, 2, 0, 2, -301, 0, 129, -1),
( 0,-1, 2,-2, 2, 217, -5, -95, 3),
( 1, 0, 0,-2, 0, -158, 0, 0, 0),
( 0, 0, 2,-2, 1, 129, 1, -70, 0),
(-1, 0, 2, 0, 2, 123, 0, -53, 0),
( 0, 0, 0, 2, 0, 63, 0, 0, 0),
( 1, 0, 0, 0, 1, 63, 1, -33, 0),
(-1, 0, 2, 2, 2, -59, 0, 26, 0),
(-1, 0, 0, 0, 1, -58, -1, 32, 0),
( 1, 0, 2, 0, 1, -51, 0, 27, 0),
( 2, 0, 0,-2, 0, 48, 0, 0, 0),
(-2, 0, 2, 0, 1, 46, 0, -24, 0),
( 0, 0, 2, 2, 2, -38, 0, 16, 0),
( 2, 0, 2, 0, 2, -31, 0, 13, 0),
( 2, 0, 0, 0, 0, 29, 0, 0, 0),
( 1, 0, 2,-2, 2, 29, 0, -12, 0),
( 0, 0, 2, 0, 0, 26, 0, 0, 0),
( 0, 0, 2,-2, 0, -22, 0, 0, 0),
(-1, 0, 2, 0, 1, 21, 0, -10, 0),
( 0, 2, 0, 0, 0, 17, -1, 0, 0),
(-1, 0, 0, 2, 1, 16, 0, -8, 0),
( 0, 2, 2,-2, 2, -16, 1, 7, 0),
( 0, 1, 0, 0, 1, -15, 0, 9, 0),
( 1, 0, 0,-2, 1, -13, 0, 7, 0),
( 0,-1, 0, 0, 1, -12, 0, 6, 0),
( 2, 0,-2, 0, 0, 11, 0, 0, 0),
(-1, 0, 2, 2, 1, -10, 0, 5, 0),
( 1, 0, 2, 2, 2, -8, 0, 3, 0),
( 0, 1, 2, 0, 2, 7, 0, -3, 0),
( 1, 1, 0,-2, 0, -7, 0, 0, 0),
( 0,-1, 2, 0, 2, -7, 0, 3, 0),
( 0, 0, 2, 2, 1, -7, 0, 3, 0),
( 1, 0, 0, 2, 0, 6, 0, 0, 0),
( 2, 0, 2,-2, 2, 6, 0, -3, 0),
( 1, 0, 2,-2, 1, 6, 0, -3, 0),
(-2, 0, 0, 2, 1, -6, 0, 3, 0),
( 0, 0, 0, 2, 1, -6, 0, 3, 0),
( 1,-1, 0, 0, 0, 5, 0, 0, 0),
( 0,-1, 2,-2, 1, -5, 0, 3, 0),
( 0, 0, 0,-2, 1, -5, 0, 3, 0),
( 2, 0, 2, 0, 1, -5, 0, 3, 0),
(-2, 0, 2, 0, 2, -3, 0, 0, 0),
( 2, 0, 0,-2, 1, 4, 0, 0, 0),
( 0, 1, 2,-2, 1, 4, 0, 0, 0),
( 1,-1, 2, 0, 2, -3, 0, 0, 0),
(-1,-1, 2, 2, 2, -3, 0, 0, 0),
( 3, 0, 2, 0, 2, -3, 0, 0, 0),
( 0,-1, 2, 2, 2, -3, 0, 0, 0),
( 1,-1, 0,-1, 0, -3, 0, 0, 0),
( 1, 0, 0,-1, 0, -4, 0, 0, 0),
( 0, 1, 0,-2, 0, -4, 0, 0, 0),
( 1, 0,-2, 0, 0, 4, 0, 0, 0),
( 0, 0, 0, 1, 0, -4, 0, 0, 0),
( 1, 1, 0, 0, 0, -3, 0, 0, 0),
( 1, 0, 2, 0, 0, 3, 0, 0, 0));

begin
MM := Eval3Poly(PMMoon, T) * DToR;
MS := Eval3Poly(PMSun, T) * DToR;
FF := Eval3Poly(PF, T) * DToR;
DD := Eval3Poly(PD, T) * DToR;
OM := Eval3Poly(POm, T) * DToR;

CalcSinCosTab(MM,3,SinTab[1], CosTab[1]);
CalcSinCosTab(MS,2,SinTab[2], CosTab[2]);
CalcSinCosTab(FF,4,SinTab[3], CosTab[3]);
CalcSinCosTab(DD,4,SinTab[4], CosTab[4]);
CalcSinCosTab(OM,2,SinTab[5], CosTab[5]);

{ die ersten Terme sind zu groá fr die Tabelle : }
NutLon := (-0.01742*T - 17.1996) * SinTab[5][1]; { sin(OM) }
NutObl := ( 0.00089*T + 9.2025) * CosTab[5][1]; { cos(OM) }

for i := 1 to NUTTABTERMS do
begin
Flag := true;
{ Erster Koeffizient ungleich Null eines der 5 Winkel }
for j := 1 to 5 do
begin
k := NutTab[j];
if (k <> 0) then
begin
if (k < 0)
then l := -k
else l := k;
SinVal := SinTab[j][l];
if (k < 0) then
SinVal := -SinVal;
CosVal := CosTab[j][l];
if Flag then
begin
ArgSin := SinVal;
ArgCos := CosVal;
Flag := false;
end
else
begin
Tmp := ArgSin * CosVal + ArgCos * SinVal;
ArgCos := ArgCos * CosVal - ArgSin * SinVal;
ArgSin := Tmp;
end
end
end;
OblArg := 0.0;
LonArg := NutTab[6] * 0.0001; { konstanter Koeffizient des Sinus }
k := NutTab[7]; { T-Koeffizient des Sinus }
if (k <> 0) then
LonArg := LonArg + 0.00001 * T * k;
k := NutTab[8]; { konstanter Koeffizient des Kosinus }
if (k <> 0) then
begin
OblArg := 0.0001 * k;
k := NutTab[9]; { T-Koeffizient des Kosinus }
if (k <> 0) then
OblArg := OblArg + 0.00001 * T * k;
end;
NutLon := NutLon + LonArg * ArgSin;
NutObl := NutObl + OblArg * ArgCos;
end;
NutLon := NutLon * SToR;
NutObl := NutObl * SToR;
end;


 
Status
Es sind keine weiteren Antworten möglich.
Zurück
Oben