3

pyephem を使用して日の出と日の入りを計算しようとしていますが、アルゴリズムが極域で収束しないようです。

以下のサンプルコードを確認してください。次の日の出と日の入りを求めて、10 分単位で 1 年間を繰り返します。pyephem は常に AlwaysUpError または NeverUpError を返しますが、1 年に少なくとも 1 回は太陽が昇り沈む必要がありますか?

import ephem
from datetime import datetime, timedelta

obs = ephem.Observer()
obs.lat = '89:30'
obs.long = '0'

start = datetime(2011, 1, 1)
end = datetime(2012, 1, 1)
step = timedelta(minutes=10)

sun = ephem.Sun()

timestamp = start
while timestamp < end:
    obs.date = timestamp

    try:
        print obs.next_rising(sun)
    except (ephem.AlwaysUpError, ephem.NeverUpError):
        pass

    try:
        print obs.next_setting(sun)
    except (ephem.AlwaysUpError, ephem.NeverUpError):
        pass

    try:
        print obs.previous_rising(sun)
    except (ephem.AlwaysUpError, ephem.NeverUpError):
        pass

    try:
        print obs.previous_setting(sun)
    except (ephem.AlwaysUpError, ephem.NeverUpError):
        pass

    timestamp += step

API の使い方が間違っているか、pyephem にバグがあるか、基本的なことを誤解しています。助けはありますか?

4

3 に答える 3

1

あなたのプログラムを実行したところ、次の出力が得られました ("sort | uniq -c" にパイプされます):

260 2011/3/17 11:32:31
469 2011/3/17 13:42:56
184 2011/3/18 07:25:56
350 2011/3/18 18:13:15
191 2011/3/19 04:41:42
346 2011/9/24 20:25:13
337 2011/9/25 04:27:45
214 2011/9/25 17:36:10
166 2011/9/26 08:00:59
254 2011/9/26 14:37:06

インデントは正しいですか?これが私の生のコードです:

https://raw.github.com/barrycarter/bcapps/master/playground4.py

(出力は上記の他の回答と一致しませんが、異なる期間を使用しています (-34 分と -50 分)。

于 2013-02-02T04:54:51.043 に答える
1

ある種の不適切なキャッシングが疑われます。検討:

import ephem 
atlanta = ephem.Observer() 
atlanta.pressure = 0 
atlanta.horizon = '-0:34' 
atlanta.lat, atlanta.lon = '89:30', '0' 
atlanta.date = '2011/03/18 12:00' 
print atlanta.previous_rising(ephem.Sun()) 
print atlanta.next_setting(ephem.Sun()) 
atlanta.date = '2011/03/19 12:00' 
print atlanta.previous_rising(ephem.Sun()) 
print atlanta.next_setting(ephem.Sun()) 
atlanta.date = '2011/03/20 12:00' 
print atlanta.previous_rising(ephem.Sun()) 
# print atlanta.next_setting(ephem.Sun()) 
atlanta.date = '2011/09/24 12:00' 
# print atlanta.previous_rising(ephem.Sun()) 
print atlanta.next_setting(ephem.Sun()) 
atlanta.date = '2011/09/25 12:00' 
print atlanta.previous_rising(ephem.Sun()) 
print atlanta.next_setting(ephem.Sun()) 
atlanta.date = '2011/09/26 12:00' 
print atlanta.previous_rising(ephem.Sun()) 
print atlanta.next_setting(ephem.Sun()) 

これにより、次の結果が得られます。

2011/3/18 07:49:34 
2011/3/18 17:44:50 
2011/3/19 05:04:49 
2011/3/19 21:49:23 
2011/3/20 01:26:02 
2011/9/24 19:59:09 
2011/9/25 04:57:21 
2011/9/25 17:14:10 
2011/9/26 08:37:25 
2011/9/26 14:03:20 

これは、USNO の結果の分に一致します。

https://raw.github.com/barrycarter/bcapps/master/db/srss-895.txt

リンクされた質問で私の関連する泣き言も参照してください。

于 2013-02-02T04:45:10.580 に答える
0

startパラメータ toobs.next_rising()などを使用すると、より良い結果が得られることがわかりました。ただし、特定の交差点を見逃しているように見えることがあります。見つかった上昇は、対応するセットと常にペアになるとは限りません。

于 2011-06-25T22:41:10.117 に答える