Насколько точно PyEphem поднимается и устанавливает расчеты за несколько сотен лет?

Подсчитывая дневные часы солнечного света (закат-восход) и находя максимум для каждого года (как правило, в день солнцестояния, но не всегда), появляется интересная картина. Около 5 секунд солнечного света теряется каждый век.

Это фактор ошибки в PyEphem? Является ли это точным и PyEphem с учетом изменений на орбите Земли? какая-то другая причина?

import pandas as pd
import ephem

sun = ephem.Sun()
raleigh = ephem.Observer()
raleigh.lon, raleigh.lat = "-78.6382", '35.7796'
raleigh.horizon = '-0:34'  # USNO standard atmospheric diffraction
raleigh.pressure = 0       # atmospheric refraction parameters

def riseset(date, f):
    # compute passed function (sunrise or sunset)
    raleigh.date = date
    sun.compute(raleigh)
    sr = ephem.localtime(f(sun))
    return sr

def createdataframe(start, end):
    # create a dataframe index by daily dates, add columns for the
    # sunrise, sunset, and their delta
    df = pd.DataFrame(index=pd.date_range(start=start, end=end,  freq='D'))
    df['date'] = df.index.map(lambda d: d.strftime("%b %d"))
    df['sunrise'] = df.index.map(lambda d: riseset(d, raleigh.next_rising))
    df['sunset'] = df.index.map(lambda d: riseset(d, raleigh.next_setting))
    df['daylightdelta'] = df['sunset'] - df['sunrise']
    return df

def outputmax(df, year):
    i = df['daylightdelta'].idxmax()  # index of the day where the sun is visible above the horizon for the most time
    return "solstice: %s longest day sunrise: %s sunset: %s daylight: %s" % (
        ephem.localtime(ephem.next_solstice(str(year))).strftime("%Y %b %d %X"),
        df.loc[i]['sunrise'].strftime("%b %d %X"),
        df.loc[i]['sunset'].strftime("%T"),
        df.loc[i]['daylightdelta'])

if __name__ == "__main__":
    for year in range(1900,2201):
        # looping through 1900-2200, find the date with the most hours of sunlight
        start = '%d-01-01 04:00:00' % year # compensating for UTC which can throw off pandas columnar math
        end = '%d-12-31 23:59:00' % year
        print outputmax(createdataframe(start, end), year)

1 ответ

Решение

Я думаю, что PyEphem показывает вам реальное явление. В то время как мне не хватает эксперта, чтобы перечислить все многие завихряющиеся факторы, которые влияют на число, например, продолжительность самого длинного дня, я обращаю внимание на то, что наклон полюса Земли меняется с годами и в настоящее время уменьшается:

https://en.wikipedia.org/wiki/Milankovitch_cycles

Давайте попробуем сделать очень приблизительное предположение о размере, который может иметь этот эффект. Если в течение 41 000 лет наклон изменяется от максимального к минимальному и обратно, то текущий полупериод от максимального наклона назад к минимальному должен занимать около 20 500 лет. Хотя, конечно, реальная корректировка является синусоидальной, с медленным изменением вблизи максимумов и затем более быстрым изменением в середине между крайностями, что, если бы оно было просто линейным в первом приближении? Тогда скорость изменения за 20 500 лет = 205 веков была бы примерно:

(24,5 - 22,1) градусов / 205 веков ≅ 0,01 градуса

Таким образом, можно ожидать, что наклон оси изменится примерно на сотую часть градуса в год. Сколько секунд дневного света изменяется в самом длинном дне в Роли, если вы измените наклон оси на 0,01 градуса? PyEphem не позволяет нам произвольно изменять осевой наклон, поэтому вместо этого давайте отрегулируем положение Роли. Измените нижний пункт вашей программы на:

if __name__ == "__main__":
    year = 2000
    start = '%d-01-01 04:00:00' % year # compensating for UTC which can throw off pandas columnar math
    end = '%d-12-31 23:59:00' % year

    raleigh.lat = '35.76'
    print outputmax(createdataframe(start, end), year)

    raleigh.lat = '35.77'
    print outputmax(createdataframe(start, end), year)

    raleigh.lat = '35.78'
    print outputmax(createdataframe(start, end), year)

И в качестве результата вы должны получить:

solstice: 2000 Jun 20 21:47:51 longest day sunrise: Dec 21 07:20:52 sunset: 17:04:27 daylight: 0 days 14:16:24.970989
solstice: 2000 Jun 20 21:47:51 longest day sunrise: Dec 21 07:20:54 sunset: 17:04:26 daylight: 0 days 14:16:28.206467
solstice: 2000 Jun 20 21:47:51 longest day sunrise: Dec 21 07:20:55 sunset: 17:04:24 daylight: 0 days 14:16:31.442902

Примерно три или четыре секунды за столетие, что примерно соответствует величине эффекта, который вы видите. Поэтому я предполагаю, что ваша программа раскрывает постепенное уменьшение осевого наклона планеты, которое постепенно делает сезоны менее экстремальными, а самый длинный день и самую длинную ночь - менее экстремальными.

Другие вопросы по тегам