Astronomie Logo
Diskussionsforen Mondphasen - Berechnung | Karten, Software, Literatur
Optionen
Thema bewerten
Norbert_G Offline
Mitglied

Registriert: 26/09/2004
Beiträge: 9
#328799 - 10/07/2006 20:03 Mondphasen - Berechnung


Hallo!

Ich habe vor Kurzen von der HP von “Sky and Telescope” ein Basicprogramm zur Berechnung der Mondphasen herunter geladen. Das Programm lasse ich auf meinem programmierbaren SHARP – Taschenrechner laufen und es funktioniert ausgezeichnet. Als Ergebnis bekommt man die Neu- / Vollmondtage eines Jahres auf die Minute genau ausgegeben, allerdings hier noch als Julianisches Datum (Umrechnung macht kein Problem, da anderes Prog. von gleicher HP dies löst).
Meine Frage nun an Euch: „Neben Neu- und Vollmondzeiten würde ich auch gern die Zeiten für “Erstes Viertel“ und “Letztes Viertel“ bestimmen“. Ich könnte mir vorstellen, dass das Programm dies mit nur kleinen Änderungen hergibt, ich weis aber nicht, wo ich da ansetzen muss. Interpolieren zwischen den Zeiten geht, wohl auf Grund der elliptischen Bahn des Mondes, gar nicht!
Für jeden Hinweis und Tipp wäre ich Euch dankbar!

Norbert

P.S.: den programmierbaren Taschenrechner nutze ich zur Navigation (hier Gezeitenbestimmung) auf einem kleinen Segelboot, auf dem ein Laptop absolut unpraktikabel wäre (Stromverbrauch etc.)

Anlage: PROGRAMM – LISTING

10 REM NEW AND FULL MOONS
12 REM
14 REM
16 U=0
18 INPUT "YEAR ";Y
20 PRINT
22 K0=INT((Y-1900)*12.3685)
24 T=(Y-1899.5)/100
26 T2=T*T: T3=T*T*T
28 J0=2415020+29*K0
30 F0=0.0001178*T2-0.000000155*T3
32 F0=F0+0.75933+0.53058868*K0
34 F0=F0-0.000837*T-0.000335*T2
36 J=J+INT(F): F=F-INT(F)
38 M0=K0*0.08084821133
40 M0=360*(M0-INT(M0))+359.2242
42 M0=M0-0.0000333*T2
44 M0=M0-0.00000347*T3
46 M1=K0*0.07171366128
48 M1=360*(M1-INT(M1))+306.0253
50 M1=M1+0.0107306*T2
52 M1=M1+0.00001236*T3
54 B1=K0*0.08519585128
56 B1=360*(B1-INT(B1))+21.2964
58 B1=B1-0.0016528*T2
60 B1=B1-0.00000239*T3
62 FOR K9=0 TO 28
64 J=J0+14*K9: F=F0+0.765294*K9
66 K=K9/2
68 M5=M0+K*29.10535608
69 M6=M1+K*385.81691806
70 B6=B1+K*390.67050646
71 F=F-0.4068*SIN(M6)
72 F=F+(0.1734-0.000393*T)*SIN(M5)
73 F=F+0.0161*SIN(2*M6)
74 F=F+0.0104*SIN(2*B6)
75 F=F-0.0074*SIN(M5-M6)
76 F=F-0.0051*SIN(M5+M6)
77 F=F+0.0021*SIN(2*M5)
78 F=F+0.0010*SIN(2*B6-M6)
82 J=J+INT(F): F=F-INT(F)
84 IF U=0 THEN PRINT " NEW MOON ";
86 IF U=1 THEN PRINT "FULL MOON ";
88 PRINT J;F
90 U=U+1: IF U=2 THEN U=0
92 NEXT
94 END
95 REM ------------------------
96 REM APPEARED IN ASTRONOMICAL
97 REM COMPUTING, SKY & TELE-
98 REM SCOPE, MARCH, 1985
99 REM ------------------------

[zum Seitenanfang]
Manner Offline
Mitglied

Registriert: 26/06/2006
Beiträge: 1005
#328800 - 10/07/2006 20:17 Re: Mondphasen - Berechnung [Re: Norbert_G]


Moin

Vielleicht hilft dir da der "Virtual Moon Atlas" da weiter.

Grüße
Manfred

[zum Seitenanfang]
h_c_greier Offline
Mitglied

Registriert: 28/12/2003
Beiträge: 565
Ort: Graz, Austria
#328801 - 11/07/2006 16:05 Re: Mondphasen - Berechnung [Re: Norbert_G]


Hallo Norbert,


Zitat:

Meine Frage nun an Euch: „Neben Neu- und Vollmondzeiten würde ich auch gern die Zeiten für “Erstes Viertel“ und “Letztes Viertel“ bestimmen“. Ich könnte mir vorstellen, dass das Programm dies mit nur kleinen Änderungen hergibt, ich weis aber nicht, wo ich da ansetzen muss.




Tja, ganz so einfach ist das leider nicht
Obwohl, mit ein wenig Tüfteln lässt sich das mit guter Genauigkeit berwerkstelligen. Leider habe ich keinen BASIC-Code zur Hand, ich hab dir mal eine Art "Pseudocode" zurechtgebastelt. Hoffe, das lässt sich für dich anpassen (Taschenrechner).
Zeilen mit voranstehenden // bedeuten einfach Kommentar-Zeilen (ich programmiere [leider nur] ActionScript, da ist das eben so gelöst).

Code:

// ============================================================
// Berechnung der Viertel-Mondphasen
//
// Algorithmus nach J. Meeus' "Astronomical Algorithms",
// 2nd Edition, 1998, [ISBN 0-943396-61-1], Kapitel 49
//
// Gekürzte Version, Terme < 0.001 Tage (= 1.44 min) werden
// vernachlässigt.
//
// Genauigkeit in etwa ± einige Minuten, sofern man sich nicht
// allzu weit von J2000 entfernt.
// Ergebnis in JDE, also Julianisches Datum (ephemeridisch)
// Für eine Umrechung in Datum und Tageszeit wird ein eigener
// Algorithmus benötigt. Das Ergebnis liefert dann die
// dynamische Zeit (TD) des Ereignisses. Umrechnung auf
// Weltzeit UT erfolgt über deltaT, es gilt:
// UT = TD - deltaT
//
// Da deltaT zur Zeit bei etwa 1 Minute liegt und dies innerhalb
// der Genauigkeit des nachstehenden Algorithmus liegt, ist eine
// Umrechnung nicht unbedingt notwendig, zumal der Fehler "der selbe"
// bleibt.
//
//
// Angaben:
// Phasen: phase = 0.25 für 1. Viertel
// phase = 0.75 für letztes Viertel
// Für Werte anders als 0.25 oder 0.75 ist nachstehender
// Script ungültig.
// Angabe des Zeitpunktes als Fließkomma-Jahreszehl
// Bsp.: 1.8.2006 = ca. 2006.581
//
// Rückgabe: JDE
// ============================================================
//
// ----- BEGIN PSEUDOCODE -----
// Eingaben
year = 2006.5;
phase = 0.25;
//
//
// Berechnung
rads = 3.14159265359/180;
k = floor((year-2000)*12.3685)+phase;
// Mittlerer JDE Wert des Ereignisses
JDE = 2451550.09766+29.530588861*k;
// Relevante Winkelwerte in [Radiant]
// ACHTUNG: Wenn die Winkel für den später verwendeten Sinus
// in Grad [°] benötigt werden, einfach die Multiplikation
// mit "rads" weglassen!
M = (2.5534+29.10535670*k)*rads;
Ms = (201.5643+385.81693528*k)*rads;
F = (160.7108+390.67050284*k)*rads;
//
//
// Korrekturterme für JDE für das 1. bzw. letzte Viertel
JDE += -0.62801*Sin(Ms);
JDE += 0.17172*Sin(M);
JDE += -0.01183*Sin(Ms+M);
JDE += 0.00862*Sin(2*Ms);
JDE += 0.00804*Sin(2*F);
JDE += 0.00454*Sin(Ms-M);
JDE += 0.00204*Sin(2*M);
JDE += -0.00180*Sin(Ms-2*F);
//
// Weiterer Korrekturterm für Viertelphasen
if (phase == 0.25) {
JDE += 0.00306;
} else {
JDE += -0.00306;
}
return JDE;
//
// ----- END PSEUDOCODE -----



Beispiele:

Erstes Viertel im Juli 2006
year = 2006.5 (geschätzt)
phase = 0.25
=> JDE = 2453920.1918145
=> 3 Jul 2006 16:37:17 TD
genaue Rechnung:
3 Jul 2006 16:37:42 TD


Letztes Viertel Dezember 2006:
year = 2006.9 (geschätzt)
phase = 0.75
=> JDE = 2454082.10707812
=> 12 Dez 2006 14:35:16 TD
genaue Rechnung:
12 Dez 2006 14:32:42 TD


Nachteil der o.a. Methode ist vielleicht, dass die Angabe des Zeitpunktes in Fließkomma-Jahreszahl erfolgt. In der Regel haben die wenigsten Menschen ein "Gespür" dafür, wann zB. der 15.April in dieser Darstellung ist....;)
Das lässt sich aber in Griff bekommen, wenn man den Script in eine Schleife gibt und den Wert k immer um 1 erhöht, um mehrere Viertelphasen hintereinander zu erhalten (je nachdem mit phase=0.25 oder phase=0.75)


greets,
harald

--


Bearbeitet von h_c_greier (11/07/2006 16:10)
_________________________
www.parallax.at

[zum Seitenanfang]
Lots Offline
Mitglied

Registriert: 19/08/2002
Beiträge: 4928
Ort: Darmstadt 8° 39' Ost, +49° 52...
#328802 - 12/07/2006 12:07 Re: Mondphasen - Berechnung [Re: Norbert_G]


hier mein Proggi in Turo Pascal, villeicht hilfts weiter..

(***************************************************************************)
(* Name des Moduls: MOON *)
(***************************************************************************)
(* Art des Moduls: PROGRAM *)
(* Bezeichner des Moduls: MOND.PAS *)
(* Dateiname des Moduls: C:\ASTRO\ASTRONOM\MOND.PAS *)
(***************************************************************************)
(* Beschreibung: Es werden, fr ein Datum Ihrer Wahl, die Koordinaten und *)
(* Ephemeriden des Mondes berechnet. *)
(* Dabei werden 60 Terme der neuen Mondtheorie ELP-2000/82 *)
(* von Chapront benutzt. Die Genauigkeit der Ergebnisse wird *)
(* ber den Zeitraum 10" in L„nge und 4" in Breite betragen. *)
(***************************************************************************)
(* externe Units: EINGABE.PAS, FUNKTION.PAS, BASIC.PAS *)
(* externe Procedure: ReadInteger, ReadReal, Bitte_Taste, PRUEF_DATUM, *)
(* WINKEL360, WINKEL2PI, DMS_DEZ, DELTA, UHRZEIT24, *)
(* DATUM_JD, JD_DATUM, WriteHMS, WriteDMS, *)
(* NutationConst, STERNZEIT *)
(* externe Function: SGN, RAD, DEG, TAN, ASN, ACS, GANZZAHL, RW *)
(***************************************************************************)
PROGRAM MOON;

USES CRT, PRINTER, EINGABE, FUNKTION, BASIC; {eigene UNITS}

CONST
MOONTABTERMS = 60;
MOONTAB = 46;
MoonTermsLR : array[1..MOONTABTERMS,1..6] of longint =
(( 0, 0, 1, 0,6288774,-20905355), ( 2, 0,-1, 0,1274027, -3699111),
( 2, 0, 0, 0, 658314, -2955968), ( 0, 0, 2, 0, 213618, -569925),
( 0, 1, 0, 0,-185116, 48888), ( 0, 0, 0, 2,-114332, -3149),
( 2, 0,-2, 0, 58793, 246158), ( 2,-1,-1, 0, 57066, -152138),
( 2, 0, 1, 0, 53322, -170733), ( 2,-1, 0, 0, 45758, -204586),
( 0, 1,-1, 0, -40923, -129620), ( 1, 0, 0, 0, -34720, 108743),
( 0, 1, 1, 0, -30383, 104755), ( 2, 0, 0,-2, 15327, 10321),
( 0, 0, 1, 2, -12528, 0), ( 0, 0, 1,-2, 10980, 79661),
( 4, 0,-1, 0, 10675, -34782), ( 0, 0, 3, 0, 10034, -23210),
( 4, 0,-2, 0, 8548, -21636), ( 2, 1,-1, 0, -7888, 24208),
( 2, 1, 0, 0, -6766, 30824), ( 1, 0,-1, 0, -5163, -8379),
( 1, 1, 0, 0, 4987, -16675), ( 2,-1, 1, 0, 4036, -12831),
( 2, 0, 2, 0, 3994, -10445), ( 4, 0, 0, 0, 3861, -11650),
( 2, 0,-3, 0, 3665, 14403), ( 0, 1,-2, 0, -2689, -7003),
( 2, 0,-1, 2, -2602, 0), ( 2,-1,-2, 0, 2390, 10056),
( 1, 0, 1, 0, -2348, 6322), ( 2,-2, 0, 0, 2236, -9884),
( 0, 1, 2, 0, -2120, 5751), ( 0, 2, 0, 0, -2069, 0),
( 2,-2,-1, 0, 2048, -4950), ( 2, 0, 1,-2, -1773, 4130),
( 2, 0, 0, 2, -1595, 0), ( 4,-1,-1, 0, 1215, -3958),
( 0, 0, 2, 2, -1110, 0), ( 3, 0,-1, 0, -892, 3258),
( 2, 1, 1, 0, -810, 2616), ( 4,-1,-2, 0, 759, -1897),
( 0, 2,-1, 0, -713, -2117), ( 2, 2,-1, 0, -700, 2354),
( 2, 1,-2, 0, 691, 0), ( 2,-1, 0,-2, 596, 0),
( 4, 0, 1, 0, 549, -1423), ( 0, 0, 4, 0, 537, -1117),
( 4,-1, 0, 0, 520, -1571), ( 1, 0,-2, 0, -487, -1739),
( 2, 1, 0,-2, -399, 0), ( 0, 0, 2,-2, -381, -4421),
( 1, 1, 1, 0, 351, 0), ( 3, 0,-2, 0, -340, 0),
( 4, 0,-3, 0, 330, 0), ( 2,-1, 2, 0, 327, 0),
( 0, 2, 1, 0, -323, 1165), ( 1, 1,-1, 0, 299, 0),
( 2, 0, 3, 0, 294, 0), ( 2, 0,-1,-2, 0, 8752));

MoonTermsB : array[1..MOONTABTERMS,1..5] of longint =
(( 0, 0, 0, 1,5128122), ( 0, 0, 1, 1, 280602),
( 0, 0, 1,-1, 277693), ( 2, 0, 0,-1, 173237),
( 2, 0,-1, 1, 55413), ( 2, 0,-1,-1, 46271),
( 2, 0, 0, 1, 32573), ( 0, 0, 2, 1, 17198),
( 2, 0, 1,-1, 9266), ( 0, 0, 2,-1, 8822),
( 2,-1, 0,-1, 8216), ( 2, 0,-2,-1, 4324),
( 2, 0, 1, 1, 4200), ( 2, 1, 0,-1, -3359),
( 2,-1,-1, 1, 2463), ( 2,-1, 0, 1, 2211),
( 2,-1,-1,-1, 2065), ( 0, 1,-1,-1, -1870),
( 4, 0,-1,-1, 1828), ( 0, 1, 0, 1, -1794),
( 0, 0, 0, 3, -1749), ( 0, 1,-1, 1, -1565),
( 1, 0, 0, 1, -1491), ( 0, 1, 1, 1, -1475),
( 0, 1, 1,-1, -1410), ( 0, 1, 0,-1, -1344),
( 1, 0, 0,-1, -1335), ( 0, 0, 3, 1, 1107),
( 4, 0, 0,-1, 1021), ( 4, 0,-1, 1, 833),
( 0, 0, 1,-3, 777), ( 4, 0,-2, 1, 671),
( 2, 0, 0,-3, 607), ( 2, 0, 2,-1, 596),
( 2,-1, 1,-1, 491), ( 2, 0,-2, 1, -451),
( 0, 0, 3,-1, 439), ( 2, 0, 2, 1, 422),
( 2, 0,-3,-1, 421), ( 2, 1,-1, 1, -366),
( 2, 1, 0, 1, -351), ( 4, 0, 0, 1, 331),
( 2,-1, 1, 1, 315), ( 2,-2, 0,-1, 302),
( 0, 0, 1, 3, -283), ( 2, 1, 1,-1, -229),
( 1, 1, 0,-1, 223), ( 1, 1, 0, 1, 223),
( 0, 1,-2,-1, -220), ( 2, 1,-1,-1, -220),
( 1, 0, 1, 1, -185), ( 2,-1,-2,-1, 181),
( 0, 1, 2, 1, -177), ( 4, 0,-2,-1, 176),
( 4,-1,-1,-1, 166), ( 1, 0, 1,-1, -164),
( 4, 0, 1,-1, 132), ( 1, 0,-1,-1, -119),
( 4,-1, 0,-1, 115), ( 2,-2, 0, 1, 107));

MoonApsiden: ARRAY[1..MOONTABTERMS+1,1..5] OF LONGINT =
(( 2, 0, 0, -16769, 4392), ( 4, 0, 0, 4589, 684),
( 6, 0, 0, -1856, 144), ( 8, 0, 0, 883, 35),
( 2,-1, 0, -773, 426), ( 0, 1, 0, 502, 456),
(10, 0, 0, -460, 9), ( 4,-1, 0, 422, 113),
( 6,-1, 0, -256, 34), (12, 0, 0, 253, 3),
( 1, 0, 0, 237, -189), ( 8,-1, 0, 162, 11),
(14, 0, 0, -145, 0), ( 0, 0, 2, 129, 212),
( 3, 0, 0, -112, -17), (10,-1, 0, -104, 4),
(16, 0, 0, 86, 0), (12,-1, 0, 69, 0),
( 5, 0, 0, 66, -4), ( 2, 0, 2, -53, 47),
(18, 0, 0, -52, 0), (14,-1, 0, -46, 0),
( 7, 0, 0, -41, 0), ( 2, 1, 0, 40, 5),
(20, 0, 0, 32, 0), ( 1, 1, 0, -32, 36),
(16,-1, 0, 31, 0), ( 4, 1, 0, -29, 0),
( 2,-2, 0, -27, 22), ( 4,-2, 0, 24, 10),
( 6,-2, 0, -21, 4), (22, 0, 0, -21, 0),
(18,-1, 0, -21, 0), ( 6, 1, 0, 19, 0),
(11, 0, 0, -18, 0), ( 8, 1, 0, -14, 0),
( 4, 0,-2, -14, -4), ( 6, 0, 2, -14, 4),
( 3, 1, 0, 14, 7), ( 5, 1, 0, -14, 0),
(13, 0, 0, 13, 0), (20,-1, 0, 13, 0),
( 3, 2, 0, 11, 0), ( 4,-2, 2, -11, 0),
( 1, 2, 0, -10, 0), (22,-1, 0, -9, 0),
( 0, 0, 4, -8, 0), ( 6, 0,-2, 8, 0),
( 2, 1,-2, 8, 0), ( 0, 2, 0, 7, 6),
( 0,-1, 2, 7, 0), ( 2, 0, 4, 7, 0),
( 0,-2, 2, -6, 0), ( 2, 2,-2, -6, 0),
(24, 0, 0, 6, 0), ( 4, 0,-4, 5, -4),
( 9, 0, 0, 27, 0), ( 4, 0, 2, 27, 13),
( 2, 2, 0, 5, 5), ( 1,-1, 0, 4, -3),
( 2, 0,-2, 0, -34));

MoonApsidenParallaxe: ARRAY[1..MOONTAB,1..5] OF LONGINT =
(( 63224, 2, 0, 0, -9147), ( -6990, 4, 0, 0, 355),
( 2834, 2,-1, 0, 159), ( 1927, 6, 0, 0, 52),
( -1263, 1, 0, 0, -841), ( -702, 8, 0, 0, 10),
( 696, 0, 1, 0, -656), ( -690, 0, 0, 2, 697),
( -629, 4,-1, 0, 65), ( -288, 2, 0,-2, -23),
( 297,10, 0, 0, 0), ( 260, 6,-1, 0, 14),
( 201, 3, 0, 0, 0), ( -161, 2, 1, 0, 43),
( 157, 1, 1, 0, 127), ( -138,12, 0, 0, 0),
( -127, 8,-1, 0, 0), ( 0, 2, 0, 2, 31),
( 81, 2, 2, 0, 19), ( -79, 5, 0, 0, 0),
( 68,14, 0, 0, 0), ( 67,10,-1, 0, 0),
( 54, 4, 1, 0, 0), ( -38, 4,-2, 0, 0),
( -38,12,-1, 0, 0), ( 37, 7, 0, 0, 0),
( -37, 4, 0, 2, 0), ( -35,16, 0, 0, 0),
( -30, 3, 1, 0, 0), ( 29, 1,-1, 0, 0),
( -25, 6, 1, 0, 0), ( 23,14,-1, 0, 0),
( 23, 0, 2, 0, -16), ( 0, 2,-2, 0, 22),
( 22, 6,-2, 0, 0), ( -21, 2,-1,-2, 0),
( -20, 9, 0, 0, 0), ( 19,18, 0, 0, 0),
( 17, 6, 0, 2, 0), ( 14, 0,-1, 2, 0),
( -14,16,-1, 0, 0), ( 13, 4, 0,-2, 0),
( 12, 8, 1, 0, 0), ( 11,11, 0, 0, 0),
( 10, 5, 1, 0, 0), ( -10,20, 0, 0, 0));

MoonPhaseCoeffTab : array[1..25, 0..2] of real = (
(-0.40720,-0.40614,-0.62801), ( 0.17241, 0.17302, 0.17172),
( 0.01608, 0.01614, 0.00862), ( 0.01039, 0.01043, 0.00804),
( 0.00739, 0.00734, 0.00454), (-0.00514,-0.00515,-0.01183),
( 0.00208, 0.00209, 0.00204), (-0.00111,-0.00111,-0.00180),
(-0.00057,-0.00057,-0.00070), ( 0.00056, 0.00056, 0.00027),
(-0.00042, 0.00042,-0.00040), ( 0.00042, 0.00042, 0.00032),
( 0.00038, 0.00038, 0.00032), (-0.00024,-0.00024,-0.00034),
(-0.00007,-0.00007,-0.00028), ( 0.00004, 0.00004, 0.00002),
( 0.00004, 0.00004, 0.00003), ( 0.00003, 0.00003, 0.00003),
( 0.00003, 0.00003, 0.00004), (-0.00003,-0.00003,-0.00004),
( 0.00003, 0.00003, 0.00002), (-0.00002,-0.00002,-0.00005),
(-0.00002,-0.00002,-0.00002), ( 0.00002, 0.00002, 0 ),
( 0 , 0 , 0.00004));

MoonPhaseAngleTab : array[1..25,0..2] of integer =
(( 0, 1, 0), ( 1, 0, 0), ( 0, 2, 0), ( 0, 0, 2),
(-1, 1, 0), ( 1, 1, 0), ( 2, 0, 0), ( 0, 1,-2),
( 0, 1, 2), ( 1, 2, 0), ( 0, 3, 0), ( 1, 0, 2),
( 1, 0,-2), (-1, 2, 0), ( 2, 1, 0), ( 0, 2,-2),
( 3, 0, 0), ( 1, 1,-2), ( 0, 2, 2), ( 1, 1, 2),
(-1, 1, 2), (-1, 1,-2), ( 1, 3, 0), ( 0, 4, 0),
(-2, 1, 0));

{ Koeffizienten von A1-A14. Korrekturen haben die Form C3 * sin(C1 + C2*T)}
MoonPhaseExtra : array[1..14, 0..2] of real =
((299.77, 0.107408,0.000325), (251.88, 0.016321,0.000165),
(251.83,26.651886,0.000164), (349.42,36.412478,0.000126),
( 84.66,18.206239,0.000110), (141.74,53.303771,0.000062),
(207.14, 2.453732,0.000060), (154.84, 7.306860,0.000056),
( 34.52,27.261239,0.000047), (207.19, 0.121824,0.000042),
(291.34, 1.844379,0.000040), (161.72,24.198154,0.000037),
(239.56,25.513099,0.000035), (331.55, 3.592518,0.000023));

VAR inkey, drucker: CHAR; {Globale Variablen}
jahr,jahre,tage,monat,monate,tag,hh,zz,xx: INTEGER;
geo_breite,geo_laenge,jd0,t0,t,ut,mez,dt,mls,mlm,mam,mas,mlk,i,f,v,cc,
entp,enta,pp,pa,jdep,jdea,parallaxe,radius,entfernung,e,c,utt,monats,
jde1, jde2: REAL;

PROCEDURE ERLAEUTERUNG;
BEGIN
ClrScr;
Writeln('KOORDINATEN UND PHYSISCHE EPHEMERIDEN:');
Writeln('Nach Eingabe des Datums und der geographischen Koordinaten Ihres');
Writeln('Beobachtungsortes berechnet der Computer die kompletten Koordinaten');
Writeln('und physischen Ephemeriden des Mondes fr diesen Zeitraum.');
Writeln('Dazu geh”ren die scheinbaren geozentrischen ekliptikalen und „quatorialen');
Writeln('Koordinaten sowie der Positionswinkel der Achse und die Libration in');
Writeln('L„nge und Breite. Des weiteren wird die selenografische Position der');
Writeln(' Sonne berechnet. Zum Abschluá werden Auf,-Durch,-und Untergang des Mondes');
Writeln('in MEZ angegeben. Bei der Sommerzeit ist eine Stunde zu addieren.');
Writeln;
Writeln('EPHEMERIDEN FšR 20 TAGE:');
Writeln('Es werden fr diesen Zeitraum die wichtigsten Koordinaten und');
Writeln('Ephemeriden des Mondes wie z.B. Rektaszension, Deklination, Ekliptikale');
Writeln('L„nge und Breite, Entfernung, Elongation, Positionswinkel, Halbmesser,');
Writeln('Breite und L„nge des Mittelpunktes der Mondscheibe(Libration) berechnet.');
Writeln;
Writeln('MONDPHASEN:');
Writeln('Nach Eingabe des gewnschten Jahres berechnet der Computer den');
Writeln('Zeitpunkt der Mondphasen in MEZ.');
Writeln('Der maximale Fehler wird zwei Minuten nicht berschreiten. In den');
Writeln('meisten F„llen ist der Fehler geringer als eine Minute.');
Writeln;
BITTE_TASTE;
END;

PROCEDURE DATUMEINGABE;
BEGIN
zz:=1;
jahr:=-1000; monat:=0; tag:=0; mez:=-1; xx:=0;
geo_breite:=99;
geo_laenge:=361;
hh:=-1;
WRITELN('Bitte geben Sie das Datum ein ...');
WRITE('Jahr (-999 bis 4999):');
WHILE (jahr < -999) OR (jahr > 4999) DO
READINTEGER(jahr,4,22,2);
WRITELN;
WRITE('Monat:');
WHILE (monat < 1) OR (monat > 12) DO
READINTEGER(monat,2,7,3);
WRITELN;
WRITE('Tag:');
WHILE (tag < 1) OR (tag > 31) OR ((cc>1582.1004) AND (cc<1582.10149)) DO
BEGIN
READINTEGER(tag,2,5,4);
cc:=jahr+monat/100+tag/10000;
END;
WRITELN;
PRUEF_DATUM(tag,monat,jahr); {Prft das Datum}
WRITE('Uhrzeit(MEZ):');
WHILE (mez < 0) or (mez > 24) DO
READREAL(mez,7,14,5);
WRITELN;
DMS_DEZ(mez);
ut:=mez-1;
DATUM_JD(jahr, monat, tag, 0, jd0); {Umwandeln des Datums}
DELTA(jahr,dt);
t0:=(jd0-2451545)/36525;
t:=t0+(ut/24+dt/86400)/36525;
mez:=RW(mez,'S');
WRITE('Geographische Breite ]-90..90[:');
WHILE (geo_breite <= -90) OR (geo_breite >= 90) DO
READREAL(geo_breite,8,32,6);
WRITELN;
WRITE('Geographische L„nge (”stl. -) -180..180:');
WHILE (geo_laenge < -180) OR (geo_laenge > 180) DO
READREAL(geo_laenge,8,41,7);
WRITELN;
Write('H”he ber dem Meeresspiegel in Metern [0..8000]:');
While (hh<0) OR (hh>8000) DO
ReadInteger(hh,4,49,8);
Writeln;
geo_breite:=RAD(geo_breite);
geo_laenge:=RAD(geo_laenge);
IF inkey <> '1' THEN BEGIN
WRITE('Intervall in Minuten?:');
WHILE (xx < 1) OR (xx > 1440) DO
READINTEGER(xx,4,23,9);
WriteLn;
drucker:=' ';
Write('Ausgabe auf dem Drucker J/N ?');
WHILE (drucker <> 'J') AND (drucker <> 'N') DO
BEGIN
GotoXY(30,10);
CLREOL;
Read(drucker);
drucker:=UPCASE(drucker);
END;
END;
END; {DATUMEINGABE}

PROCEDURE PARALLAXE_ENTFERNUNG;
VAR cd, d: REAL;
ii: INTEGER;
BEGIN
d:=0; cd:=0;
for ii:=1 to MOONTABTERMS do
begin
d:=MoonTermsLR[ii,6]*COS(i*MoonTermsLR[ii,1]+mas*MoonTermsLR[ii,2]+mam*MoonTermsLR[ii,3]+f*MoonTermsLR[ii,4]);
if ABS(MoonTermsLR[ii,2])=1 THEN d:=d*e;
if ABS(MoonTermsLR[ii,2])=2 THEN d:=d*e*e;
cd:=cd+d;
end;
entfernung:=385000.56+cd/1000;
parallaxe:=ASN(6378.14/entfernung);
radius:=ASN(0.272493*SIN(parallaxe));
END; {PARALLAXE_ENTFERNUNG}

PROCEDURE APSIDEN(VAR month:REAL);
VAR k,jde,jdep1,jdea1,t,dp,mp,fp,kk,kj: REAL;
i,j: INTEGER;
BEGIN
jdep:=0; jdea:=0;
k:=GANZZAHL((jahr+month/12-1999.97)*13.2555);
jdep1:=0; jdea1:=0;
pp:=0; pa:=0;
FOR j:=0 TO 1 DO
BEGIN
IF j=1 THEN k:=k+0.5;
t:=k/1325.55;
jde:=2451534.6698+27.55454988*k-0.0006886*t*t-0.000001098*t*t*t+0.0000000052*t*t*t*t;
dp:=171.9179+335.9106046*k-0.010025*t*t-0.00001156*t*t*t+0.000000055*t*t*t*t;
mp:=347.3477+27.1577721*k-0.0008323*t*t-0.000001*t*t*t;
fp:=316.6109+364.5287911*k-0.0125131*t*t-0.0000148*t*t*t;
dp:=RAD(dp);
mp:=RAD(mp);
fp:=RAD(fp);
FOR i:= 1 to MoonTabTerms+1 DO
BEGIN
kk:=0;
kj:=0;
IF MoonTabTerms = 5 THEN BEGIN kk:= 0.00019; kj:=-0.00011 END;
IF MoonTabTerms = 6 THEN BEGIN kk:=-0.00013; kj:=-0.00011 END;
IF MoonTabTerms = 8 THEN kk:=-0.00011;
IF j=0 THEN jdep1:=jdep1+(MoonApsiden[i,4]+kk*t)*SIN(MoonApsiden[i,1]*dp+MoonApsiden[i,2]*mp+MoonApsiden[i,3]*fp);
IF j=1 THEN jdea1:=jdea1+(MoonApsiden[i,5]+kj*t)*SIN(MoonApsiden[i,1]*dp+MoonApsiden[i,2]*mp+MoonApsiden[i,3]*fp);
END;
IF j=0 THEN jdep:=jde+jdep1/1E4;
IF j=1 THEN jdea:=jde+jdea1/1E4;
FOR i:= 1 to MoonTab DO
BEGIN
kk:=0;
IF MoonTab = 3 THEN kk:=-0.0071;
IF MoonTab = 7 THEN kk:=-0.0017;
IF MoonTAb = 9 THEN kk:= 0.0016;
IF j=0 THEN pp:=pp+(MoonApsidenParallaxe[i,1]+kk*t)*COS(MoonApsidenParallaxe[i,2]*dp+MoonApsidenParallaxe[i,3]*mp
+MoonApsidenParallaxe[i,4]*fp);
IF j=1 THEN pa:=pa+MoonApsidenParallaxe[i,5]*COS(MoonApsidenParallaxe[i,2]*dp+MoonApsidenParallaxe[i,3]*mp
+MoonApsidenParallaxe[i,4]*fp);
END;
IF j=0 THEN BEGIN pp:=3629.215+pp/1000;
entp:=6378.14/SIN(RAD(pp/3600));
END
ELSE
BEGIN
pa:=3245.251+pa/1000;
enta:=6378.14/SIN(RAD(pa/3600));
END;
END;
END;

Procedure Knoten;
Var jack, k, t, d, m, n, r, v, p, jdet: Real;
Begin
jack:=0;
k:=GANZZAHL((Jahr+monat/13-2000.05)*13.4223);
t:=k/1342.23;
While (jack < 1) DO
Begin
if jack = 0.6 then k:=k+0.5;
d:=RAD(183.6380 + 331.73735691*k + 0.0015057*t*t + 0.00000209*t*t*t - 0.00000001*t*t*t*t);
m:=RAD( 17.4006 + 26.82037250*k + 0.0000999*t*t + 0.00000006*t*t*t);
n:=RAD( 38.3776 + 355.52747322*k + 0.0123577*t*t + 0.000014628*t*t*t - 0.000000069*t*t*t*t);
r:=123.9767 - 1.44098949*k + 0.0020625*t*t + 0.00000214*t*t*t -0.000000016*t*t*t*t;
v:=RAD(299.75 + 132.85*t -0.009173*t*t);
p:=RAD(r + 272.75 - 2.3*t);
r:=RAD(r);
jdet:=2451565.1619 + 27.212220817*k + 0.0002572*t*t + 0.000000021*t*t*t - 0.000000000088*t*t*t*t;
jdet:=jdet-0.4721*SIN(n)-0.1649*SIN(2*d)-0.0868*sin(2*d-n)+0.0084*sin(2*d+n)-e*0.0083*sin(2*d-m);
jdet:=jdet-e*0.0039*sin(2*d-m-n)+0.0034*sin(2*n)-0.0031*sin(2*d-2*n)+e*0.003*sin(2*d+m);
jdet:=jdet+e*0.0028*sin(m-n)+e*0.0026*sin(m)+0.0025*sin(4*d)+0.0024*sin(d)+e*0.0022*sin(m+n);
jdet:=jdet+0.0017*sin(r)+0.0014*sin(4*d-n)+e*0.0005*sin(2*d+m-n)+e*0.0004*sin(2*d-m+n);
jdet:=jdet-e*0.0003*sin(2*d-2*m)+e*0.0003*sin(4*d-m)+0.0003*sin(v)+0.0003*sin(p);
if jack = 0 then jde1:=jdet
else jde2:=jdet;
jack:=jack+0.6;
end;
End;

{Berechnet die Koordinaten und physischen Ephemeriden des Mondes}
PROCEDURE MONDBAHN;
VAR elo: STRING[9];
lauf, laufv: INTEGER;
u,z,y,rektaszension,ekliptikschiefe,gmst,gast,last,topra,topde,dlp,dl,elw,
ekl_breite,ekl_laenge,wahre_ekl_laenge,phasenwinkel,ls,wahre_ekl,deps,
dphi,exzentrizitaet,phase,deklination,br,la,pw,lgr,l0,b0,c0,a1,a2,a3,
additionl,additionb,wls: REAL;

PROCEDURE INSTALLATION;
BEGIN
e:=1-0.002516*t-0.0000074*t*t;
mlm:=218.3164591+481267.88134236*t-0.0013268*t*t+t*t*t/538841-t*t*t*t/65194000;
WINKEL360(mlm);
mam:=134.9634114+477198.8676313*t+0.008997*t*t+t*t*t/69699-t*t*t*t/14712000;
WINKEL360(mam);
mas:=357.5291092+35999.0502909*t-0.0001536*t*t+t*t*t/24490000;
WINKEL360(mas);
f:= 93.2720993+483202.0175273*t-0.0034029*t*t-t*t*t/3526000+t*t*t*t/863310000;
WINKEL360(f);
i:= 297.8502042+445267.1115168*t-0.00163*t*t+t*t*t/545868-t*t*t*t/113065000;
WINKEL360(i);
mlk:=125.044555-1934.1361849*t+0.00207062*t*t+t*t*t/467410-t*t*t*t/60616000;
WINKEL360(mlk);
mls:=280.46645+36000.76983*t+0.0003032*t*t;
WINKEL360(mls);
a1:=119.75+ 131.849*t;
a2:= 53.09+479264.29*t;
a3:=313.45+481266.484*t;
mlk:=RAD(mlk);
mls:=RAD(mls);
mlm:=RAD(mlm);
mam:=RAD(mam);
mas:=RAD(mas);
f:=RAD(f);
i:=RAD(i);
a1:=RAD(a1);
a2:=RAD(a2);
a3:=RAD(a3);
additionl:=3958*sin(a1)+1962*sin(mlm-f)+318*sin(a2);
additionb:=-2235*sin(mlm)+382*sin(a3)+175*sin(a1-f)+175*sin(a1+f)+127*sin(mlm-mam)-115*sin(mlm+mam);
ekliptikschiefe:=23.43929111-0.013004167*t-1.639e-7*t*t+5.0361e-7*t*t*t;
NutationConst(t, dphi, deps);
wahre_ekl:=ekliptikschiefe+DEG(deps);
ekliptikschiefe:=RAD(ekliptikschiefe);
wahre_ekl:=RAD(wahre_ekl);
exzentrizitaet:=0.016708617-0.000042037*t-0.0000001236*t*t;
c:=(1.9146-0.004817*t-0.000014*t*t)*SIN(mas)+(0.019993-0.000101*t)*SIN(2*mas)+0.00029*SIN(3*mas);
v:=mas+RAD(c);
wls:=mls+RAD(c);
END; {INSTALLATION}

PROCEDURE GEOZ_EKL_KOORD;
VAR c,d: REAL;
ii: INTEGER;
BEGIN
c:=0; d:=0;
for ii:=1 to MOONTABTERMS do
begin
d:=MoonTermsLR[ii,5]*SIN(i*MoonTermsLR[ii,1]+mas*MoonTermsLR[ii,2]+mam*MoonTermsLR[ii,3]+f*MoonTermsLR[ii,4]);
if ABS(MoonTermsLR[ii,2])=1 THEN d:=d*e;
if ABS(MoonTermsLR[ii,2])=2 THEN d:=d*e*e;
c:=c+d;
end;
c:=c/1E6;
ekl_laenge:=mlm+RAD(c)+RAD(additionl/1E6);
wahre_ekl_laenge:=ekl_laenge+dphi;
WINKEL2PI(ekl_laenge);
WINKEL2PI(wahre_ekl_laenge);
d:=0;
ekl_breite:=0;
for ii:=1 to MOONTABTERMS do
begin
d:=MoonTermsB[ii,5]*SIN(i*MoonTermsB[ii,1]+mas*MoonTermsB[ii,2]+mam*MoonTermsB[ii,3]+f*MoonTermsB[ii,4]);
if ABS(MoonTermsB[ii,2])=1 THEN d:=d*e;
if ABS(MoonTermsB[ii,2])=2 THEN d:=d*e*e;
ekl_breite:=ekl_breite+d;
end;
ekl_breite:=ekl_breite/1E6+additionb/1E6;
ekl_breite:=RAD(ekl_breite);
END; {GEOZ_EKL_KOORD}

PROCEDURE ELONGATION;
VAR rs,ent,rsm,laenge: REAL;
BEGIN
elw:=ACS(COS(wls-ekl_laenge)*COS(ekl_breite));
laenge:=wls-ekl_laenge;
IF laenge < 0 THEN laenge:=laenge+2*PI;
IF laenge >= PI THEN
BEGIN
IF inkey='1' THEN elo:='”stlich'
ELSE elo:='E';
END
ELSE
BEGIN
IF inkey='1' THEN elo:='westlich'
ELSE elo:='W';
END;
rs:=149598.022*(1-exzentrizitaet*exzentrizitaet)/(1+exzentrizitaet*COS(v));
ent:=entfernung/1000;
rsm:=SQRT(rs*rs+ent*ent-2*rs*ent*COS(elw));
phasenwinkel:=ACS((ent*ent+rsm*rsm-rs*rs)/(2*ent*rsm));
phase:=0.5*(1+COS(phasenwinkel))
END; {ELONGATION}

PROCEDURE GEOZ_AEQU_KOORD;
VAR u,sinq,cosq,g,h,xx,dra: REAL;
BEGIN
deklination:=ASN(SIN(wahre_ekl)*COS(ekl_breite)*SIN(wahre_ekl_laenge)+COS(wahre_ekl)*SIN(ekl_breite));
g:=COS(ekl_breite)*COS(wahre_ekl_laenge)/COS(deklination);
h:=(COS(wahre_ekl)*COS(ekl_breite)*SIN(wahre_ekl_laenge)-SIN(wahre_ekl)*SIN(ekl_breite))/COS(deklination);
IF h > 0 THEN rektaszension:=ACS(g)
ELSE rektaszension:=2*PI-ACS(g);
STERNZEIT(jahr,monat,tag,ut,ekliptikschiefe,dphi,DEG(geo_laenge),gmst,gast,last);
u:=ARCTAN(0.99664719*tan(geo_breite));
sinq:=0.99664719*SIN(u)+hh/6378140*SIN(geo_breite);
cosq:=cos(u)+hh/6378140*cos(geo_breite);
xx:=parallaxe;
dra:=ARCTAN((-cosq*SIN(xx)*SIN(last-rektaszension))/(COS(deklination)-cosq*SIN(xx)*COS(last-rektaszension)));
topra:=rektaszension+dra;
topde:=ARCTAN(((SIN(deklination)-sinq*SIN(xx))*COS(dra))/(COS(deklination)-cosq*SIN(xx)*COS(last-rektaszension)));
END; {GEOZ_AEQU_KOORD}

{$I PHYS_EPH.INC}

PROCEDURE AUSGABE1;
VAR n: WORD;
et:Real;
BEGIN
IF (lauf=1) AND (inkey='2') THEN BEGIN
CLRSCR;
Writeln('Von: ',jahr,'.',monat,'.',tag,' ',ut:2:4,' UT im Intervall: ',xx,' Min. Geo.Br.:',
DEG(geo_breite):3:2,' Geo.La.:',DEG(geo_laenge):3:2);
WRITELN('Datum UT RA(hms) DE(ø`") LA(ø) BR(ø) P(km) PA(ø) RADIUS');
WRITELN('___________________________________________________________________________');
IF drucker ='J' THEN BEGIN
Writeln(lst,'Von: ',jahr,'.',monat,'.',tag,' ',ut:2:4,' UT im Intervall: ',xx,' Min. Geo.Br.:',
DEG(geo_breite):3:2,' Geo.La.:',DEG(geo_laenge):3:2);
WRITELN(lst,'Datum UT RA(hms) DE(ø`") LA(ø) BR(ø) P(km) PA(ø) RADIUS');
WRITELN(lst,'________________________________________________________________________');
END;
END;
IF inkey='2' THEN BEGIN
deklination:=DEG(deklination);
rektaszension:=DEG(rektaszension/15);
rektaszension:=RW(rektaszension,'H');
deklination:=RW(deklination,'S');
wahre_ekl_laenge:=DEG(wahre_ekl_laenge);
ekl_breite:=DEG(ekl_breite);
parallaxe:=DEG(parallaxe)*3600;
radius:=DEG(radius)*60;
radius:=RW(radius,'M');
IF tag<10 THEN n:=2
ELSE n:=1;
IF lauf < 21 THEN GotoXY(n,lauf+4);
Write(tag,'.',monat);
IF drucker ='J' THEN BEGIN
IF n=2 THEN Write(lst,' ',tag,'.',monat);
IF n=1 THEN Write(lst,tag,'.',monat);
END;
et:=ut;
DEZ_DMS(et);
if et-int(et) > 0.5929 then et:=et-0.0030;
IF ut<10 THEN n:=8
ELSE n:=7;
IF lauf < 21 THEN GotoXY(n,lauf+4)
ELSE Write(' ');
Write(et:2:2,' | ');
IF drucker ='J' THEN BEGIN
IF n=8 THEN Write(lst,' ',et:2:2,' | ');
IF n=7 THEN Write(lst,et:2:2,' | ');
END;
IF rektaszension<10 THEN n:=16
ELSE n:=15;
IF lauf < 21 THEN GotoXY(n,lauf+4);
Write(rektaszension:3:5,' | ');
IF drucker ='J' THEN BEGIN
IF n=16 THEN Write(lst,' ',rektaszension:3:5,' | ');
IF n=15 THEN Write(lst,rektaszension:3:5,' | ');
END;
IF (deklination<10) AND (deklination>0) THEN n:=28;
IF (deklination>=10) OR ((deklination<0) AND (deklination>=-10)) THEN n:=27;
IF deklination<-10 THEN n:=26;
IF lauf < 21 THEN GotoXY(n,lauf+4);
Write(deklination:3:4,' | ');
IF drucker ='J' THEN BEGIN
IF n=28 THEN Write(lst,' ',deklination:3:4,' | ');
IF n=27 THEN Write(lst,' ',deklination:3:4,' | ');
IF n=26 THEN Write(lst,deklination:3:4,' | ')
END;
IF wahre_ekl_laenge < 10 THEN n:=39;
IF (wahre_ekl_laenge< 100) AND (wahre_ekl_laenge>=10) THEN n:=38;
IF wahre_ekl_laenge>=100 THEN n:=37;
IF lauf < 21 THEN GotoXY(n,lauf+4);
Write(wahre_ekl_laenge:4:2,' | ');
IF drucker ='J' THEN BEGIN
IF n=39 THEN Write(lst,' ',wahre_ekl_laenge:4:2,' |');
IF n=38 THEN Write(lst,' ',wahre_ekl_laenge:4:2,' |');
IF n=37 THEN Write(lst,wahre_ekl_laenge:4:2,' |');
END;
IF ekl_breite>0 THEN n:=47
ELSE n:=46;
IF lauf < 21 THEN GotoXY(n,lauf+4);
Write(ekl_breite:2:2,' | ',entfernung:6:0,' | ',parallaxe:4:0,' | ',radius:2:2);
IF drucker ='J' THEN BEGIN
IF n=47 THEN Write(lst,' ',ekl_breite:2:2,' | ',entfernung:6:0,' | ',parallaxe:4:0,' | ',radius:2:2);
IF n=46 THEN Write(lst,ekl_breite:2:2,' | ',entfernung:6:0,' | ',parallaxe:4:0,' | ',radius:2:2);
END;
IF lauf >= 20 THEN WriteLn;
IF drucker ='J' THEN WriteLn(lst);
END;
IF (lauf=1) AND (inkey='3') THEN BEGIN
CLRSCR;
Writeln('Von: ',jahr,'.',monat,'.',tag,' ',ut:2:4,' UT im Intervall: ',xx,' Min. Geo.Br.:',
DEG(geo_breite):3:2,' Geo.La.:',DEG(geo_laenge):3:2);
WRITELN('Datum UT PW(ø) L(ø) B(ø) CS(ø) BS(ø) k ELW(ø) Lgr(ø)');
WRITELN('________________________________________________________________________________');
IF drucker ='J' THEN BEGIN
Writeln(lst,'Von: ',jahr,'.',monat,'.',tag,' ',ut:2:4,' UT im Intervall: ',xx,' Min. Geo.Br.:',
DEG(geo_breite):3:2,' Geo.La.:',DEG(geo_laenge):3:2);
WRITELN(lst,'Datum UT PW(ø) L(ø) B(ø) CS(ø) BS(ø) k ELW(ø) Lgr(ø)');
WRITELN(lst,'____________________________________________________________________________');
END;
END;
IF inkey='3' THEN BEGIN
elw:=DEG(elw);
IF tag<10 THEN n:=2
ELSE n:=1;
IF lauf < 21 THEN GotoXY(n,lauf+4);
Write(tag,'.',monat);
IF drucker ='J' THEN BEGIN
IF n=2 THEN Write(lst,' ',tag,'.',monat)
ELSE Write(lst,tag,'.',monat);
END;
et:=ut;
DEZ_DMS(et);
if et-int(et) > 0.5929 then et:=et-0.0030;
IF ut<10 THEN n:=8
ELSE n:=7;
IF lauf < 21 THEN GotoXY(n,lauf+4)
ELSE Write(' ');
Write(et:2:2,' | ');
IF drucker ='J' THEN BEGIN
IF n=8 THEN Write(lst,' ',et:2:2,' | ')
ELSE Write(lst,et:2:2,' | ');
END;
IF pw < 10 THEN n:=17;
IF (pw< 100) AND (pw>=10) THEN n:=16;
IF pw>=100 THEN n:=15;
IF lauf < 21 THEN GotoXY(n,lauf+4);
Write(pw:2:2,' | ');
IF drucker ='J' THEN BEGIN
IF n=17 THEN Write(lst,' ',pw:2:2,' | ');
IF n=16 THEN Write(lst,' ',pw:2:2,' | ');
IF n=15 THEN Write(lst,pw:2:2,' | ')
END;
IF la>0 THEN n:=25
ELSE n:=24;
IF lauf < 21 THEN GotoXY(n,lauf+4);
Write(la:2:2,' | ');
IF drucker ='J' THEN BEGIN
IF n=25 THEN Write(lst,' ',la:2:2,' | ')
ELSE Write(lst,la:2:2,' | ');
END;
IF br>0 THEN n:=33
ELSE n:=32;
IF lauf < 21 THEN GotoXY(n,lauf+4);
Write(br:2:2,' | ');
IF drucker ='J' THEN BEGIN
IF n=33 THEN Write(lst,' ',br:2:2,' | ')
ELSE Write(lst,br:2:2,' | ');
END;
IF c0 < 10 THEN n:=42;
IF (c0< 100) AND (c0>=10) THEN n:=41;
IF c0>=100 THEN n:=40;
IF lauf < 21 THEN GotoXY(n,lauf+4);
Write(c0:2:2,' | ');
IF drucker ='J' THEN BEGIN
IF n=42 THEN Write(lst,' ',c0:2:2,' | ');
IF n=41 THEN Write(lst,' ',c0:2:2,' | ');
IF n=40 THEN Write(lst,c0:2:2,' | ')
END;
IF b0>0 THEN n:=50
ELSE n:=49;
IF lauf < 21 THEN GotoXY(n,lauf+4);
Write(b0:2:2,' | ',phase:1:2,' | ');
IF drucker ='J' THEN BEGIN
IF n=50 THEN Write(lst,' ',b0:2:2,' | ',phase:1:2,' | ')
ELSE Write(lst,b0:2:2,' | ',phase:1:2,' | ');
END;
IF elw <100 THEN n:=65;
IF elw>=100 THEN n:=64;
IF lauf < 21 THEN GotoXY(n,lauf+4);
Write(elw:2:0,' ',elo,' | ');
IF drucker ='J' THEN BEGIN
IF n=65 THEN Write(lst,' ',elw:2:0,' ',elo,' | ')
ELSE Write(lst,elw:2:0,' ',elo,' | ');
END;
IF lgr<=-10 THEN n:=72;
IF (lgr>10) OR ((lgr<0) AND (lgr>-10)) THEN n:=73;
IF (lgr>=0) AND (lgr<10) THEN n:=74;
IF lauf < 21 THEN GotoXY(n,lauf+4);
Write(lgr:2:1);
IF drucker ='J' THEN BEGIN
IF n=74 THEN Write(lst,' ',lgr:2:1);
IF n=73 THEN Write(lst,' ',lgr:2:1);
IF n=72 THEN Write(lst,lgr:2:1)
END;
IF lauf >= 20 THEN WriteLn;
IF drucker ='J' THEN WriteLn(lst);
END;
END; {AUSGABE1}

PROCEDURE AUSGABE;
BEGIN
CLRSCR;
ekl_laenge:=DEG(ekl_laenge);
wahre_ekl_laenge:=DEG(wahre_ekl_laenge);
ekl_breite:=DEG(ekl_breite);
parallaxe:=DEG(parallaxe)*3600;
elw:=DEG(elw);
phasenwinkel:=DEG(phasenwinkel);
WRITELN('Ephemeriden des Mondes am ',tag,'.',monat,'.',jahr,' um ',mez:2:4,' MEZ');
WRITE('Geographische L„nge: ', ABS (DEG(geo_laenge)):3:2);
IF geo_laenge < 0 THEN WRITE(' ”stlich')
ELSE WRITE(' westlich');
WRITE(' Breite: ',DEG(geo_breite):3:2,' H”he ber NN: ',hh:5);
WRITELN;
WRITELN('Wahre geozentrische ekliptikale Koordinaten:');
WRITELN('Ekliptikale L„nge: ',ekl_laenge:3:4,'ø',' Ekliptikale Breite: ',ekl_breite:2:4,'ø');
WRITELN('Parallaxe ("): ',parallaxe:4:1,' Erdentfernung (km): ',entfernung:6:0);
WRITE('Scheinbarer Radius: ');
WriteDMS(radius,5);
WriteLn;
WRITELN('Scheinbare Koordinaten:');
WRITELN('Ekliptikale L„nge: ',wahre_ekl_laenge:3:4,'ø');
WRITE('Rektaszension: ');
WriteHMS(rektaszension,5);
Write(' Deklination: ');
WriteDMS(deklination,4);
WriteLn;
WRITELN('Scheinbare topozentrische „quatoriale Koordinaten:');
WRITE('Rektaszension: ');
WriteHMS(topra,5);
Write(' Deklination: ');
WriteDMS(topde,4);
WriteLn;
WRITELN('Lage der Rotationsachse und des Zentralmeridians des Mondes.');
WRITELN('Positionswinkel: ',pw:3:2,'ø L„nge: ',la:2:2,'ø Breite: ',br:2:2,'ø');
WRITELN('Elongation: ',elw:3:1,'ø ',elo,' Phasenwinkel: ',phasenwinkel:3:1,'ø');
WriteLn('Beleuchtung: ',phase:1:2,' Lichtgrenze: ',lgr:3:1,'ø');
Writeln('Selenografische Koordinaten des Mondes:');
WRITELN('L„nge: ',l0:3:2,'ø Breite: ',b0:3:2,'ø ',' Co-L„nge: ',c0:3:2,'ø');
jahre:=jahr;
monate:=monat;
tage:=tag;
utt:=ut;
WRITELN('Daten fr die n„chstgelegenen Apsiden:');
JD_DATUM(jdep, jahr, monat, tag, ut);
WRITELN('Perig„um: ',jahr,':',monat,':',tag,' um ',ut:2:0,' ET',' Parallaxe("): ',pp:5:3,' Entfernung: ',entp:6:0,' km');
JD_DATUM(jdea, jahr, monat, tag, ut);
WRITELN('Apog„um : ',jahr,':',monat,':',tag,' um ',ut:2:0,' ET',' Parallaxe("): ',pa:5:3,' Entfernung: ',enta:6:0,' km');
Writeln('Daten fr die n„chstgelegenen Knotendurchg„ng:');
JD_DATUM(jde1, jahr, monat, tag, ut);
Writeln('Aufsteigender Knoten: ',jahr,':',monat,':',tag,' um ',ut:2:2,' ET');
JD_DATUM(jde2, jahr, monat, tag, ut);
Writeln('Absteigender Knoten: ',jahr,':',monat,':',tag,' um ',ut:2:2,' ET');
jahr:=jahre;
monat:=monate;
tag:=tage;
ut:=utt;
END; {AUSGABE}

{$I MOONP.INC}

BEGIN {MONDBAHN}
DATUMEINGABE;
IF inkey='1' THEN
BEGIN
INSTALLATION;
GEOZ_EKL_KOORD;
PARALLAXE_ENTFERNUNG;
ELONGATION;
GEOZ_AEQU_KOORD;
PHYS_EPHEM;
monats:=monat;
APSIDEN(monats);
Knoten;
AUSGABE;
DURCHGANG;
END
ELSE
BEGIN
IF drucker = 'J' THEN laufv:=31
ELSE laufv:=20;
FOR lauf:=1 TO laufv DO
BEGIN
INSTALLATION;
GEOZ_EKL_KOORD;
PARALLAXE_ENTFERNUNG;
ELONGATION;
GEOZ_AEQU_KOORD;
PHYS_EPHEM;
AUSGABE1;
ut:=ut+xx/60;
IF ut>=24 THEN BEGIN ut:=ut-24; tag:=tag+1 END;
PRUEF_DATUM(tag,monat,jahr);
DATUM_JD(jahr, monat, tag, 0, jd0);
t0:=(jd0-2451545)/36525;
t:=t0+(ut/24+dt/86400)/36525;
END;
END;
BITTE_TASTE
END; {MONDBAHN}

PROCEDURE MONDPHASEN; {Berechnet die Mondphasen fr ein Jahr.}
VAR sp,ze: WORD;
k: LONGINT;
a,b,jde1,jde2,x,d,e,u,s,z,v,r,t,m,n,f,h,w,z0,rho: REAL;
start: BOOLEAN;

PROCEDURE MPH_INI;
VAR i: integer;
BEGIN
CLRSCR;
u:=0;
ze:=5;
jahr:=-1000;
WRITELN('Bitte geben Sie das Jahr ein ...');
WRITE('Jahr:');
WHILE (jahr < -999) OR (jahr > 4999) DO
READINTEGER(jahr,4,6,2);
WRITELN;
drucker:=' ';
Write('Ausgabe auf dem Drucker J/N ?');
WHILE (drucker <> 'J') AND (drucker <> 'N') DO
BEGIN
GotoXY(30,3);
ClrEol;
Read(drucker);
drucker:=UPCASE(drucker);
END;
DELTA(jahr,dt);
CLRSCR;
TextColor(RED);
TextBackGround(WHITE);
GotoXY(35,1);
WRITELN(jahr);
WRITELN;
IF drucker='J' THEN BEGIN
WriteLn(lst,' ',jahr);
WriteLn(lst);
END;
TextColor(LIGHTGRAY);
TextBackGround(BLACK);
WRITELN('NEUMOMD ERSTES VIERTEL VOLLMOND LETZTES VIERTEL');
WRITELN('_____________________________________________________________________');
IF drucker ='J' THEN BEGIN
WRITELN(lst,'NEUMOMD ERSTES VIERTEL VOLLMOND LETZTES VIERTEL');
WRITELN(lst,'_____________________________________________________________________');
END;
END; {MPH_INI}

{Wandelt das Julianische Datum in das Brgerliche um.}
PROCEDURE JD_DATUM(jj: REAL; sp,ze: WORD);
VAR a,c,uhrzeit: REAL;
f,ja,mon,ta,d,e,b: LONGINT;
mo : STRING[3];
uhr: STRING[7];
tage: STRING[2];

PROCEDURE AUSWAHL_MONAT(zz: INTEGER);
BEGIN
CASE zz OF
1 : mo:='JAN';
2 : mo:='FEB';
3 : mo:='MŽR';
4 : mo:='APR';
5 : mo:='MAI';
6 : mo:='JUN';
7 : mo:='JUL';
8 : mo:='AUG';
9 : mo:='SEP';
10 : mo:='OKT';
11 : mo:='NOV';
12 : mo:='DEZ';
END {CASE}
END; {AUSWAHL_MONAT}

BEGIN {JD_DATUM}
a:=INT(jj+0.5);
IF a < 2299161 THEN c:=a+1524
ELSE
BEGIN
b:=TRUNC((a-1867216.25)/36524.25);
c:=a+b-TRUNC(b/4)+1525
END;
d:=TRUNC((c-122.1)/365.25);
e:=TRUNC(365.25*d);
f:=TRUNC((c-e)/30.6001);
ta:=TRUNC(c-e-INT(30.6001*f));
mon:=f-1-12*TRUNC(f/14);
ja:=d-4715-TRUNC((7+mon)/10);
uhrzeit:=24*FRAC(jj+0.5);
Uhrzeit24(uhrzeit);
uhrzeit:=RW(uhrzeit,'S');
STR(uhrzeit:2:4,uhr);
IF uhrzeit<10 THEN uhr:=' '+uhr;
STR(ta,tage);
IF ta<10 THEN tage:=' '+tage;
IF ja = jahr THEN
BEGIN
AUSWAHL_MONAT(mon);
GotoXY(sp,ze);
WRITE(mo,',',tage,'. ',uhr);
IF drucker='J' THEN BEGIN
IF start THEN BEGIN
IF sp=19 THEN WRITE(lst,' ');
IF sp=37 THEN WRITE(lst,' ');
IF sp=55 THEN WRITE(lst,' ');
start:=False;
END; {IF start}
WRITE(lst,mo,',',tage,'. ',uhr,' ');
IF sp=55 THEN WriteLn(lst);
END; {If drucker='J'}
END; {IF ja=jahr}
END; {JD_DATUM}

PROCEDURE MPH_BERECHNUNG;
VAR i,j,xx: Integer;
wert: Array[0..2] of REAL;
ww: real;
BEGIN
start:=True;
k:=GANZZAHL((jahr-2000)*12.3685);
a:=k;
FOR i:=0 TO 54 DO
BEGIN
f:=0;
for j:=0 to 2 do
wert[j]:=0;
t:=a/1236.85;
jde1:=2451550.09765+29.530588853*a+0.0001337*t*t-0.00000015*t*t*t+0.00000000073*t*t*t*t;
m:= 2.5534+ 29.10535669*a-0.0000218*t*t-0.00000011*t*t*t;
n:=201.5643+385.81693528*a+0.1017438*t*t+0.00001239*t*t*t-0.000000058*t*t*t*t;
b:=160.7108+390.67050274*a-0.0016341*t*t-0.00000227*t*t*t+0.000000011*t*t*t*t;
rho:=124.7746-1.5637558*a +0.0020691*t*t+0.00000215*t*t*t;
e:=1-0.002516*t-0.0000074*t*t;
m:=RAD(m); n:=RAD(n); b:=RAD(b); rho:=RAD(rho);
IF (u=0) OR (u=2) THEN
BEGIN
IF u=0 THEN xx:=0;
IF u=2 THEN xx:=1;
for j:=1 to 25 do
begin
wert[xx]:=MoonPhaseCoeffTab[j,xx]*SIN(MoonPhaseAngleTab[j,0]*m+MoonPhaseAngleTab[j,1]*n+MoonPhaseAngleTab[j,2]*b);
IF (MoonPhaseAngleTab[j,0] = 1) AND
(ABS(MoonPhaseCoeffTab[j,xx]) > 0.0002) THEN wert[xx]:=wert[xx]*e;
IF (MoonPhaseAngleTab[j,0] = 2) AND
(ABS(MoonPhaseCoeffTab[j,xx]) > 0.0002) THEN wert[xx]:=wert[xx]*e*e;
f:=f+wert[xx];
end;
END
ELSE
BEGIN
for j:=1 to 25 do
begin
wert[2]:=MoonPhaseCoeffTab[j,2]*SIN(MoonPhaseAngleTab[j,0]*m+MoonPhaseAngleTab[j,1]*n+MoonPhaseAngleTab[j,2]*b);
IF MoonPhaseAngleTab[j,0] = 1 THEN wert[2]:=wert[2]*e;
IF MoonPhaseAngleTab[j,0] = 2 THEN wert[2]:=wert[2]*e*e;
f:=f+wert[2];
end;
ww:=0.00306-0.00038*e*cos(m)+0.00026*COS(n)-0.00002*cos(n-m)+0.00002*cos(n+m)+0.00002*cos(2*b);
IF u=1 THEN f:=f+ww;
IF u=3 THEN f:=f-ww;
END;
ww:=0;
for j:=1 to 14 do
ww:=ww+MoonPhaseExtra[j,2]*SIN(RAD(MoonPhaseExtra[j,0]+MoonPhaseExtra[j,1]*a));
ww:=ww-0.00017*SIN(rho);
jde1:=jde1+f+ww+1/24-dt/86400;
IF u = 0 THEN sp:=1;
IF u = 1 THEN sp:=19;
IF u = 2 THEN sp:=37;
IF u = 3 THEN sp:=55;
JD_DATUM(jde1,sp,ze);
u:=u+1;
IF u = 4 THEN
BEGIN
u:=0; ze:=ze+1
END;
a:=a+0.25;
END {FOR}
END; {MPH_BERECHNUNG}

BEGIN {MONDPHASEN}
MPH_INI;
MPH_BERECHNUNG;
Writeln;
Writeln;
BITTE_TASTE;
END; {MONDPHASEN}

Procedure Mondapsiden;
VAR jahrn,n,zeile,flag: INTEGER;
BEGIN
CLRSCR;
zeile:=8;
flag:=0;
jahr:=-1000;
monats:=0.5;
WRITELN('Bitte geben Sie das Jahr ein ...');
WRITE('Jahr:');
WHILE (jahr < -999) OR (jahr > 4999) DO
READINTEGER(jahr,4,6,2);
WRITELN;
drucker:=' ';
Write('Ausgabe auf dem Drucker J/N ?');
WHILE (drucker <> 'J') AND (drucker <> 'N') DO
BEGIN
GotoXY(30,3);
ClrEol;
Read(drucker);
drucker:=UPCASE(drucker);
END;
DELTA(jahr,dt);
WriteLn;
WRITELN('Perig„um Apog„um');
Writeln('Datum h km Datum h km');
WRITELN('______________________________________');
IF drucker ='J' THEN BEGIN
Writeln(lst,' ',jahr);
Writeln(lst);
WRITELN(lst,'Perig„um Apog„um');
Writeln(lst,'Datum h km Datum h km');
WRITELN(lst,'______________________________________');
END;
REPEAT
Apsiden(monats);
JD_DATUM(jdep, jahrn, monat, tag, ut);
IF (monat< 10) And (tag< 10) then n:=1;
IF (monat< 10) And (tag>=10) then n:=2;
IF (monat>=10) And (tag< 10) then n:=3;
IF (monat>=10) And (tag>=10) then n:=4;
IF (zeile = 8) And (jahrn<>jahr) then flag:=1;
IF (jahrn=jahr) AND (n=1) THEN Write(' ',monat,' ',tag,' ',ut:2:0,' ',entp:6:0);
IF (jahrn=jahr) AND (n=2) THEN Write(' ',monat,' ',tag,' ',ut:2:0,' ',entp:6:0);
IF (jahrn=jahr) AND (n=3) THEN Write(monat,' ',tag,' ',ut:2:0,' ',entp:6:0);
IF (jahrn=jahr) AND (n=4) THEN Write(monat,' ',tag,' ',ut:2:0,' ',entp:6:0);
IF drucker = 'J' THEN BEGIN
IF flag = 1 THEN Write(' ');
IF (jahrn=jahr) AND (n=1) THEN Write(lst,' ',monat,' ',tag,' ',ut:2:0,' ',entp:6:0);
IF (jahrn=jahr) AND (n=2) THEN Write(lst,' ',monat,' ',tag,' ',ut:2:0,' ',entp:6:0);
IF (jahrn=jahr) AND (n=3) THEN Write(lst,monat,' ',tag,' ',ut:2:0,' ',entp:6:0);
IF (jahrn=jahr) AND (n=4) THEN Write(lst,monat,' ',tag,' ',ut:2:0,' ',entp:6:0);
END;
JD_DATUM(jdea, jahrn, monat, tag, ut);
IF (monat< 10) And (tag< 10) then n:=1;
IF (monat< 10) And (tag>=10) then n:=2;
IF (monat>=10) And (tag< 10) then n:=3;
IF (monat>=10) And (tag>=10) then n:=4;
GotoXY(22,zeile);
IF (jahrn=jahr) AND (n=1) THEN WriteLn(' ',monat,' ',tag,' ',ut:2:0,' ',enta:6:0);
IF (jahrn=jahr) AND (n=2) THEN WriteLn(' ',monat,' ',tag,' ',ut:2:0,' ',enta:6:0);
IF (jahrn=jahr) AND (n=3) THEN WriteLn(monat,' ',tag,' ',ut:2:0,' ',enta:6:0);
IF (jahrn=jahr) AND (n=4) THEN WriteLn(monat,' ',tag,' ',ut:2:0,' ',enta:6:0);
IF drucker = 'J' THEN BEGIN
IF (jahrn=jahr) AND (n=1) THEN WriteLn(lst,' ',monat,' ',tag,' ',ut:2:0,' ',enta:6:0);
IF (jahrn=jahr) AND (n=2) THEN WriteLn(lst,' ',monat,' ',tag,' ',ut:2:0,' ',enta:6:0);
IF (jahrn=jahr) AND (n=3) THEN WriteLn(lst,' ',monat,' ',tag,' ',ut:2:0,' ',enta:6:0);
IF (jahrn=jahr) AND (n=4) THEN WriteLn(lst,' ',monat,' ',tag,' ',ut:2:0,' ',enta:6:0);
END;
monats:=monats+0.9;
INC(zeile);
flag:=0;
UNTIL (monats>13);
WriteLn;
WriteLn('Zeiten in ET');
IF drucker = 'J' THEN BEGIN
WriteLn(lst);
WriteLn(lst,'Zeiten in ET');
END;
Bitte_Taste;
END;

BEGIN {HAUPTPROGRAMM}
REPEAT
CLRSCR;
WRITELN('KOORDINATEN UND PHYSISCHE EPHEMERIDEN ....1');
WRITELN('20 EPHEMERIDEN DES MONDES ................2');
WRITELN('20 PHYSISHE EPHEMERIDEN DES MONDES .......3');
WRITELN('MONDPHASEN ...............................4');
WRITELN('MONDAPSIDEN...............................5');
WRITELN('ERLŽUTERUNGEN.............................B');
WRITELN('BEENDEN ...........................<ESC>, E');
WRITELN;
WRITELN;
WRITE('BITTE WŽHLEN SIE ...');
inkey:=UPCASE(READKEY);
ClrScr;
IF inkey = 'B' THEN ERLAEUTERUNG;
IF (inkey = '1') OR (inkey = '2') OR (inkey= '3') THEN MONDBAHN;
If inkey = '4' THEN MONDPHASEN;
If inkey = '5' THEN Mondapsiden;
UNTIL inkey IN ['E',#27]
END.
_________________________
http://lotharsinger.npage.de/astro-home.html

8" f/6 Dobson
Okulare: 12mm Nagler T4, 8mm Ethos, 4,5mm Morpheus

[zum Seitenanfang]
peterm Offline
Mitglied

Registriert: 08/11/2004
Beiträge: 318
#328803 - 12/07/2006 13:02 Re: Mondphasen - Berechnung [Re: Norbert_G]


Hallo Norbert,

ich wuerde folgende Zeilen veraender:
62 FOR K9=0 TO 56
64 J=J0+7*K9: F=F0+0.765294*K9*0.5
66 K=K9/4
...
86 IF U=1 THEN PRINT "1.HALF MOON";
87 IF U=2 THEN PRINT "FULL MOON";
88 IF U=3 THEN PRINT "2.HALF MOON";
89 PRINT J;F
90 U=U+1:IF U=4 THEN U=0

Kann sein, dass das breits funktioniert, muss aber nicht.
Probiers mal aus und berichte.

Peter
_________________________
.

[zum Seitenanfang]
h_c_greier Offline
Mitglied

Registriert: 28/12/2003
Beiträge: 565
Ort: Graz, Austria
#328804 - 12/07/2006 13:18 Re: Mondphasen - Berechnung [Re: Lots]


Hi Lots,

Frage1: Nach welcher Vorlage hast du das geproggt? (Literatur)

Anyway, feine Sache, aber ich glaub wenn da was von Interesse ist ists möglicherweise die "PROCEDURE MPH_BERECHNUNG".

Frage2: könntest du mal mit deiner Procedur für einen Testzeitraum (zB. Juli/August 2006) die Mondphasen-Daten berechnen und reinposten, würde mich interessieren, was dein Script so ausspuckt....

Frage3: Kann man das Script irgendwo "in Aktion" sehen?

Was mir aufgefallen ist: Dein Script verwendet "externe" Units, das nützt dem Anwender aber nix, wenn er die nicht zur Verfügung hat, oder?

greets,
harald

--
_________________________
www.parallax.at

[zum Seitenanfang]
Norbert_G Offline
Mitglied

Registriert: 26/09/2004
Beiträge: 9
#328805 - 12/07/2006 20:49 Re: Mondphasen - Berechnung [Re: Norbert_G]


Hallo zusammen!

Erstmal vielen Dank für Eure schnellen und umfangreichen Antworten!

Da die Antwort von Peter die mit Abstand am leichtesten zu Realisierende war, habe ich damit mal angefangen. Leider passt das Ergebnis noch nicht. Siehe Beispiel

Mondphase Datum Programm Uhrzeit Programm Datum/Uhrzeit Amtl. Veröffentlichung
Neumond 09.01.1997 04.25 UTC 04.26 UTC
Erstes Viertel 16.01.1997 01.07 UTC 15.01. / 20.02 UTC
Vollmond 23.01.1997 15.11 UTC 15.11 UTC
Letztes Viertel 31.01.1997 14.32 UTC 19.40 UTC
Neumond 07.02.1997 15.05 UTC 15.06 UTC
Erstes Viertel 14.02.1997 14.26 UTC 08.57 UTC
Vollmond 22.02.1997 10.25 UTC 10.27 UTC
Letztes Viertel 02.03.1997 04.26 UTC 09.37 UTC
Neumond 09.03.1997 01.14 UTC 01.15 UTC

Nach der Programmänderung, so wie Peter sie vorgeschlagen hat, bleiben die Ergebnisse für Neu- und Vollmond weiter korrekt. Nur die Ergebnisse für erstes / letztes Viertel weichen stark ab.
Die mögliche Lösung von Harald (erste Antwort) habe ich noch nicht nachvollziehen können, sieht aber auch recht vielversprechend aus.

Wäre super, wenn Ihr da noch mal einen Blick drauf werfen würdet.

Besten Dank im voraus!

Norbert

[zum Seitenanfang]
h_c_greier Offline
Mitglied

Registriert: 28/12/2003
Beiträge: 565
Ort: Graz, Austria
#328806 - 12/07/2006 23:39 Re: Mondphasen - Berechnung [Re: Norbert_G]


Hi Norbert,

Zitat:

Nach der Programmänderung, so wie Peter sie vorgeschlagen hat, bleiben die Ergebnisse für Neu- und Vollmond weiter korrekt. Nur die Ergebnisse für erstes / letztes Viertel weichen stark ab.




Das wundert mich nicht, weil ja nur die Variable abgeändert wurde, ohne zu berücksichtigen, dass der Algorithmus für die Viertelphasen ganz andere Reihenterme hat.

Zitat:

Die mögliche Lösung von Harald (erste Antwort) habe ich noch nicht nachvollziehen können, sieht aber auch recht vielversprechend aus.




Ich denke alles was du tun musst ist den geposteten "Pseudocode" in ein BASIC programm zu stopfen. Ich kann dir leider nicht mit einem fertigen BASIC-Code dienen, es ist zu lange her, dass ich das mal in der Schule "gelernt" habe.
Und ich mag mich da jetzt ehrlich gesagt da nicht durchwühlen...

greets,
harald

--
_________________________
www.parallax.at

[zum Seitenanfang]
h_c_greier Offline
Mitglied

Registriert: 28/12/2003
Beiträge: 565
Ort: Graz, Austria
#328807 - 13/07/2006 02:23 Re: Mondphasen - Berechnung [Re: h_c_greier]


Ähhhm...übrigens:

Kann mir wer einen Basic-Compiler für WIN empfehlen, der zB. das Mondphasen-Programm von Norbert (siehe oben) in eine EXE kompiliert? Würde mich interessieren, zu Testzwecken


greets,
harald
_________________________
www.parallax.at

[zum Seitenanfang]
Lots Offline
Mitglied

Registriert: 19/08/2002
Beiträge: 4928
Ort: Darmstadt 8° 39' Ost, +49° 52...
#328808 - 17/07/2006 09:53 Re: Mondphasen - Berechnung [Re: h_c_greier]


Hi,

war glaub ich Oliver Montenbruck, Ephemeriedenechnung.

hier kannst du das Proggi runter laden.

für Juli/August 2006 spuckt es folgendes aus Zeiten in MEZ und Std. + Min:

Erstes Viertel: Jul 3, 17:36; Aug 2, 9:45; Aug 31, 23:56
Letztes Viertel: Jul 17, 20:12; Aug 16 2:50

Die Daten sind fast auf die Sekunde genau!

Gruß

Lots
_________________________
http://lotharsinger.npage.de/astro-home.html

8" f/6 Dobson
Okulare: 12mm Nagler T4, 8mm Ethos, 4,5mm Morpheus

[zum Seitenanfang]
Norbert_G Offline
Mitglied

Registriert: 26/09/2004
Beiträge: 9
#328809 - 17/07/2006 19:27 Re: Mondphasen - Berechnung [Re: Norbert_G]


Hallo zusammen!

Komme leider erst jetzt dazu, mich bei Euch für die großartige Hilfe zu bedanken!!

Den “Pseudocode“ von Harald konnte ich recht problemlos auf meinen Taschenrechner übertragen und die Ergebnisse entsprechen exakt dem Wünschenswerten.
Also, nochmals besten Dank für die Hilfe!
So wie Harald ja schon in seinem Beitrag beschrieben, erhöhe ich den Wert “K“ nach jeder Schleife um 0,5, beginnend mit (Phase) 0,25. Somit bekomme ich fortlaufend die Daten für erstes Viertel, letztes Viertel, erstes Viertel . . .
Ein Problem, sorry, habe ich aber immer noch. In dem von mir aufgezeigtem Programm (Neu-/Vollmond) gebe ich ein Datum vor und das Programm bestimmt den letzten Neumond vor diesem Tag. Das Programm von Harald hingegen bestimmt immer das Erste Viertel des Mondes nach dem angegebenen Datum.
Leider sind meine Versuche, die Zeilen zu deuten, in denen K bzw. K0 berechnet wird, bisher fehlgeschlagen.
Mein Ziel wäre es, einen gemeinsamen Startpunkt vor dem eingegebenen Datum zu finden (so wie in dem BASIC-Programm), sodass dann die Ausgabe “quasi synchron“ ist. Neumond, darauf folgendes Erstes Viertel, Vollmond, folgendes Letztes Viertel, Neumond . . .usw.

Es wäre wirklich ganz toll, wenn mir da noch mal jemand helfen könnte!
Mit bestem Dank im voraus grüßt Euch

Norbert

[zum Seitenanfang]
h_c_greier Offline
Mitglied

Registriert: 28/12/2003
Beiträge: 565
Ort: Graz, Austria
#328810 - 17/07/2006 21:53 Re: Mondphasen - Berechnung [Re: Norbert_G]


Hallo Norbert,

Du müsstest sozusagen den selben Wert K als Start der Berechnung für die "ganzen" Phasen und die "Viertel" Phasen zuerst feststellen.

Das Original von Sinnott rechnet (leider) noch mit Werten, die nicht für das J2000 gelten. Ich denke die Korrekturterme sind aus Meeus' "...Calculators" entnommen.
Mein Pseudocode ist auf J2000 angepasst (mit den Angaben aus Meuus' "Astronomical Algorithms").
Man müsste entweder:

(a) schauen, welches K vom Code 1 einem K0 des 2. Codes entspricht, und das berücksichtigen, oder
(b) den Originalcode auf die neueren Werte anpassen/umschreiben

Letzteres ist allerdings nicht so ganz einfach, weil ich ehrlich gesagt ein paar Zeilen in Sinnotts Code nicht ganz kapiere:

38 M0=K0*0.08084821133
oder
46 M1=K0*0.07171366128

zB. ist sowas. Ich verstehe nicht, wo diese Multiplikatoren herkommen?
Des Weiteren unterscheidet Meeus für Neu- und Vollmond die Korrekturterme, was beim alten Script nicht der Fall ist, dort werden für beide Phasen die selben Korrekturen verwendet.


Egal, ich versuchs mal und gebe dir (wieder im "Pseudocode") die aktuellen Terme für Neu/Vollmond hier an:

Code:

// ============================================================
// Angaben:
// Phasen: phase = 0 für Neumond
// phase = 0.5 für Vollmond
// Für Werte anders als 0. oder 0.5 ist nachstehender
// Script ungültig.
// Angabe des Zeitpunktes als Fließkomma-Jahreszehl
// Bsp.: 1.8.2006 = ca. 2006.581
//
// Rückgabe: JDE
// ============================================================
//
// ----- BEGIN PSEUDOCODE -----
//
year = 2006.5;
phase = 0;
//
//
//
rads = 3.14159265359/180;
k = floor((year-2000)*12.3685)+phase;
// Mittlerer JDE Wert des Ereignisses
// Terme in T werden hier vernachlässigt, weil der größte
// Term etwa 0.00015437*T^2 beträgt.
// T müsste also auf etwa ±2.5 anwachsen (2000±250 Jahre)
// damit der größte T-Term 0.001 erreicht.
JDE = 2451550.09766+29.530588861*k;
// Relevante Winkelwerte in [Radiant]
// ACHTUNG: Wenn die Winkel für den später verwendeten Sinus
// in Grad [°] benötigt werden, einfach die Multiplikation
// mit "rads" weglassen!
M = (2.5534+29.10535670*k)*rads;
Ms = (201.5643+385.81693528*k)*rads;
F = (160.7108+390.67050284*k)*rads;
//
//
if (phase == 0) {
// Korrekturterme JDE für Neumond
JDE += -0.40720*Sin(Ms);
JDE += 0.17241*Sin(M);
JDE += 0.01608*Sin(2*Ms);
JDE += 0.01039*Sin(2*F);
JDE += 0.00739*Sin(Ms-M);
JDE += -0.00514*Sin(Ms+M);
JDE += 0.00208*Sin(2*M);
JDE += -0.00111*Sin(Ms-2*F);
} else {
// Korrekturterme JDE für Vollmond
JDE += -0.40614*Sin(Ms);
JDE += 0.17302*Sin(M);
JDE += 0.01614*Sin(2*Ms);
JDE += 0.01043*Sin(2*F);
JDE += 0.00734*Sin(Ms-M);
JDE += -0.00515*Sin(Ms+M);
JDE += 0.00209*Sin(2*M);
JDE += -0.00111*Sin(Ms-2*F);
}
//
//
return JDE;
//
// ----- END PSEUDOCODE -----
//



Das ganze jetzt in eine Schleife und phase immer um 0.5 hochzählen, dann erhält man abwechselnd das JDE für Neumond-Vollmond-Neumond-......
Vielleicht kannst du ja auch diesen Code mit jemem für die Viertel-Phasen noch kombinieren, dann hast du alle Ergebnisse chronologisch. Dann müsste man natürlich um 0.25 hochzählen.
Die Abweichungen des Scripts von den genauen Werten sollten sich für J2000±50 Jahre innerhalb maximal einiger Minuten bewegen.

BTW: Wenn du das für deinen Taschenrechner angepasst hast, poste doch mal deinen Code hier, ich habe auch einen programmierbaren TR und möchte mein Glück mal versuchen


greets,
harald

--
_________________________
www.parallax.at

[zum Seitenanfang]
Norbert_G Offline
Mitglied

Registriert: 26/09/2004
Beiträge: 9
#328811 - 19/07/2006 18:10 Re: Mondphasen - Berechnung [Re: Norbert_G]


Hallo Harald!

Abermals besten Dank für die kompetente Hilfe!!!
Dein Pseudocode funktioniert auch für die Berechnung von Voll- und Neumond und mit der einheitlichen Definition von der Variablen K1 passt jetzt alles zusammen.
Ich habe K1 aber noch ein wenig kleiner gesetzt (ca. 5 Tage), damit das Programm mit dem früheren Neumond beginnt, wenn ich z.B. als Startdatum ein Tag vor einem Neumond vorgebe.
Ich habe Dir, wie von Dir gewünscht, mal meinen Code kopiert. Ist gar nicht so einfach gewesen, das Programm aus dem Gesamtkonzept heraus zu filtern. Daher erscheinen manche Programmierschritte auch ein wenig wie, “von hinten durch die Brust ins Auge“ ;-)
Das Programm ist so lauffähig auf meinem Sharp Taschenrechner mit 4 x 40 Zeichen Display. Gestartet wird mit RUN und Enter.
Mit Zeile 550 bin ich nicht ganz zufrieden (Ermittlung von Y). Man müsste genau den Tag des Jahres ermitteln können und dann durch 365,25 teilen, wäre sicher genauer. Aber da es ja nur um das Startdatum geht, kann ich auch mit dem jetzigen Ergebnis leben.
Sollten Dir Fehler oder Verbesserungen in meinem Listing auffallen, wäre ich für jeden Hinweis dankbar!

In dem Sinn, nochmals besten Dank

Norbert

10 GOTO 460
20 BEEP 1
30 IF INKEY$ ="" THEN 30
40 RETURN
50 '
60 LOCATE 0,1:GOSUB 90:LOCATE 0,1:RETURN
70 LOCATE 0,2:GOSUB 90:LOCATE 0,2:RETURN
80 LOCATE 0,3:GOSUB 90:LOCATE 0,3:RETURN
90 PRINT " ":RETURN
100 '
110 REM FEHL-EINGABE
120 GOSUB 80:GOSUB 130:LOCATE 0,3:RETURN
130 PRINT " FEHLER BEI EINGABE ! "
140 BEEP 1,10,70:FOR XX= 1 TO 100:NEXT XX
150 BEEP 1,10,70:FOR XX= 1 TO 100:NEXT XX
160 BEEP 1,10,70:FOR XX= 1 TO 500:NEXT XX:RETURN
170 '
180 REM WANDLE STD.dez IN HH.MM
190 MH=INT W1:MM=INT ((W1-INT W1)*60+0.5)
200 IF MM=60 THEN MM=0:MH=MH+1
210 IF MH=24 THEN MH=MH-24
220 W2=MH+(MM/100):RETURN
230 '
240 REM WANDLE MODIFIZIERTES JULJANISCHES DATUM IN KALENDAR
250 JD=(INT JDZ)+2400001
260 WO=INT (JD):WO=WO-INT (WO/7)*7+1
270 IF WO=7 THEN WO=WO-7
280 A1=INT ((JD/36524.25)-51.12264)
290 A=JD+1+A1-INT (A1/4)
300 B=A+1524
310 C=INT ((B/365.25)-0.3343)
320 JT=INT (365.25*C)
330 E=INT ((B-JT)/30.61)
340 JT=B-JT-INT (30.61*E)
350 JM=E-1: JR=C-4716
360 IF E>13.5 THEN JM=JM-12
370 IF JM<2.5 THEN JR=JR+1
380 RETURN
390 N0=JT:GOSUB 420:PRINT STRI$;
400 N0=JM:GOSUB 420:PRINT USING "&####";STRI$;JR;:RETURN
410 '
420 IF N0<10 THEN PRINT USING "0#";N0;:GOTO 440
430 PRINT USING "##";N0;
440 RETURN
450 '
460 REM
470 REM * MONDPHASEN
480 REM
490 STRI$=CHR$ (45)
500 CLS :PRINT " *** Berechnung der MONDPHASEN ***":PRINT "optional: Bestimmung des 'Alters der Gezeit'":PRINT " (Spring-, Mitt-, Nipptide)":GOSUB 30
510 GOSUB 80:GOSUB 70:GOSUB 60
520 INPUT "Tag [1 - 31] = ";D
530 INPUT "Monat [1 - 12] = ";MO
540 INPUT "Jahr [4-stellig] = ";YY
550 Y=YY+((MO-1)/12)+D/365
560 H$="N":INPUT "nur die Mondphasen berech. [J/N] = ";H$
570 IF H$="J" OR H$="j" THEN H1=1:GOTO 750
580 '
590 CLS :H1=0:PRINT " > Alter der Gezeit <":PRINT ""
600 PRINT "Spring - Verspaetung"
610 SPV=0:INPUT "fuer den Bezugsort [dd.hh] = ";SPV
620 SPVD=INT SPV+((SPV-INT SPV)*100/24)
630 IF (SPV-INT SPV)>0.23 THEN GOSUB 120:GOTO 610
640 IF SPVD<0 OR SPVD>5 THEN GOSUB 120:GOTO 610
650 GOSUB 80:GOSUB 70:PRINT "Ausgabe der Zeiten in Zonenzeit (ZZ)":GOSUB 30
660 GOSUB 70:PRINT "Zeitunterschied"
670 ZU=0:INPUT "zur Weltzeit UT [vzhh] = ";ZU
680 IF ZU<-12 OR ZU>12 THEN GOSUB 120:GOTO 670
690 IF (ZU-INT ZU)<>0 THEN GOSUB 120:GOTO 670
700 ZU$="+":IF ZU<0 THEN ZU$="-"
710 ZZ$="ZZ ":IF ZU=0 THEN ZZ$="UTC "
720 IF ZU=1 THEN ZZ$="MEZ "
730 IF ZU=2 THEN ZZ$="MESZ"
740 '
750 CLS :U=0:S1=0
760 K1=INT ((Y-2000-0.015)*12.3685): REM entspricht ca. 5,5 Tage frueher
770 '
780 REM SCHLEIFE
790 FOR K9=0 TO 28 :REM fuer ein Jahr
800 IF K9=0 OR H1=0 THEN 840
810 IF (K9/4-INT (K9/4))=0 THEN 820 ELSE 840
820 GOSUB 20:IF (K9/8-INT (K9/8))=0 THEN 1720
830 CLS
840 JDZ=2451550.09766#+29.530588861#*K1
850 M=2.5534+29.1053567*K1
860 MS=201.5643+385.81693528#*K1
870 F1=160.7108+390.67050284#*K1
880 IF U=0 THEN GOSUB 930
890 IF U=1 OR U=3 THEN GOSUB 1040
900 IF U=2 THEN GOSUB 1170
910 GOTO 1280
920 REM BERECHNUNG NEUMOND
930 JDZ=JDZ-0.4072*SIN (MS)
940 JDZ=JDZ+0.17241*SIN (M)
950 JDZ=JDZ+0.01608*SIN (2*MS)
960 JDZ=JDZ+0.01039*SIN (2*F1)
970 JDZ=JDZ+0.00739*SIN (MS-M)
980 JDZ=JDZ-0.00514*SIN (MS+M)
990 JDZ=JDZ+0.00208*SIN (2*M)
1000 JDZ=JDZ-0.00111*SIN (MS-2*F1)
1010 GOTO 1250
1020 '
1030 REM BERECHNUNG VIERTEL-PHASEN
1040 JDZ=JDZ-0.62801*SIN (MS)
1050 JDZ=JDZ+0.17172*SIN (M)
1060 JDZ=JDZ-0.01183*SIN (MS+M)
1070 JDZ=JDZ+0.00862*SIN (2*MS)
1080 JDZ=JDZ+0.00804*SIN (2*F1)
1090 JDZ=JDZ+0.00454*SIN (MS-M)
1100 JDZ=JDZ+0.00204*SIN (2*M)
1110 JDZ=JDZ-0.0018*SIN (MS-2*F1)
1120 REM WEITERER KORREKTURTERM FUER VIERTELPHASEN
1130 IF U=1 THEN JDZ=JDZ+0.00306 ELSE JDZ=JDZ-0.00306
1140 GOTO 1250
1150 '
1160 REM BERECHNUNG VOLLMOND
1170 JDZ=JDZ-0.40614*SIN (MS)
1180 JDZ=JDZ+0.17302*SIN (M)
1190 JDZ=JDZ+0.01614*SIN (2*MS)
1200 JDZ=JDZ+0.01043*SIN (2*F1)
1210 JDZ=JDZ+0.00734*SIN (MS-M)
1220 JDZ=JDZ-0.00515*SIN (MS+M)
1230 JDZ=JDZ+0.00209*SIN (2*M)
1240 JDZ=JDZ-0.00111*SIN (MS-2*F1)
1250 JDZ=JDZ-2400000.5
1260 K1=K1+0.25:RETURN
1270 '
1280 IF H1=0 THEN 1380
1290 IF U=0 THEN U$=" Neumond "
1300 IF U=1 THEN U$=" Erstes V. "
1310 IF U=2 THEN U$=" Vollmond "
1320 IF U=3 THEN U$="Letztes V. "
1330 PRINT U$;:GOSUB 250:W1=(JDZ-INT JDZ)*24:GOSUB 190
1340 GOSUB 390:PRINT USING " ##.## UTC";W2
1350 GOTO 1670
1360 '
1370 REM ALTER DER GEZEIT
1380 IF U=0 AND S1=0 THEN PRINT " NEUMOND ";:GOSUB 250:W1=(JDZ-INT JDZ)*24:GOSUB 190:GOSUB 1610:GOTO 1440
1390 IF U=0 THEN U$=" NEUMOND "
1400 IF U=1 THEN U$="ERSTES VIERTEL "
1410 IF U=2 THEN U$=" VOLLMOND "
1420 IF U=3 THEN U$="LETZTES VIERTEL "
1430 GOTO 1510
1440 GOSUB 1620:PRINT "SPRINGZEIT vom ";
1450 GOSUB 1580:PRINT " bis ";
1460 JDZS2=JDZ+2+SPVD+(ZU/24):JD=(INT JDZS2)+2400001:GOSUB 280
1470 W1=(JDZS2- INT JDZS2)*24:GOSUB 190:GOSUB 1600:GOSUB 20
1480 IF U=0 AND S1=1 THEN GOTO 1720
1490 CLS :GOSUB 1620:PRINT "":PRINT " MITTZEIT vom ";:GOSUB 1600
1500 GOTO 1670
1510 PRINT " bis ";:GOSUB 1580
1520 GOSUB 20:CLS
1530 PRINT U$;
1540 GOSUB 250:W1=(JDZ- INT JDZ)*24:GOSUB 190:GOSUB 1610
1550 IF U=0 AND S1=1 THEN 1440
1560 IF U=2 THEN S1=1:GOTO 1440
1570 GOSUB 1620:PRINT " NIPPZEIT vom ";:GOTO 1450
1580 JDZS1=JDZ-2+SPVD+(ZU/24):JD=(INT JDZS1)+2400001:GOSUB 280
1590 W1=(JDZS1- INT JDZS1)*24:GOSUB 190
1600 GOSUB 390:PRINT USING " ##.## &&&&";W2;ZZ$:RETURN
1610 GOSUB 390:PRINT USING " ##.## UTC";W2:RETURN
1620 PRINT USING "( Springversp. = # d ";INT SPVD;:N0=INT (((SPVD- INT SPVD)*24)+0.5):GOSUB 420:PRINT " h";
1630 IF ZU=0 THEN PRINT " )":GOTO 1650
1640 PRINT USING " / UT&";ZU$;:N0=ABS ZU:GOSUB 420:PRINT " h )"
1650 RETURN
1660 '
1670 U=U+1: IF U=4 THEN U=0
1680 NEXT
1690 GOSUB 20: GOTO 500
1700 END
1710 '
1720 H2$="N":INPUT " Berechnung beenden ? [J/N] = ";H2$
1730 IF H2$="J" OR H2$="j" THEN GOSUB 80:PRINT " ENDE "
1740 IF H1=1 THEN CLS :GOTO 840
1750 GOTO 1490

[zum Seitenanfang]
h_c_greier Offline
Mitglied

Registriert: 28/12/2003
Beiträge: 565
Ort: Graz, Austria
#328812 - 23/07/2006 11:40 Re: Mondphasen - Berechnung [Re: Norbert_G]


Hallo Norbert,

danke für dein Posting.
Werde es mal ausprobieren, auf dem Taschenrechner (TI84) zum Laufen zu bewegen. Allerdinx scheint mir dein Code ein paar Sachen zu enthalten, die ich am TI nicht kenne. Muss mir aber zuerst den externen Editor besorgen

greets und viel Spass noch,
harald



--
_________________________
www.parallax.at

[zum Seitenanfang]
trallala Offline
Junior-Mitglied

Registriert: 29/12/2009
Beiträge: 1
#676338 - 31/12/2009 00:34 Re: Mondphasen - Berechnung [Re: h_c_greier]


Hallo,

vorerst möchte ich mich dafür entschuldigen, dass ich dieses schon fast zu Grabe getragene Thema noch einmal aus dem 'Dornrösschenschlaf' erwecke.

Meine Frage ist inwiefern es möglich ist die Berechnung mit der vollständigen 'Mondtheorie' ELP2000/82 ggf. auch ELP2000/85 durchzuführen. Mir ist bewusst dass die Genauigkeit in dieser Dimension allgegenwärtig nicht notwendig ist, aber als absoluter Zahlen-Freak würde ich gerne die Berechnungen entsprechend ausbauen wollen. Es macht mir riesen Spaß grössere Algorithmen einzugeben. Vielleicht klingt es jetzt übertrieben, aber nach dem abarbeiten des Buches 'Astronomische Algorithmen' in der 2. Auflage, wurde meine Wissbegierde über den Verbleib der restlichen im Buch nicht veröffentlichten 'Terme', die für die Berechnung nötig sind immer größer.

Ich habe die vereinfachte Prozedur vor einiger Zeit mal in ein Autoit3-Script gepackt und möchte anhand dessen mal verdeutlichen was ich meine.

#cs ----------------------------------------------------------------------------

AutoIt Version: 3.3.20.0
Author: trallala
Upate: 2009/12/24
Script Function: _Mondph
Template AutoIt script.

#ce ----------------------------------------------------------------------------
#NoTrayIcon
;#include <GUIConstants.au3>
#include <GuiListView.au3>
#include <GUIConstantsEx.au3>
Global Const $ES_AUTOVSCROLL = 64
Global Const $ES_AUTOHSCROLL = 128
Global Const $ES_WANTRETURN = 4096
Global Const $WS_POPUPWINDOW = 0x80880000
Global Const $WS_EX_CLIENTEDGE = 0x00000200
Global Const $WS_EX_TOOLWINDOW = 0x00000080
Global Const $WS_GROUP = 0x00020000
Global Const $ES_READONLY = 0x0800
;Global Const $GUI_SHOW = 16
;Global Const $GUI_HIDE = 32
;Global Const $GUI_DISABLE = 128
Global Const $PBS_SMOOTH = 1
Global Const $PBS_VERTICAL = 4
Global Const $SS_LEFT = 0x0000
Global Const $SS_RIGHT = 0x0002
Global Const $SS_CENTER = 0x01
Global Const $WS_EX_OVERLAPPEDWINDOW = 0x00000300
Global Const $WS_EX_TRANSPARENT = 0x00000020
Global Const $SS_NOTIFY = 0x0100
;
Global Const $BS_FLAT = 0x8000
Global Const $ES_NUMBER = 0x2000
$Form1 = GUICreate("Mondphasen", 520, 300, -1, -1,$WS_POPUPWINDOW,$WS_EX_TOOLWINDOW)
GUISetBkColor(0x151843)
$Label01 = GUICtrlCreateLabel("Mondphasen für das Jahr:", 8, 8, 140, 17)
GUICtrlSetColor(-1, 0xC0C0FF)
$ListView1 = GUICtrlCreateListView("Neumond |Erstes Viertel |Vollmond |Letztes Viertel ",10,30,500,260, $BS_FLAT)
GUICtrlSetColor(-1, 0xC0C0FF)
GUICtrlSetBkColor(-1, 0x151843)
;
$wert = GUICtrlCreateInput("", 175, 8, 35, 17, BitOR($ES_AUTOHSCROLL,$ES_NUMBER))
GUICtrlSetData($wert,@YEAR)
GUICtrlSetLimit ($wert , 4)
$runter = GUICtrlCreateButton("-", 145, 8, 25, 17, $BS_FLAT)
$hoch = GUICtrlCreateButton("+", 215, 8, 25, 17, $BS_FLAT)
$Start = GUICtrlCreateButton("Ok",250,8,25,17, $BS_FLAT)
$Beenden = GUICtrlCreateButton("X",495,8,15,15, $BS_FLAT)
GUISetState(@SW_SHOW)
;
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Beenden
Exit
Case $runter
GUICtrlSetData($wert, GUICtrlRead($wert) - 1)
Case $hoch
GUICtrlSetData($wert, GUICtrlRead($wert) + 1)
Case $Start
$jahr = GUICtrlRead($wert)
_Mondph($jahr)
EndSwitch
WEnd
;
Func _Mondph(ByRef $jahr)
DIM $dQ[4],$A[14],$Q[4]
DIM $dQx[2]=[2451550.09766,29.530588861]
Dim $Qx[16]=[0.00111,0.00057,0.00056,0.00042,0.00038,0.00034,0.00032,0.00028, _
0.00027,0.00024,0.00017,0.00007,0.00005,0.00004,0.00003,0.00002]
DIM $Ph[4]=[0.00,0.25,0.50,0.75],$PI=3.1415926531, $Color
DIM $Par[4][2]=[[2.5534,29.1053567],[201.5643,385.81693528], _
[160.7108,390.67050284],[124.7746,1.56375588]]
DIM $Ax[14][2]=[[299.77,0.107408],[251.88,0.016321],[251.83,26.651886],[349.42,36.412478], _
[84.66,18.206239],[141.74,53.303771],[207.14,2.453732],[154.84,7.30686],[34.52,27.261239], _
[207.19,0.121824],[291.34,1.844379],[161.72,24.198154],[239.56,25.513099],[331.55,3.592518]]
Global $Farbe1[2] = [0xDCDCDC, 0xC0C0FF]
_GUICtrlListView_DeleteAllItems(ControlGetHandle("", "", $ListView1))
;Korrektur Dynamical Time (Td)
$tx=($jahr-2000)/100
If $jahr<948 Then
$deltaTd=2177+497*$tx+44.1*$tx^2
ElseIf $jahr<=1600 Or $jahr>2100 Then
$deltaTd=102+102*$tx+25.3*$tx^2
ElseIf $jahr<2000 Then
$deltaTd=-183.5343-0.1472927*$jahr-0.00003856419*$jahr^2+0.00000008706996*$jahr^3
ElseIf $jahr>=2000 Then
$deltaTd=102+102*$tx+25.3*$tx^2
$deltaTd=$deltaTd+0.37*($jahr-2100)
EndIf
$deltaTd=$deltaTd/86400
;jeder Monat wird einmal durchlaufen
For $x1=0 to 12
$Date1=_DateToJd(0,$x1,$jahr,0,0,0)
$Date2=_DateToJd(0,0,$jahr,0,0,0)
$k =Int(($jahr-2000+($Date1-$Date2)/365.25)*12.3685)
$T =$k/1236.85
$dQ1=0.00015437*$T^2-0.00000015*$T^3+0.00000000073*$T^4
;--> 4 Phasen
For $x2=0 to 3
$dQ[$x2]=$dQx[0]+$dQx[1]*($k+$Ph[$x2])+$dQ1
$T=($Date1-2451545)/36525
$E=1+$T*(-0.002516-0.0000074*$T)
;---> Planeten-Agumente (Störungen berücksichtigen)
;-> Agumente: 1 von 14
$A[0]=($Ax[0][0]+$Ax[0][1]*$k-0.009173*$T^2)*$PI/180
;-> Agumente: 2 bis 14
For $x3=1 To 13
$A[$x3]=($Ax[$x3][0]+$Ax[$x3][1]*$k)*$PI/180
Next
$M0_tmp=0.0000014*$T^2-0.00000011*$T^3
$M1_tmp=0.0107582*$T^2+0.00001238*$T^3-0.000000058*$T^4
$F_tmp=0.0016118*$T^2-0.00000227*$T^3+0.000000011*$T^4
$O_tmp=0.0020672*$T^2+0.00000215*$T^3
;Mittlere Anomalie der Sonne
$M=$Par[0][0]+$Par[0][1]*($k+0.25+(0.25*($x2-1)))-$M0_tmp
_360Grad($M)
$M=$M*$PI/180
;Mittlere Anomalie des Mondes
$M1=$Par[1][0]+$Par[1][1]*($k+0.25+(0.25*($x2-1)))+$M1_tmp
_360Grad($M1)
$M1=$M1*$PI/180
;Agument der Breite des Mondes
$F=$Par[2][0]+$Par[2][1]*($k+0.25+(0.25*($x2-1)))-$F_tmp
_360Grad($F)
$F=$F*$PI/180
;Länge des aufsteigenden Knoten der Mondbahn
$Omega=$Par[3][0]-$Par[3][1]*($k+0.25+(0.25*($x2-1)))+$O_tmp
_360Grad($Omega)
$Omega=$Omega*$PI/180
If $x2=0 Then
;Neumond
$dQ[$x2]=$dQ[$x2]-0.4072*Sin($M1)+0.17241*$E*Sin($M)+0.01608*Sin(2*$M1) _
+0.01039*(Sin(2*$F))+0.00739*$E*Sin(($M1-$M))-0.00514*$E*Sin($M1+$M) _
+0.00208*$E^2*Sin(2*$M)-$Qx[0]*Sin($M1-2*$F)-$Qx[1]*Sin($M1+2*$F) _
+$Qx[2]*$E*Sin(2*$M1+$M)-$Qx[3]*Sin(3*$M1)+$Qx[3]*$E*Sin($M+2*$F) _
+$Qx[4]*$E*Sin($M-2*$F)-$Qx[9]*$E*Sin(2*$M1-$M)-$Qx[10]*Sin($Omega) _
-$Qx[11]*Sin($M1+2*$M)+$Qx[13]*Sin(2*$M1-2*$F)+$Qx[13]*Sin(3*$M) _
+$Qx[14]*Sin($M1+$M-2*$F)+$Qx[14]*Sin(2*$M1+2*$F)-$Qx[14]*Sin($M1+$M+2*$F) _
+$Qx[14]*Sin($M1-$M+2*$F)-$Qx[15]*Sin($M1-$M-2*$F)-$Qx[15]*Sin(3*$M1+$M) _
+$Qx[15]*Sin(4*$M1)
EndIf
If $x2=1 or $x2=3 Then
;erstes und letztes Viertel
$dQ[$x2]=$dQ[$x2]-0.62801*Sin($M1)+0.17172*$E*Sin($M)-0.01183*$E*Sin($M1+$M) _
+0.00862*Sin(2*$M1)+0.00804*Sin(2*$F)+0.00454*$E*Sin($M1-$M)+0.00204*$E^2*Sin(2*$M) _
-0.0018*Sin($M1-2*$F)-$Qx[11]*Sin($M1+2*$F)-$Qx[13]*Sin(3*$M1)-$Qx[5]*$E*Sin(2*$M1-$M) _
+$Qx[6]*$E*Sin($M+2*$F)+$Qx[6]*$E*Sin($M-2*$F)-$Qx[7]*$E^2*Sin($M1+2*$M) _
+$Qx[8]*$E*Sin(2*$M1+$M)-$Qx[11]*Sin($Omega)-$Qx[12]*Sin($M1-$M-2*$F)+$Qx[13]*Sin(2*$M1+2*$F) _
-$Qx[13]*Sin($M1+$M+2*$F)+$Qx[13]*Sin($M1-2*$M)+$Qx[14]*Sin($M1+$M-2*$F)+$Qx[14]*Sin(3*$M) _
+$Qx[15]*Sin(2*$M1-2*$F)+$Qx[15]*Sin($M1-$M+2*$F)-$Qx[15]*Sin(3*$M1+$M)
;Korrektur für erstes und letztes Viertel
$W=0.00306-0.00038*$E*Cos($M)+0.00026*Cos($M1)-$Qx[15]*Cos($M1-$M) _
+$Qx[15]*Cos($M1+$M)+$Qx[15]*Cos(2*$F)
If $x2=1 Then
;erstes Viertel
$dQ[$x2]=$dQ[$x2]+$W
ElseIf $x2=3 Then
;letztes Viertel
$dQ[$x2]=$dQ[$x2]-$W
EndIf
EndIf
If $x2=2 Then
;Vollmond
$dQ[$x2]=$dQ[$x2]-0.40614*Sin($M1)+0.17302*$E*Sin($M)+0.01614*Sin(2*$M1) _
+0.01043*Sin(2*$F)+0.00734*$E*Sin($M1-$M)-0.00515*$E*Sin($M1+$M)+0.00209*$E^2*Sin(2*$M) _
-$Qx[0]*Sin($M1-2*$F)-$Qx[1]*Sin($M1+2*$F)+$Qx[2]*$E*Sin(2*$M1+$M)-$Qx[3]*Sin(3*$M1) _
+$Qx[3]*$E*Sin($M+2*$F)+$Qx[4]*$E*Sin($M-2*$F)-$Qx[9]*$E*Sin(2*$M1-$M)-$Qx[10]*Sin($Omega) _
-$Qx[11]*Sin($M1+2*$M)+$Qx[13]*Sin(2*$M1-2*$F)+$Qx[13]*Sin(3*$M) _
+$Qx[14]*Sin($M1+$M-2*$F)+$Qx[14]*Sin(2*$M1+2*$F)-$Qx[14]*Sin($M1+$M+2*$F) _
+$Qx[14]*Sin($M1-$M+2*$F)-$Qx[15]*Sin($M1-$M-2*$F)-$Qx[15]*Sin(3*$M1+$M) _
+$Qx[15]*Sin(4*$M1)
EndIf
;Korrektur für alle Phasen
;(Störungen der Planeten berücksichtigen)
$dQ[$x2]=$dQ[$x2]+0.000325*Sin($A[0])+0.000165*Sin($A[1])+0.000164*Sin($A[2])+0.000126*Sin($A[3]) _
+0.00011*Sin($A[4])+0.000062*Sin($A[5])+0.00006*Sin($A[6])+0.000056*Sin($A[7])+0.000047*Sin($A[8]) _
+0.000042*Sin($A[9])+0.00004*Sin($A[10])+0.000037*Sin($A[11])+0.000035*Sin($A[12])+0.000023*Sin($A[13])
;Termine
$Q[$x2]=_JdToDate($dQ[$x2]-$deltaTd)
if StringMid($Q[$x2], 7, 4)<$jahr or StringMid($Q[$x2], 7, 4)>$jahr Then
$Q[$x2]=""
Continueloop
EndIf
Next
;Ausgabe
$inhalt1 = $Q[0] & "|" & $Q[1] & "|" & $Q[2] & "|" & $Q[3]
GUICtrlCreateListViewItem($inhalt1, $ListView1)
GUICtrlSetColor(-1, $Farbe1[Mod($x1,2)])
If $x1=0 and $inhalt1= "" & "|" & "" & "|" & "" & "|" & "" then
_GUICtrlListView_DeleteAllItems(ControlGetHandle("", "", $ListView1))
EndIf
Next
EndFunc
;
Func _DateToJd($tag,$monat,$jahr,$stunde,$minute,$sekunde)
$a=$jahr
$b=$monat
If $monat<= 2 Then
$a=$jahr-1
$b=$monat+12
EndIf
$c=Int($a/100)
$d=Int($c/4)
$e=2 - $c+$d
$f=Int(1461*($a+4716)/4)
$g=Int(153*($b+1)/5)
$Jd0=$tag+$e+$f+$g-1524.5
Return $Jd0+$stunde/24+$minute/1440+$sekunde/86400
EndFunc
;
Func _JdToDate($Jd1)
$a=$Jd1+0.5
$b=int($a)
$c=$a-$b
If $b<299161 Then
$d=$b
Else
$d=int(($b-1867216.25)/36524.25)
EndIf
$e=$b+1+$d-int($d/4)
$f=$e+1524
$g=int(($f-122.1)/365.25)
$h=int(365.25*$g)
$i=int(($f-$h)/30.6001)
$j=$f-$h-int(30.6001*$i)
if $i<13.5 then
$k=$i-1
Else
$k=$i-13
EndIf
if $k>2.5 Then
$l=$g-4716
Else
$l=$g-4715
EndIf
$m=24*$c
$n=($m-int($m))*60
$o=($n-int($n))*60
$k=StringFormat("%02d", $k)
$j=StringFormat("%02d", $j)
$m=StringFormat("%02d", $m)
$n=StringFormat("%02d", $n)
$o=StringFormat("%02d", $o)
Return $j & "." & $k & "." & $l & " - " & $m & ":" & $n & ":" & $o
EndFunc
;
Func _360Grad($Grad)
Return $Grad-360*int($Grad/360)
EndFunc

[zum Seitenanfang]


Moderator:  Stefan_Ueberschaer 
Aktuelle Fotos
M102 (NGC 5866)
Saturn vom 15.8.18, im 5" ED APO
Wabber- Mars 15.8.18 im Explore Scientific ED APO
Planet
Widefield Lagunen- und Trifidnebel
Mars und Saturn Widefield
Perseiden
Wer ist Online
42 Mitglieder (Der_Peter, Astrofuzzi, backyardastro, enceladus, AstroElsner, bogix, 11 unsichtbar), 465 Gäste und 4 Suchmaschinen online.
Status: Admin, GlobalModerator, Moderator
Forum Statistik
27909 Mitglieder
68 Foren
256900 Themen
1336710 Beiträge

Besucher Rekord: 1886 @ 17/10/2009 22:24