Der Saros ist der Zeitraum für den drakonischen Monat ( = 27,212220815 Tage), synodischer Monat ( = 29,530588861 Tage) und anomalistischer Monat ( = 27,554549886 Tage) ungefähr übereinstimmen. Genauer gesagt heißt es das
Stellen Sie sich einen einfacheren Fall vor, in dem wir ganzzahlige Approximationen für nur 2 Perioden erhalten möchten. Nehmen Sie den synodischen Monat und das tropische Jahr ( = 365,24219 Tage). Deshalb,
Ich sehe jedoch keinen guten Weg, diese Methode auf 3 Perioden und darüber hinaus zu verlängern.
Sie können den Lenstra-Lenstra-Lovász (LLL)-Gitterbasisreduktionsalgorithmus ausprobieren , um einen kurzen Vektor in einem Gitter zu berechnen. Zur Berechnung verwende ich Pari GP (S. 382, Abschnitt 3.10.62 qflll).
Wir definieren ein Gitter mit einer Basis, die aus den Spalten der Matrix besteht
ist von geringer Länge, wenn Und ist klein u sind auch klein. In diesem Fall
Bei Pari/GP online bekomme ich folgende Ausgabe
\p20
Td= 27.212220815;
Ts = 29.530588861;
Ta = 27.554549886;
m=1000
M=[1/m,0,0;0,1/m,0;0,0,1/m;Td,Ts,0;Td,0,Ta]
s=qflll(M)
[s[,1],[s[1,1]*Td+s[2,1]*Ts, s[1,1]*Td+s[3,1]*Ta, s[2,1]*Ts-s[3,1]*Ta]]
%2 = [[242, -223, -239]~, [0.036121227000000000000, -0.17998552400000000000, 0.21610675100000000000]]
Die Koeffizienten sind , die Unterschiede sind .
Ich habe die Länge des tropischen Monats hinzugefügt ( ) und der Sternmonat ( ), von Wiki und bekam, für m=100000
? \p20
Td= 27.212220815;
Ts = 29.530588861;
Ta = 27.554549886;
Tt=27.321582252
Ti=27.321661554
m=100000
M=[1/m,0,0,0,0;0,1/m,0,0,0;0,0,1/m,0,0;0,0,0,1/m,0;0,0,0,0,1/m;Td,Ts,0,0,0;Td,0,Ta,0,0;Td,0,0,Tt,0;Td,0,0,0,Ti]
s=qflll(M)
[s[,1],[s[1,1]*Td+s[2,1]*Ts, s[1,1]*Td+s[3,1]*Ta, s[1,1]*Td+s[4,1]*Tt, s[1,1]*Td+s[5,1]*Ti]]
%27 = [[4993, -4601, -4931, -4973, -4973]~, [0.37917983400000000000, -0.86695857100000000000, 0.38999009900000000000, -0.0043787470000000000000]]
sqrt(2)
oder pi
, in das data
Feld eingeben.Kehren Sie das Problem um, mit usw. Dann suchen wir nach ganzen Zahlen das befriedigt
Dies kann durch eine Art euklidischen Algorithmus erfolgen, ähnlich wie die Kettenbruchberechnung damit zusammenhängt. Im Bereich der Motivationen findet sich auch der L3-Algorithmus.
Iterieren
Verwenden Sie als Fehlermaß das Residuum der Minimierungsaufgabe oder ein eng verwandtes Maß dafür, wie parallel Und Sind.
Im folgenden Python-Skript werden diese Ideen umgesetzt. Für den Fall, dass sich das Residuum wesentlich verbessert, wird ein Bericht gedruckt.
T = [ 27.212220815, 29.530588861, 27.554549886 ]
def largest(F):
k0=0; k1=1
if F[0]<F[1]: k0=1; k1=0
for k in range(2,len(F)):
if F[k]>F[k0]: k1=k0; k0=k; continue
if F[k]>F[k1]: k1=k
return k0,k1
def defect(a):
n2_F=n2_a=0
s_Fa=0
for ak, Tk in zip(a,T): n2_F+=1/Tk**2; n2_a+=ak**2; s_Fa+=ak/Tk
delta = s_Fa/n2_a
return (sum((1/Tk-delta*ak)**2 for ak, Tk in zip(a,T))/n2_F)**0.5
F = [ 1/Ta for Ta in T ]
tol=1e-1
max_F = max(F)
M = np.eye(len(F), dtype=int)
while True:
k0,k1 = largest(F)
err = defect(M[k0])
if err < tol:
tol=0.2*err
print(" a: ",list(M[k0]))
print("a*T: ",[a*Ta for a,Ta in zip(M[k0],T)])
print(" ^F: ",[Fk/F[k0] for Fk in F])
print(f"angle (deg): {np.rad2deg(np.arcsin(err)):.5g}°\n")
if err < 5e-10: break
q = int(round(F[k0]/F[k1]))
F[k0] -= q*F[k1]
M[k1] += q*M[k0]
if F[k0]<0: F[k0]=-F[k0]; M[k0]=-M[k0]
Das ergibt das Protokoll
a: [1, 1, 1]
a*T: [27.212220815, 29.530588861, 27.554549886]
^F: [0.013482132197497906, 1.0, 0.07171370910340992]
angle (deg): 2.035°
a: [15, 14, 15]
a*T: [408.18331222499995, 413.42824405399995, 413.31824829]
^F: [0.18799937091605323, 0.055664774527038254, 1.0]
angle (deg): 0.34535°
a: [76, 70, 75]
a*T: [2068.12878194, 2067.14122027, 2066.59124145]
^F: [1.0, 0.29609021698213056, 0.31916673511916593]
angle (deg): 0.018052°
a: [242, 223, 239]
a*T: [6585.35743723, 6585.321316003, 6585.537422754]
^F: [0.14353663918949092, 1.0, 0.0779374555912061]
angle (deg): 0.00082299°
a: [3783, 3486, 3736]
a*T: [102943.831343145, 102943.63276944599, 102943.798374096]
^F: [0.15830991529461017, 0.06102937657324801, 1.0]
angle (deg): 4.7152e-05°
a: [20928, 19285, 20668]
a*T: [569497.35721632, 569497.406184385, 569497.437043848]
^F: [1.0, 0.3855057117532664, 0.3167237386175655]
angle (deg): 3.3867e-06°
a: [66325, 61118, 65501]
a*T: [1804850.545554875, 1804850.530006598, 1804850.572082886]
^F: [0.49417557377594934, 0.21716709153510322, 1.0]
angle (deg): 5.4577e-07°
a: [285986, 263534, 282433]
a*T: [7782314.18199859, 7782314.204894774, 7782314.187952638]
^F: [0.2755545984556782, 1.0, 0.05364004447339751]
angle (deg): 6.9819e-08°
a: [1255666, 1157087, 1240066]
a*T: [34169460.46188779, 34169460.4734079, 34169460.458932474]
^F: [1.0, 0.3709551370058305, 0.19466212784696205]
angle (deg): 1.0192e-08°
wobei das Referenzergebnis tatsächlich im 4. Datensatz steht.
Für Perioden
Teilen hinein einfachere Fälle: Und .
Es folgt dem
Die sachgerechte Weiterführung lässt sich am besten an einem Beispiel demonstrieren.
Betrachten Sie den bereitgestellten Fall wo Und .
Wir finden geeignete Näherungen für Und Verwenden Sie die in der Frage beschriebene Kettenbruchmethode und erhalten Sie
Wir können jetzt multiplizieren den Nenner passend zu machen gleich dem Zähler in folgendermaßen:
Wir können jetzt gleichsetzen
Somit
Deshalb, .
Offensichtlich sind diese Zahlen größer als Und aber das liegt daran, dass ich mich dafür entschieden habe, den fortgesetzten Bruch über einen bestimmten Punkt hinaus abzuschneiden. Wenn Sie möchten, können Sie auch die gefundenen Werte für übernehmen und finden Sie kleinere ganzzahlige Annäherungen für .
Für Perioden
Das obige Argument lässt sich leicht wie folgt verallgemeinern:
In Betracht ziehen .
Einfach nehmen , bekommen
Multiplizieren Sie dann jeden der Brüche entsprechend, sodass die erforderlichen Zähler und Nenner übereinstimmen. Suchen Sie danach den Wert für durch Gleichsetzen der Zähler. Betrachten Sie als Nächstes das Verhältnis , multipliziere, um alles zu einer Ganzzahl zu machen und voila, deine Antwort ist fertig!
PM 2Ring