gpt4 book ai didi

python - pyephem 恒星时给出了意想不到的结果

转载 作者:行者123 更新时间:2023-12-01 05:53:24 25 4
gpt4 key购买 nike

我是第一次使用 ephem,并且无法理解 oberver.sidereal_time() 的输出

我编写了几个脚本来从小时角度确定太阳时。第一个使用 ephem 计算赤经,并使用 Meeus 天文算法中的公式来获取格林威治平均恒星时,可以将其转换为带有经度的本地平均恒星时。

import sys
from datetime import datetime, time, timedelta
import ephem

def hour_angle(dt, longit, latit, elev):
obs = ephem.Observer()
obs.date = dt.strftime('%Y/%m/%d %H:%M:%S')
obs.lon = longit
obs.lat = latit
obs.elevation = elev
sun = ephem.Sun()
sun.compute(obs)
# get right ascention
ra = ephem.degrees(sun.g_ra)

# get sidereal time at greenwich (AA ch12)
jd = ephem.julian_date(dt)
t = (jd - 2451545.0) / 36525
theta = 280.46061837 + 360.98564736629 * (jd - 2451545) \
+ .000387933 * t**2 - t**3 / 38710000

# hour angle (AA ch13)
ha = (theta + longit - ra * 180 / ephem.pi) % 360
return ha

def main():
if len(sys.argv) != 6:
print 'Usage: hour_angle.py [YYYY/MM/DD] [HH:MM:SS] [longitude] [latitude] [elev]'
sys.exit()
else:
dt = datetime.strptime(sys.argv[1] + ' ' + sys.argv[2], '%Y/%m/%d %H:%M:%S')
longit = float(sys.argv[3])
latit = float(sys.argv[4])
elev = float(sys.argv[5])

# get hour angle
ha = hour_angle(dt, longit, latit, elev)

# convert hour angle to timedelta from noon
days = ha / 360
if days > 0.5:
days -= 0.5
td = timedelta(days=days)

# make solar time
solar_time = datetime.combine(dt.date(), time(12)) + td
print solar_time

if __name__ == '__main__':
main()

当我插入一些数据时,这会给出我期望的输出:

> python hour_angle_ephem.py 2012/11/16 20:34:56 -122.2697 37.8044 3.0
2012-11-16 12:40:54.697115

我编写的第二个脚本以相同的方式计算赤经,但使用 ephem 的 sidereal_time() 来获取本地的视恒星时。

import sys
from datetime import datetime, time, timedelta
import math
import ephem

def solartime(observer, sun=ephem.Sun()):
sun.compute(observer)
# sidereal time == ra (right ascension) is the highest point (noon)
t = observer.sidereal_time() - sun.ra
return ephem.hours(t + ephem.hours('12:00')).norm # .norm for 0..24

def main():
if len(sys.argv) != 6:
print 'Usage: hour_angle.py [YYYY/MM/DD] [HH:MM:SS] [longitude] [latitude] [elev]'
sys.exit()
else:
dt = datetime.strptime(sys.argv[1] + ' ' + sys.argv[2], '%Y/%m/%d %H:%M:%S')
longit = float(sys.argv[3])
latit = float(sys.argv[4])
elev = float(sys.argv[5])

obs = ephem.Observer()
obs.date = dt.strftime('%Y/%m/%d %H:%M:%S')
obs.lon = longit
obs.lat = latit
obs.elevation = elev
solar_time = solartime(obs)
print solar_time

if __name__ == '__main__':
main()

这并没有得到我期望的输出。

python hour_angle_ephem2.py 2012/11/16 20:34:56 -122.2697 37.8044 3.0
9:47:50.83

据我所知,这两个脚本之间的唯一区别是,第一个脚本以本地平均恒星时为基础,而第二个脚本以本地视恒星时为基础,其中考虑了地球的章动,我认为应该是一个很小的因素。相反,我看到大约三个小时的差异。谁能向我解释一下这是怎么回事?

最佳答案

当您向 PyEphem 提供需要角度的原始 float 时,它会相信您已先将角度转换为弧度 - 因为它始终将浮点角度视为弧度,以保持一致。但在第二个脚本中,您将获得以度数表示的经度和纬度,并将它们提供给 PyEphem,就好像它们以弧度表示一样。如果添加一两个 print 语句来查看 Observer 的 .lon.lat 属性,您就可以看到结果 看起来像:

print observer.lon  #--> -7005:32:16.0
print observer.lat #--> 2166:01:57.2

我认为您想要做的只是向 PyEphem 提供原始经度和纬度字符串,以便通过删除 float()< 将它们解释为人类可读的度数而不是机器可读的弧度 在第二个脚本中调用 argv[3]argv[4] 。然后您应该发现它返回的值更接近您期望的值:

$ python tmp11.py 2012/11/16 20:34:56 -122.2697 37.8044 3.0
12:40:55.59

关于python - pyephem 恒星时给出了意想不到的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13463965/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com