如何从pyephem中获取太阳经度?
我正在尝试确定火星上季节的开始和结束时间。这个时间点是在0º、90º、180º和270º的太阳经度。
PyEphem提供了日心坐标的经度和纬度。请问这和这里显示的太阳经度有什么关系呢:
http://www.planetary.org/explore/space-topics/mars/mars-calendar.html
1 个回答
2
我觉得这两个量是相同的角度,只是从不同的起点来测量。基于这个假设,你可以用PyEphem来预测火星的季节,误差大概在两到三天之内——不过我本来期待能更准确一点,不太明白为什么结果没有那么接近!
不过这至少可以让你入门。如果你发现这些预测和你链接的那个网站的结果有些不同,记得告诉我们!我们应该找个时间把它们和NASA Horizons的结果,以及我正在开发的Skyfield项目的结果进行比较,Skyfield是一个改进版的PyEphem。
无论如何,这里有一些代码可以用来计算Ls,并用它来找出火星的季节:
# The angle that we call "the longitude of the Sun, as
# seen from Mars" should grow at the same rate as the
# "longitude of Mars as seen from the Sun" (since the
# two are the same line but viewed in opposite
# directions).
#
# The only problem is knowing what point to name "zero",
# so we have to learn what .hlon was when the first
# Martian year started:
from ephem import Mars, Date, degrees, newton
m = Mars()
m.compute('1955/4/11 23:00')
Ls0 = m.hlon
def Ls(date):
m.compute(date)
return degrees(m.hlon - Ls0).norm
# There! Ls() should give Martian solar latitude.
# So the first round of seasons listed at the page
# http://www.planetary.org/explore/space-topics/mars/mars-calendar.html
# should give 90 degrees, 180 degrees, and 270 degrees:
for date in '1955/10/27', '1956/4/27', '1956/9/21':
print Ls(date)
# The output is close to what we would expect:
#
# 90:11:58.3
# 179:57:32.2
# 270:13:22.6
#
# Great! So what if we want to know, say, the date
# of the upcoming Spring Equinox or Summer Solstice?
# We need functions that are smooth, well-behaved,
# and cross zero at those two times, so that we can
# unleash Newton's Method upon them:
def spring_equinox(date):
return Ls(date).znorm
def summer_solstice(date):
return Ls(date) - degrees('90:00:00')
def find_spring_equinox(start_date):
start_date = Date(start_date)
y0 = Ls(start_date)
y1 = Ls(start_date + 1)
rate = y1 - y0
angle_to_go = degrees(0.0 - y0).norm
closer_date = start_date + angle_to_go / rate
d = newton(spring_equinox, closer_date, closer_date + 1)
return Date(d)
def find_summer_solstice(start_date):
start_date = Date(start_date)
y0 = Ls(start_date)
y1 = Ls(start_date + 1)
rate = y1 - y0
angle_to_go = degrees(degrees('90:00:00') - y0).norm
closer_date = start_date + angle_to_go / rate
d = newton(summer_solstice, closer_date, closer_date + 1)
return Date(d)
d = find_spring_equinox('2015/1/22')
print d, Ls(d)
d = find_summer_solstice('2015/1/22')
print d, Ls(d)
# Output:
# 2015/6/16 15:03:15 0:00:00.0
# 2015/12/31 21:12:07 90:00:00.0