Startseite
| Programme:
Sofi- Zentrallinie
| Algorithmen,
Lektionen, Analysen
|
Unsere Vorläufer
| Kontakt, Datenschutz
Die Berechnung erfolgt minütlich. Vor Benutzung müssen die sog. Bessel-Elemente der gewünschten Finsternis eingesetzt werden.
Das Modul worldmap2.py muss im Programmverzeichnise liegen.
# sofiBessel2Wordlmap : Sonnenfinsternisberechnung mit den Besselschen Elementen:
# Verlauf der Zentrallinie. In die Weltkarte geplottet
# für Heft 97
# Besselsche Elemente
# yr=2026; mnt=8; day=12
T0 = 18
x = [ 0.4755140, 0.5189249, -0.0000773, -0.0000080]
y = [ 0.7711830, -0.2301680, -0.0001246, 0.0000038]
d = [ 14.7966700, -0.0120650, -0.0000030, 0.0]
l1 = [ 0.5379550, 0.0000939, -0.0000121, 0.0]
l2 = [ -0.0081420, 0.0000935, -0.0000121, 0.0]
u = [ 88.7477900, 15.0030900, 0.0000000, 0.0]
tanf1 = 0.0046141
tanf2 = 0.0045911
from math import *
from worldmap2 import *
# Winkelfunktionen in Gradmaß, wie im Meeus
def Sin(w): return sin(pi * w / 180)
def Cos(w): return cos(pi * w / 180)
def Tan(w): return tan(pi * w / 180)
def Atan2(y, x): return 180 * atan2(y, x) / pi
def Asin(x): return 180 * asin(x) / pi
def Acos(x): return 180 * acos(x) / pi
def Atan(x): return 180 * atan(x) / pi
def sq(x): return x*x
def solveQuadrant(sinX,cosX):
if (sinX>=0 and cosX>=0): return Asin(sinX);
if (sinX<0 and cosX>=0): return Asin(sinX);
if (sinX<0 and cosX<0): return -Acos(cosX);
if (sinX>=0 and cosX<0): return Acos(cosX);
def calcEclipse(t, screen, W):
# Koordinaten zum Zeitpunkt
X = 0
Y = 0
D = 0
L1 = 0
L2 = 0
M = 0
for j in range(3, -1, -1):
X = X * t + x[j] # die Koordinaten
Y = Y * t + y[j]
D = D * t + d[j] # Deklination ...
M = M * t + u[j] # ... und Stundenwinkel im orstfesten Äquatorsystem
L1 = L1 * t + l1[j] # die Radien der Schattenkegel, Halbschatten ...
L2 = L2 * t + l2[j] # ... und Kernschatten
# die Ableitungen / Veränderungen des Ortes i.f. Fundamental-E.
XS = x[1] + 2 * x[2] * t + 3 * x[3] * t * t
YS = y[1] + 2 * y[2] * t + 3 * y[3] * t * t
cd = Cos(D)
w = 1.0 / (sqrt(1 - 0.006694385 * cd * cd))
p = u[1] / 57.2957795
b = YS - p * X * Sin(D)
c = XS + p * Y * Sin(D)
y1 = w * Y
b1 = w * Sin(D)
b2 = 0.99664719 * w * Cos(D)
if 1 - X * X - y1 * y1 < 0:
return
B = sqrt(1 - X * X - y1 * y1)
phi1 = Asin(B * b1 + y1 * b2)
# von Greg Miller
sinH=X / Cos(phi1)
cosH=(B * b2 - y1 * b1) / Cos(phi1)
H=solveQuadrant(sinH, cosH)
# Berechnung der topozentrischen Koordinaten der Schattenachse = Zentral-Linie
phi = Atan(1.00336409 * Tan(phi1))
Lambda = M - H - 0.00417807 * dt # dt in Sekunden
# Berechnung des Totalitätsstreifens und der Dauer der Finsternis im Zentrum
L2S = L2 - B * tanf2 # l2S negativ: Ringförmig
typ="r"
if L2S<0:
typ="t"
a = c - p * B * Cos(D)
n2 = a * a + b * b
if n2 < 0:
n = -777 # kein n
dauer = -777 # keine Dauer
else:
n=sqrt(n2)
dauer = abs(7200 * L2S / n)
sinh = Sin(D) * Sin(phi) + Cos(D) * Cos(phi) * Cos(H)
h = Asin(sinh)
K2 = B * B + (X * a + Y * b) * (X * a + Y * b) / (n * n)
K = sqrt(K2)
pfadbreite = 12756 * abs(L2S) / K
# Berechnung der Breite der scheinbaren Größe des Mondes (in Sonnendurchmessern)
L1S=l1[0]+l1[1]*t+l2[2]*t*t-B*tanf1
A = (L1S - L2S) / (L1S + L2S)
# Protokollausgabe nach Meeus, S. 13
#print(X, Y, D, M, L2, XS, YS, w, p, b, c, y1, b1, b2, B)
#print(H, phi, Lambda, L2S, a, n, dauer, h, K2, pfadbreite)
#print(L1S, A,)
# wirklich ausgeben (formatiert):
# Zeit (Minuten seit Referenzstunde)
# geographische Koordinaten in Grad. West und Nord sind positiv
# Sonnenhöhe in Grad
# Breite des Totalitätspfades
# Größe der Mondscheibe in scheinbarem Sonnendurchmesser
# ringförmig oder total
if Lambda>360:
Lambda=Lambda-360
if (Lambda>180):
Lambda=Lambda-360
# Tabellenausgabe ist auskommentiert.
# print(t*60.0, Lambda, phi, dauer, h, pfadbreite, A, typ)
# Druck in die Weltkarte
worldpoint(Lambda/180.0*pi,phi/180.0*pi,4,"blue", W, screen, 1)
# Main
# ====
screen = Screen()
print("Weltkarte: 10 Sekunden warten")
w=1000 # Bildbreite
worldmap(1, "green", w, screen)
# für jede Minute 1h vor bis 2 h nach der Referenzstunde
dt = 0 # Abweichung TD-UT. Ich rechne hier in TD (34)
# keine Überschrit in der Weltkarten-Variante.
# print("Zeit, Lambda/°(<0:Ost) phi(pos:Nord) Dauer/s Hohe/° Pfadbreite/km rel.Monddurchm. Typ")
for i in range(-120, 120, 1): # von 2h vor bis 2h nach der Referenzzeit in 10-min-Schritten
t = i/60.0 # Zeit in Stunden
calcEclipse(t, screen, w)
# Keine Maximumsberechnung für die Kartenansicht
# print("Maximum:")
# calcEclipse(21/60.0+8/3600.0, screen)
# formatiert drucken ohne Zeilenwechsel
# print("%5.3f " % (j * dt),end="")
# Prompt am Ende
update()
ende = input("Fertig.")
# ===================
Uwe Pilz, Februar 2025