Ответы пользователя по тегу Астрономия
  • Как рассчитать период парада планет?

    longclaps
    @longclaps
    Видимым парадом планет называется планетная конфигурация, когда пять ярких планет Солнечной системы (Меркурий, Венера, Марс, Юпитер и Сатурн) в своём движении по небосводу подходят друг к другу на близкое расстояние и становятся видны в одно время в небольшом секторе (10 — 40 градусов) неба.

    Допустим, мы знаем дату, когда солнце и 5 планет были точно на одной линии, прикинем, когда они окажутся снова в одном секторе, скажем 30°:
    from itertools import count
    
    n = 12  # число секторов, мы же взяли сектор в 30°
    year = 365.256363004
    periods = (
        87.969,  # Меркурий
        224.698,  # Венера
        686.98,  # Марс
        4332.589,  # Юпитер
        10759.22  # Сатурн
    )
    speeds = [n / p for p in periods]  # угловые скорости планет, сектор/день
    for t in count(40):  # стартанём не сразу, а погодя, чтобы планеты разошлись,
        # за 40 дней меркурий убежит почти на 180°
        mercury, *others = (int(t * speed) % n for speed in speeds)
        if all(planet == mercury for planet in others):
            y = int(t / year)
            print(f'{y} лет {round(t - y * year)} дней')
            break
    Выхлоп - 377 лет 212 дней.
    Это очень грубая прикидка, ведь я считал парадом положение планет а одном секторе с центром в солнце, а надо бы - в одном секторе с центром в точке наблюдения, те на Земле. Но честный рассчет гораздо сложнее.

    UPDATE
    Парадом планет называется также конфигурация планет Солнечной системы, когда планеты, в том числе и невидимые невооружённым глазом, «выстраиваются» по одну сторону от Солнца в небольшом секторе. В такой конфигурации Меркурий и Венера могут быть невидимы с Земли, так как находятся в нижнем соединении с Солнцем, но зато внешние планеты видимы, практически, в одном направлении. Ближайший прошедший такой парад был 10 марта 1982 года, а следующий будет в 2161 году.

    Ага, так лучше.
    Вот более аккуратный код, легко видеть, что никакого периода нет, и нетрудно понять почему: периоды обращения планет не кратны хоть какому-то протяженному времени.
    Ну и зазора в (2161 - 1982) лет не наблюдается - ведь я стартовал из воображаемого момента в прошлом, когда планеты были строго на одной линии - а такого наверняка никогда не было.
    n = 360.  # просто 360°
    occupied = 45.  # размер сектора, в который должны впихнуться планеты
    year = 365.256363004
    periods = (
        87.969,  # Меркурий
        224.698,  # Венера
        year,  # Земля
        686.98,  # Марс
        4332.589,  # Юпитер
        10759.22,  # Сатурн
        60190.03,  # Нептун
        # 90553.02  # Плутон # всё равно он не планета
    )
    speeds = [n / p for p in periods]  # угловые скорости планет
    t = t0 = 0  # текущая дата, дата 'нулевого' парада
    for _ in range(32):  # число выводимых парадов
        while True:
            t += 1
            if t - t0 < 43:
                continue  # пусть планеты разойдутся, за 43 дня меркурий убежит на 180°
    
    
            def width():
                planets = sorted((t * speed) % n for speed in speeds)
                a, max_free_angle = planets[-1] - n, 0.
                for b in planets:
                    if max_free_angle < b - a:
                        max_free_angle = b - a
                    a = b
                return 360. - max_free_angle
    
    
            if width() < occupied:  # подкараулим день, когда сектор будет минимальным
                u = v = width()
                while u >= v:
                    t += 1
                    u, v = v, width()
                print(f'через {round((t - t0 - 1) / year):>4} лет '
                      f'планеты соберутся в секторе {round(u)}°')
                t0 = t - 1
                break
    Ответ написан