spamsink: (Default)
spamsink ([personal profile] spamsink) wrote2025-07-06 01:52 pm
Entry tags:

Видала мышку на ковре

Всю прошлую неделю я был в отпуске: летал в Финикс, Аризона, чтобы посмотреть, каково там живётся в самый жаркий период года. Оказалось, что при влажности 13-15% некоторое разумное время вполне можно провести вне помещения в середине дня в ясный день даже при температуре 317 K, имея на себе правильную одежду, головной убор и aqua quantum satis.

В музее музыкальных инструментов мы провели за два дня (для этого там есть возможность удлинить билет на второй день по половинной цене) в общей сложности, наверное, часов семь. Если когда окажетесь неподалёку, имейте в виду.

Там мне впервые в жизни удалось поиграть на поиграться с терменвоксом.

Но пост не про это. В городе Anthem, AZ имеется современный Стоунхендж - военный мемориал из 5 стел (по числу видов вооруженных сил США), в которых сделаны эллиптические проемы так, чтобы солнечный свет падал на герб США ровно в 11:11 11 ноября.

Естественно, мне тут же захотелось узнать, как обстоит дело с гулянием положения солнца в этот момент от года к году, и нет ли другой даты, когда солнце оказывается в той же самой точке. В самом ЧатГПТ нужный пакет установлен не был, о чём он мне грустно сообщил: "It looks like the necessary astronomy library (skyfield) isn't available in this environment to compute precise solar positions", но выдал инструкции по установке необходимых пакетов (их пришлось тривиально модифицировать по месту, а именно "apt install python3-xyz" вместо "pip install xyz", как мне сам pip и сказал сделать), а также скрипт, который не потребовал никаких принципиальных изменений, разве что диапазон дней пришлось увеличить, и тут же заработал.

from datetime import datetime, timedelta
import numpy as np
import pandas as pd
import pytz
from skyfield.api import load, Topos

# Load ephemeris data
ts = load.timescale()
eph = load('de421.bsp')

# Observer's location
observer = Topos(latitude_degrees=33.8631806, longitude_degrees=-112.1371645)

# Reference date and time (local time in Phoenix, no DST)
tz = pytz.timezone("America/Phoenix")
reference_local = tz.localize(datetime(2025, 11, 11, 11, 11))
reference_utc = reference_local.astimezone(pytz.utc)
t_ref = ts.utc(reference_utc.year, reference_utc.month, reference_utc.day,
               reference_utc.hour, reference_utc.minute)

earth = eph['earth']
sun = eph['sun']
astrometric = earth + observer

# Get reference sun position
sun_ref = astrometric.at(t_ref).observe(sun).apparent()
alt_ref, az_ref, _ = sun_ref.altaz()

# Scan nearby days at same time
results = []
for offset in range(-200, 201):
    test_local = reference_local + timedelta(days=offset)
    test_utc = test_local.astimezone(pytz.utc)
    t = ts.utc(test_utc.year, test_utc.month, test_utc.day,
               test_utc.hour, test_utc.minute)
    sun_pos = astrometric.at(t).observe(sun).apparent()
    alt, az, _ = sun_pos.altaz()

    alt_diff = abs(alt.degrees - alt_ref.degrees)
    az_diff = abs(az.degrees - az_ref.degrees)

    if alt_diff < 0.1 and az_diff < 0.1:
        results.append((test_local.date(), round(alt.degrees, 2), round(az.degrees, 2), alt_diff, az_diff))

# Print matching dates
for r in results:
    print(f"Match: {r[0]}, Alt: {r[1]}°, Az: {r[2]}°, ΔAlt: {r[3]:.3f}, ΔAz: {r[4]:.3f}")



Если бы мне была поставлена задача с нуля написать программу на любом языке, которая это вычисляет, бог знает сколько дней или недель я бы возился.
juan_gandhi: (Default)

[personal profile] juan_gandhi 2025-07-06 11:37 pm (UTC)(link)
Хм, хороший подход.
А какой смысл, что эти стелы разного размера?
brumka: (Default)

[personal profile] brumka 2025-07-07 01:53 am (UTC)(link)
Музей музыки там, действительно, отличный.
archaicos: Шарж (Default)

[personal profile] archaicos 2025-07-07 03:07 am (UTC)(link)
Музей выглядит годно. Надо как-нибудь понаехать в те края.
vak: (Default)

[personal profile] vak 2025-07-07 06:30 am (UTC)(link)
Удобные пакеты народ для Питона понаписал. В юности я увлекался астрономией и изучал всю эту математику.