Encontrar aproximaciones enteras

El Saros es el período de tiempo para el mes dracónico ( T d = 27,212220815 días), mes sinódico ( T s = 29,530588861 días) y mes anómalo ( T a = 27,554549886 días) para que coincida aproximadamente. Más específicamente, establece que

242 T d 223 T s 239 T a
Mi pregunta es: ¿existe una forma que no sea de fuerza bruta para derivar tales aproximaciones enteras?

Considere un caso más simple, en el que queremos obtener aproximaciones enteras para solo 2 períodos. Tome el mes sinódico y el año tropical ( T y = 365,24219 días). Por lo tanto,

a T s = b T y
a b = T y T s
Para derivar aproximaciones cada vez más precisas, se puede usar la expansión de fracción continua para T y T s = 12.368266400619... , que es (en la notación WolframAlpha)
12.368266400619 = [ 12 ; 2 , 1 , 2 , 1 , 1 , 17 , 3 , 196 , 1 , 4 , 1 , 1 , 2 , 2 , . . . ]
De lo cual se puede ver que truncar justo antes del 17 produce una buena aproximación
12.368266400619 [ 12 ; 2 , 1 , 2 , 1 , 1 ] = 235 19
Por lo tanto,
235 T s 19 T y
Lo que se conoce como el ciclo metónico .

Sin embargo, no veo una buena manera de extender este método por 3 períodos o más.

Por cierto, las preguntas relacionadas con la serie Saros son bienvenidas en Astronomy.SE

Respuestas (3)

Puede probar el algoritmo de reducción de base de celosía de Lenstra–Lenstra–Lovász (LLL) para calcular un vector corto en una celosía. Yo uso Pari GP (p. 382, ​​sección 3.10.62 qflll) para el cálculo.

Definimos una red con una base formada por las columnas de la Matriz METRO

METRO := ( 1 metro 0 0 0 1 metro 0 0 0 1 metro T d T s 0 T d 0 T a )
metro es un factor de escala. Una combinación lineal de estos vectores base

( λ 1 metro λ 2 metro λ 3 metro λ 1 T d + λ 2 T s λ 1 T d + λ 3 T a )

es de pequeña longitud, si λ 1 T d + λ 2 T s y λ 1 T d + λ 3 T a es pequeño y λ 1 metro , λ 2 metro , λ 3 metro también son pequeños. En este caso

λ 2 T s λ 3 T a = ( λ 1 T d + λ 2 T s ) ( λ 1 T d + λ 3 T a )
es pequeño, también. Tenga en cuenta que λ 2 y λ 3 tener el mismo signo.

Con Pari/GP en línea obtengo el siguiente resultado

\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]]

Los coeficientes son 242 , 223 , 239 , las diferencias son 0.036 , 0.180 , 0.216 .

Agregué la duración del mes tropical ( T t ) y el mes sideral ( T i ), de Wiki y obtuve, para 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]]
Agregar el mes tropical da ciclos de eclipses que ocurren con (casi) la misma longitud eclíptica. Usar el mes sideral da un resultado similar excepto que ignora la precesión de los equinoccios. No tiene mucho sentido incluir ambos.
@PM2Ring sí, ambos meses difieren solo por algunos segundos.
Por supuesto, ninguno de esos meses es realmente constante. Su ciclo de ~5000 meses / 4 siglos está bien a corto plazo, pero incluso después de 1 ciclo, los cambios en la duración de los meses afectan el sexto lugar decimal. Su enlace de Wikipedia proporciona correcciones lineales simples a esa longitud. Hay expresiones de orden superior para ellos, pero la teoría lunar completa es bastante complicada. ;)
Aquí hay una versión en vivo , que se ejecuta en el servidor SageMathCell.
@PM2Ring Gracias. Pensé que ya tenía en mi publicación un enlace a la versión en línea de Pari/GP donde hice los cálculos, pero ahora vi que no lo tenía y lo agregué ahora.
Jugué un poco con el código, y debo decir que el resultado final es realmente increíble y coincide con lo que quería. Sin embargo, recién entré a la universidad. Sé cálculo y algo de álgebra lineal, pero supongo que me llevará algún tiempo entender completamente tu método. Una pregunta: para obtener cada vez mejores aproximaciones, el valor de metro debe aumentarse. ¿Cuál es la mejor manera de hacerlo sin pasar por cada valor entero? Mi pensamiento inicial es pasar por cada potencia de diez.
@ordptt Aquí hay una versión de Sage/Python. sagecell.sagemath.org/…
@ordptt Claro, las potencias de diez están bien. No tiene sentido subir demasiado, ya que las distintas duraciones de los meses cambian a largo plazo. Además, el mes anómalo es menos importante que los otros dos, rige los tamaños relativos del Sol y la Luna, pero necesita que los ciclos sinódico y draconítico se alineen para obtener un eclipse. Por cierto, en mi código, puede escribir expresiones de Sage/Python, incluidas cosas como sqrt(2)o pi, en el datacuadro.
@ PM2Ring Para mí, esa es una pregunta principal sobre la aproximación por números enteros y no sobre astronomía. Y desde este punto de vista tiene sentido pensar en lo que sucede si la propiedad aumenta metro . y aumentando metro hará que los números enteros sean más grandes, pero es de esperar que las diferencias se vuelvan más pequeñas.
@ordptt Creo que las potencias de 10 tendrán sentido. Aumentar m solo sumando 1 no cambiará nada la mayor parte del tiempo. el uso de T d difiere del uso de T s y T a en el algoritmo, porque T d se compara directamente con los otros dos números. T a y T s no se comparan directamente. Entonces puedes cambiar el rol de T d y T a o el papel de T d y T s y puede obtener resultados diferentes.
@ milagro173 De acuerdo. Después de todo, esto es Math.SE, por lo que está perfectamente bien concentrarse en las matemáticas necesarias para responder la pregunta del OP; realmente no nos importa de dónde vienen los números o cómo se usarán los resultados. OTOH, puede ser apropiado mencionar las limitaciones de un modelo matemático.
@miracle173 Estaba pensando en eso. Desde una perspectiva matemática, un período no debería ser la referencia. Me pregunto si hay un mejor método en ese sentido. Sin embargo, tengo la intuición de que los resultados solo variarán ligeramente, tal vez los errores de aproximación con respecto a T d todos aumentarán o disminuirán proporcionalmente si lo reconsideramos con respecto a, digamos, T s , tal que la secuencia de las mejores aproximaciones sigue siendo la misma.

Invertir el problema, con F a = 1 / T a etc. Entonces estamos buscando números enteros a , b , C que satisfacen

F a a F b b F C C d .
Es decir, queremos encontrar algún espacio de cuadrícula d para que todos F a , b , C están muy cerca de los puntos de la cuadrícula. La nueva interpretación de la tarea es, pues,
 minimizar  F d a 2 2  dónde  a Z 3 ,
con a mínimo, es decir, coprimo como vector.

Esto se puede hacer mediante algún tipo de algoritmo euclidiano, similar a cómo se relaciona con él el cálculo de la fracción continua. En el campo de las motivaciones también se encuentra el algoritmo L3.

Iterar

  • Tome los dos elementos más grandes y reduzca el más grande por el segundo más grande usando cocientes enteros.
  • Realizar un seguimiento de la matriz de transformación METRO , aquí con la convención de que si F es el vector reducido en alguna etapa, entonces METRO T F = F es igual al vector original.
  • Entonces siempre que el (nuevo) elemento maximal de F en la posición k es decididamente más grande que los elementos restantes, el vector a = METRO k , el k la fila de METRO es un candidato para el vector de coeficientes enteros.

Como medida de error, use el residuo de la tarea de minimización, o estrechamente relacionado, una medida de cuán paralelo F y a son.

En el siguiente script de python se realizan estas ideas. Se imprime un informe para el caso de que el residual mejore sustancialmente.

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]

Esto da el registro

  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°

donde efectivamente el resultado de referencia está en el 4º registro.

Para 3 periodos

Dividir a T 1 = b T 2 = C T 3 en 2 casos más simples: a T 1 = b T 2 y b T 2 = C T 3 .

Resulta que

a b = T 2 T 1 y b C = T 3 T 2

La continuación apropiada se puede demostrar mejor con un ejemplo.

Considere el caso provisto donde T 1 = 27.212220815 , T 2 = 29.530588861 y T 3 = 27.554549886 .

Encontramos aproximaciones apropiadas para a b y b C usando el método de fracción continua descrito en la pregunta, obteniendo

a b [ 1 ; 11 , 1 , 2 , 1 , 4 , 3 , 5 , 1 , 31 , 1 , 1 , 6 ] = 2381497 2194532
b C [ 0 ; 1 , 13 , 1 , dieciséis , 1 , 27 , 3 , 5 , 1 , 1 ] = 879525 942599

Ahora podemos multiplicar a b apropiadamente para hacer el denominador en a b igual al numerador en b C como sigue:

a b × 2194532 879525 2381497 2194532 × 2194532 879525 = 2381497 879525
2194532 879525 a b 2381497 879525

Ahora podemos igualar

2194532 879525 a = 2381497
a = 2094586148925 2194532

Por eso

a : b : C :: 2094586148925 2194532 : 879525 : 942599
a : b : C :: 2094586148925 : 1930145757300 : 2068563668668

Por lo tanto, 2094586148925 T 1 1930145757300 T 2 2068563668668 T 3 .

Obviamente, estos números son más grandes que 242 , 223 y 239 pero eso es porque elegí truncar la fracción continua más allá de cierto punto. Si lo desea, también puede tomar los valores encontrados para a , b , C y encontrar aproximaciones enteras más pequeñas para a : b : C .

Para norte periodos

El argumento anterior se puede generalizar fácilmente de la siguiente manera:

Considerar a 1 T 1 = a 2 T 2 = a 3 T 3 = a 4 T 4 = . . . = a norte T norte .

simplemente toma 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 norte 1 T norte 1 = a norte T norte , conseguir

a 1 a 2 = T 2 T 1 , a 2 a 3 = T 3 T 2 , . . . , a norte 1 a norte = T norte T norte 1

Luego multiplica cada una de las fracciones apropiadamente para que coincidan los numeradores y denominadores necesarios. Después de eso, encuentra el valor de a 1 igualando los numeradores. A continuación, considere la relación a 1 : a 2 : a 3 : . . . : a norte , multiplica para que todo sea un número entero y listo, ¡tu respuesta está lista!

Esa es una buena manera de resolver el problema. Sin embargo, está muy lejos de ser el mejor. El caso de los 3 periodos, por ejemplo, es equivalente a dejar b y C igualar el numerador y el denominador de la aproximación de fracción continua de b / C y resolviendo para a . Sin embargo, eso sólo garantiza que b T 2 = C T 3 es una buena aproximación, pero no en general. De hecho, al usar su método con aproximaciones cercanas al tamaño de lo que presenté en la pregunta da como resultado a , b , C = 272 , 251 , 269 , que está alrededor del lugar 2000 para las primeras 2508 mejores aproximaciones (realizadas por fuerza bruta para a = 1 , 2 , . . . , 2508 )
Solo para detallar un poco más: debe haber un equilibrio. Para algunos aproximados a , b , C , si b T 2 = C T 3 es una muy buena aproximación, pero a T 1 = b T 2 o a T 1 = C T 3 son aproximaciones horribles, la relación general a T 1 = b T 2 = C T 3 es una mala aproximación. Otra forma de ver esto es notando que la ecuación es equivalente a las dos siguientes: b T 2 a T 1 = 0 y C T 3 a T 1 = 0 , tal que la expresión ( b T 2 a T 1 ) 2 + ( C T 3 a T 1 ) 2 se minimiza para buenas aproximaciones.
@ordptt Sí, tienes razón. Desafortunadamente, esto es lo mejor que se me ocurrió. Espero ver mejores enfoques de matemáticos más experimentados.
¡Ningún problema! Seguro que es un problema difícil que no parece tener una respuesta sencilla.