Finden ganzzahliger Approximationen

Der Saros ist der Zeitraum für den drakonischen Monat ( T D = 27,212220815 Tage), synodischer Monat ( T S = 29,530588861 Tage) und anomalistischer Monat ( T A = 27,554549886 Tage) ungefähr übereinstimmen. Genauer gesagt heißt es das

242 T D 223 T S 239 T A
Meine Frage ist: Gibt es eine Methode ohne Brute-Force, um solche ganzzahligen Annäherungen abzuleiten?

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 ( T j = 365,24219 Tage). Deshalb,

A T S = B T j
A B = T j T S
Um immer genauere Näherungen abzuleiten, kann man die Kettenbruchentwicklung z T j T S = 12.368266400619... , das ist (in der WolframAlpha-Notation)
12.368266400619 = [ 12 ; 2 , 1 , 2 , 1 , 1 , 17 , 3 , 196 , 1 , 4 , 1 , 1 , 2 , 2 , . . . ]
Daraus ist ersichtlich, dass das Abschneiden kurz vor der 17 eine gute Annäherung ergibt
12.368266400619 [ 12 ; 2 , 1 , 2 , 1 , 1 ] = 235 19
Deshalb,
235 T S 19 T j
Was als metonischer Zyklus bekannt ist .

Ich sehe jedoch keinen guten Weg, diese Methode auf 3 Perioden und darüber hinaus zu verlängern.

Übrigens, Fragen zur Saros-Serie sind auf Astronomy.SE willkommen

Antworten (3)

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 M

M := ( 1 M 0 0 0 1 M 0 0 0 1 M T D T S 0 T D 0 T A )
M ist ein Skalierungsfaktor. Eine Linearkombination dieser Basisvektoren

( λ 1 M λ 2 M λ 3 M λ 1 T D + λ 2 T S λ 1 T D + λ 3 T A )

ist von geringer Länge, wenn λ 1 T D + λ 2 T S Und λ 1 T D + λ 3 T A ist klein u λ 1 M , λ 2 M , λ 3 M sind auch klein. In diesem Fall

λ 2 T S λ 3 T A = ( λ 1 T D + λ 2 T S ) ( λ 1 T D + λ 3 T A )
ist auch klein. Beachten Sie, dass λ 2 Und λ 3 haben das gleiche Vorzeichen.

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 242 , 223 , 239 , die Unterschiede sind 0,036 , 0,180 , 0,216 .

Ich habe die Länge des tropischen Monats hinzugefügt ( T T ) und der Sternmonat ( T ich ), 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]]
Das Hinzufügen des tropischen Monats ergibt Zyklen von Sonnenfinsternissen, die mit (fast) demselben ekliptischen Längengrad auftreten. Die Verwendung des Sternmonats ergibt ein ähnliches Ergebnis, außer dass die Präzession der Äquinoktien ignoriert wird. Es macht nicht viel Sinn, beide einzubeziehen.
@PM2Ring ja, beide Monate unterscheiden sich nur um einige Sekunden.
Natürlich ist keiner dieser Monate wirklich konstant. Ihr Zyklus von ~5000 Monaten / 4 Jahrhunderten ist kurzfristig in Ordnung, aber selbst nach 1 Zyklus wirken sich die Änderungen der Monatslängen auf die 6. Dezimalstelle aus. Ihr Wikipedia-Link gibt einfache lineare Korrekturen für diese Länge. Es gibt Ausdrücke höherer Ordnung für sie, aber die vollständige Mondtheorie ist ziemlich kompliziert. ;)
Hier ist eine Live-Version , die auf dem SageMathCell-Server läuft.
@PM2Ring Vielen Dank. Ich dachte, ich hätte in meinem Beitrag schon einen Link zur Online-Version von Pari/GP, wo ich die Berechnungen gemacht habe, aber ich habe jetzt gesehen, dass ich das nicht getan habe, und habe ihn jetzt hinzugefügt.
Ich habe ein bisschen mit dem Code herumgespielt, und ich muss sagen, das Endergebnis ist wirklich unglaublich und entspricht meinen Vorstellungen! Allerdings bin ich gerade aufs College gekommen. Ich kenne mich mit Analysis und etwas linearer Algebra aus, aber ich denke, es wird einige Zeit dauern, bis ich Ihre Methode vollständig verstanden habe. Eine Frage: um immer bessere Annäherungen zu bekommen, den Wert von M muss erhöht werden. Was ist der beste Weg, dies zu tun, ohne jeden ganzzahligen Wert zu durchlaufen? Mein erster Gedanke ist, jede Zehnerpotenz durchzugehen.
@ordptt Hier ist eine Sage/Python-Version. sagecell.sagemath.org/…
@ordptt Sicher, Zehnerpotenzen sind in Ordnung. Es macht keinen Sinn, zu hoch zu gehen, da sich die verschiedenen Monatslängen langfristig ändern. Außerdem ist der anomalistische Monat weniger wichtig als die anderen beiden, er regelt die relativen Größen von Sonne und Mond, aber Sie müssen die synodischen und drakonitischen Zyklen aneinanderreihen, um tatsächlich eine Sonnenfinsternis zu bekommen. Übrigens, in meinem Code können Sie Sage / Python-Ausdrücke, einschließlich Sachen wie sqrt(2)oder pi, in das dataFeld eingeben.
@PM2Ring Für mich ist das in erster Linie eine Frage zur Annäherung durch ganze Zahlen und nicht zur Astronomie. Und unter diesem Gesichtspunkt ist es sinnvoll, darüber nachzudenken, was passiert, wenn der Besitz steigt M . Und zunehmend M wird die ganzen Zahlen größer machen, aber die Unterschiede werden hoffentlich kleiner.
@ordptt Ich denke, Potenzen von 10 werden Sinn machen. Wenn Sie m nur um 1 erhöhen, ändert sich meistens nichts. Die Verwendung von T D unterscheidet sich von der Verwendung von T S Und T A im Algorithmus, weil T D wird direkt mit den beiden anderen Zahlen verglichen. T A Und T S werden nicht direkt verglichen. So können Sie die Rolle von ändern T D Und T A oder die Rolle von T D Und T S und kann zu unterschiedlichen Ergebnissen führen.
@ Miracle173 Einverstanden. Schließlich ist dies Math.SE, daher ist es völlig in Ordnung, sich auf die Mathematik zu konzentrieren, die zur Beantwortung der Frage des OP erforderlich ist. es ist uns egal, woher die Zahlen kommen oder wie die Ergebnisse verwendet werden. OTOH, es kann angebracht sein, die Grenzen eines mathematischen Modells zu erwähnen.
@miracle173 Daran habe ich gerade gedacht. Aus mathematischer Sicht sollte eine Periode nicht die Referenz sein. Ich frage mich, ob es in dieser Hinsicht eine bessere Methode gibt. Allerdings habe ich eine Intuition, dass die Ergebnisse nur geringfügig abweichen würden - vielleicht den Näherungsfehlern bzgl T D werden alle proportional zunehmen oder abnehmen, wenn wir es in Bezug auf, sagen wir, überdenken T S , so dass die Reihenfolge der besten Näherungen gleich bleibt.

Kehren Sie das Problem um, mit F A = 1 / T A usw. Dann suchen wir nach ganzen Zahlen A , B , C das befriedigt

F A A F B B F C C δ .
Das heißt, wir wollen einen Gitterabstand finden δ damit alle F A , B , C sind sehr nah an Gitterpunkten. Die Neuinterpretation der Aufgabe ist somit zu
 minimieren  F δ A 2 2  Wo  A Z 3 ,
mit A minimal, d. h. teilerfremd als Vektor.

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

  • Nehmen Sie die beiden größten Elemente und reduzieren Sie das größte durch das zweitgrößte, indem Sie ganzzahlige Quotienten verwenden.
  • Behalten Sie die Transformationsmatrix im Auge M , hier mit der Konvention, dass wenn F ' ist dann irgendwann der reduzierte Vektor M T F ' = F gleich dem ursprünglichen Vektor ist.
  • Dann, wenn das (neue) maximale Element von F ' an Stelle k deutlich größer ist als die übrigen Elemente, der Vektor A = M k , Die k Reihe von M ein Kandidat für den ganzzahligen Koeffizientenvektor ist.

Verwenden Sie als Fehlermaß das Residuum der Minimierungsaufgabe oder ein eng verwandtes Maß dafür, wie parallel F Und A 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 3 Perioden

Teilen A T 1 = B T 2 = C T 3 hinein 2 einfachere Fälle: A T 1 = B T 2 Und B T 2 = C T 3 .

Es folgt dem

A B = T 2 T 1 Und B C = T 3 T 2

Die sachgerechte Weiterführung lässt sich am besten an einem Beispiel demonstrieren.

Betrachten Sie den bereitgestellten Fall wo T 1 = 27.212220815 , T 2 = 29.530588861 Und T 3 = 27.554549886 .

Wir finden geeignete Näherungen für A B Und B C Verwenden Sie die in der Frage beschriebene Kettenbruchmethode und erhalten Sie

A B [ 1 ; 11 , 1 , 2 , 1 , 4 , 3 , 5 , 1 , 31 , 1 , 1 , 6 ] = 2381497 2194532
B C [ 0 ; 1 , 13 , 1 , 16 , 1 , 27 , 3 , 5 , 1 , 1 ] = 879525 942599

Wir können jetzt multiplizieren A B den Nenner passend zu machen A B gleich dem Zähler in B C folgendermaßen:

A B × 2194532 879525 2381497 2194532 × 2194532 879525 = 2381497 879525
2194532 879525 A B 2381497 879525

Wir können jetzt gleichsetzen

2194532 879525 A = 2381497
A = 2094586148925 2194532

Somit

A : B : C :: 2094586148925 2194532 : 879525 : 942599
A : B : C :: 2094586148925 : 1930145757300 : 2068563668668

Deshalb, 2094586148925 T 1 1930145757300 T 2 2068563668668 T 3 .

Offensichtlich sind diese Zahlen größer als 242 , 223 Und 239 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 A , B , C und finden Sie kleinere ganzzahlige Annäherungen für A : B : C .

Für N Perioden

Das obige Argument lässt sich leicht wie folgt verallgemeinern:

In Betracht ziehen A 1 T 1 = A 2 T 2 = A 3 T 3 = A 4 T 4 = . . . = A N T N .

Einfach nehmen A 1 T 1 = A 2 T 2 , A 2 T 2 = A 3 T 3 , A 3 T 3 = A 4 T 4 , . . . , A N 1 T N 1 = A N T N , bekommen

A 1 A 2 = T 2 T 1 , A 2 A 3 = T 3 T 2 , . . . , A N 1 A N = T N T N 1

Multiplizieren Sie dann jeden der Brüche entsprechend, sodass die erforderlichen Zähler und Nenner übereinstimmen. Suchen Sie danach den Wert für A 1 durch Gleichsetzen der Zähler. Betrachten Sie als Nächstes das Verhältnis A 1 : A 2 : A 3 : . . . : A N , multipliziere, um alles zu einer Ganzzahl zu machen und voila, deine Antwort ist fertig!

Das ist ein guter Weg, um das Problem zu lösen. Es ist jedoch weit davon entfernt, das Beste zu sein. Der 3-Perioden-Fall ist beispielsweise gleichbedeutend mit let B Und C gleich dem Zähler und Nenner der Kettenbruchnäherung von B / C und Lösung für A . Das garantiert aber nur B T 2 = C T 3 ist eine gute Annäherung, aber nicht insgesamt. In der Tat führt die Verwendung Ihrer Methode mit Annäherungen nahe der Größe dessen, was ich in der Frage dargestellt habe, zu Ergebnissen A , B , C = 272 , 251 , 269 , das ist ungefähr der 2000. Platz für die ersten 2508 besten Annäherungen (durch Brute Force für A = 1 , 2 , . . . , 2508 )
Nur um ein bisschen mehr ins Detail zu gehen: Es sollte ein Gleichgewicht geben. Für einige ungefähr A , B , C , Wenn B T 2 = C T 3 ist eine wirklich gute Annäherung, aber A T 1 = B T 2 oder A T 1 = C T 3 Schreckliche Annäherungen sind das Gesamtverhältnis A T 1 = B T 2 = C T 3 ist eine schlechte Annäherung. Eine andere Möglichkeit, dies zu sehen, besteht darin, festzustellen, dass die Gleichung den folgenden beiden entspricht: B T 2 A T 1 = 0 Und C T 3 A T 1 = 0 , so dass der Ausdruck ( B T 2 A T 1 ) 2 + ( C T 3 A T 1 ) 2 wird für gute Näherungen minimiert.
@ordptt Ja, du hast Recht. Das ist leider das Beste, was mir eingefallen ist. Ich freue mich darauf, bessere Ansätze von erfahreneren Mathematikern zu sehen.
Kein Problem! Es ist sicher ein schwieriges Problem, das keine einfache Antwort zu haben scheint.