pyephem 可以超过 360 度查看日期吗
Can pyephem look more than 360 degrees past a date
我希望此代码输出直到今天为止行星每 30 度运动的日期,但由于某种原因它在 360 度处停止。为什么代码就停在这里没有经过390度,420度,450度......等等
from ephem import Venus, Date, degrees, newton
import datetime
v = Venus()
start_date = '2014/2/2 00:00'
v.compute(start_date)
Ls0 = v.hlon
print "VENUS",start_date, Ls0
print ""
arc = 0
while True:
d = start_date
today = datetime.date.today()
arc = arc + degrees('30:00:00')
if d == today:
break
def Ls(date):
v.compute(date)
return degrees(v.hlon - Ls0).norm
def thirty_degrees(date):
return Ls(date) - degrees(arc)
def find_thirty_degrees(start_date):
start_date = Date(start_date)
y0 = Ls(start_date)
y1 = Ls(start_date + 1)
rate = y1 - y0
angle_to_go = degrees(degrees(arc) - y0).norm
closer_date = start_date + angle_to_go / rate
d = newton(thirty_degrees, closer_date, closer_date + 1)
return Date(d)
d = find_thirty_degrees(start_date)
print d, Ls(d)
结果是:
金星 2014/2/2 00:00 146:05:57.6
2014/2/20 11:27:19 30:00:00.0
2014/3/11 01:17:41 60:00:00.0
2014/3/29 18:50:49 90:00:00.0
2014/4/17 15:55:27 120:00:00.0
2014/5/6 15:00:08 150:00:00.0
2014/5/25 14:10:16 179:59:59.9
2014/6/13 12:02:34 210:00:00.0
2014/7/2 07:57:18 240:00:00.0
2014/7/21 01:36:05 270:00:00.0
2014/8/8 16:44:49 300:00:00.0
2014/8/27 05:27:54 330:00:00.0
2014/9/14 16:38:35 359:59:59.5
原因是一个圆只有360°,此时你又回到了你开始绕天之旅的0°点。当金星处于 30°、60° 等位置时,您将不得不从零开始并寻找一组全新的时刻。
请注意,像 newton()
这样的例程很难在 359° 切换回 0° 的点附近操作,因为过渡非常突然。它有时会很有帮助,当试图检测某物为 0° 的时刻时,改为给 newton()
一个真正 returns 你想要的值 + 180° 的函数,然后问 newton()
找到 180° 交叉点。
我希望此代码输出直到今天为止行星每 30 度运动的日期,但由于某种原因它在 360 度处停止。为什么代码就停在这里没有经过390度,420度,450度......等等
from ephem import Venus, Date, degrees, newton
import datetime
v = Venus()
start_date = '2014/2/2 00:00'
v.compute(start_date)
Ls0 = v.hlon
print "VENUS",start_date, Ls0
print ""
arc = 0
while True:
d = start_date
today = datetime.date.today()
arc = arc + degrees('30:00:00')
if d == today:
break
def Ls(date):
v.compute(date)
return degrees(v.hlon - Ls0).norm
def thirty_degrees(date):
return Ls(date) - degrees(arc)
def find_thirty_degrees(start_date):
start_date = Date(start_date)
y0 = Ls(start_date)
y1 = Ls(start_date + 1)
rate = y1 - y0
angle_to_go = degrees(degrees(arc) - y0).norm
closer_date = start_date + angle_to_go / rate
d = newton(thirty_degrees, closer_date, closer_date + 1)
return Date(d)
d = find_thirty_degrees(start_date)
print d, Ls(d)
结果是:
金星 2014/2/2 00:00 146:05:57.6
2014/2/20 11:27:19 30:00:00.0
2014/3/11 01:17:41 60:00:00.0
2014/3/29 18:50:49 90:00:00.0
2014/4/17 15:55:27 120:00:00.0
2014/5/6 15:00:08 150:00:00.0
2014/5/25 14:10:16 179:59:59.9
2014/6/13 12:02:34 210:00:00.0
2014/7/2 07:57:18 240:00:00.0
2014/7/21 01:36:05 270:00:00.0
2014/8/8 16:44:49 300:00:00.0
2014/8/27 05:27:54 330:00:00.0
2014/9/14 16:38:35 359:59:59.5
原因是一个圆只有360°,此时你又回到了你开始绕天之旅的0°点。当金星处于 30°、60° 等位置时,您将不得不从零开始并寻找一组全新的时刻。
请注意,像 newton()
这样的例程很难在 359° 切换回 0° 的点附近操作,因为过渡非常突然。它有时会很有帮助,当试图检测某物为 0° 的时刻时,改为给 newton()
一个真正 returns 你想要的值 + 180° 的函数,然后问 newton()
找到 180° 交叉点。