4

現在の太陽高度が現在 ~0.0 である位置の経度を計算しています。これは、緯度の範囲を反復し、日の出時刻を(0.0, latitude)計算してから、時差 (分数時間) に 15 (太陽が地球表面上を「移動」する度数) を掛けて経度を計算することによって行われます。

計算された座標タプルから日の出時刻を計算すると、最低緯度は最高緯度と数分の時差を示します。この違いはどのように説明できますか?

の:

points=walk_the_earth()

外:

[-66.53673944994807, -65.0] 2012-08-21 12:07:04.748893
[-67.13184367865324, -64.5] 2012-08-21 12:07:05.666852
[-67.70314011722803, -64.0] 2012-08-21 12:07:06.541521
...
[-119.24775995314121, 64.0] 2012-08-21 12:08:45.536679
[-119.93103107437491, 64.5] 2012-08-21 12:08:47.770382
[-120.64480075612664, 65.0] 2012-08-21 12:08:50.152224

(時刻は UTC です)。コードは ~second で実行されます。

この違いの原因は何ですか?

コード

import math
import xephem

def longitude_from_latitude(lat):
    """
    Calculate the longitude at which Sun altitude is ~0.0.

    Args:
        lat: A float indicating the latitude to calculate longitude
            for.

    Returns:
        float
    """
    now = xephem.julianday.now()
    meridian = xephem.Observer(now.midnight.dublin, 0.0, lat)
    sun = xephem.Sun.fromobserver(meridian)
    transit = sun.transit(-1)
    # Calculate time difference between sun position and local time.
    delta_t = ((now - transit['rs_risetm']) * 24.0) * 15.0
    return delta_t


def walk_the_earth(resolution=0.5, minlat=-65.0, maxlat=65.0):
    """
    Calculate the coordinate at which Sun altitude is ~0.0 for
    a given range of latitudes.

    Args:
        resolution: A float indicating the number of points to
            return for the specified range of latitudes. 1.0 means
            that 1 longitude will be calculated for each real
            latitude, 0.5 means 2, etc.
        minlat: A float indicating the lowest latitude to start
            calculating.
        maxlat: A float indicating the highest latitude to 
            calculate up to.

    Returns:   
        list of longitude, latitude, xephem.Sun tuples.
    """
    now = xephem.julianday.now()
    lat = minlat
    points = []
    while True:
        if lat > maxlat:
            break
        lng = longitude_from_latitude(lat)
        # Create an Observer for longitude and latitude
        obs = xephem.Observer(now.dublin, lng, lat)
        sun = xephem.Sun.fromobserver(obs)
        points.append([lng, lat, sun])
        # sun.transit() calculates the rising, transit and setting times
        # of the sun at Observers location. The -1 argument specifies
        # that we consider sunrise to occur when the upper limb touches
        # the horizon (0 indicates center, 1 indicates lower limb).
        print points[-1], sun.transit(-1)['rs_risetm'].datetime()
        lat += resolution
    return points
4

3 に答える 3

1

1 時間あたり 15 度の補正を回避する、より直接的な方法が適していると思います。結局のところ、エフェメリスを持っているので、それを利用できます。

  1. 緯度と時間を選択してください
  2. a と b の 2 つの経度を選択します。一方は太陽が地平線の上にあり (高度 > 0、たとえば a)、他方は地平線より下になります (高度 < 0、b)。
  3. 二分探索を行います: a と b の中間の経度 c を選択し、そこで太陽の高度を計算します。
  4. その高度がゼロに十分近い場合は停止します: c が答えです
  5. 高度が 0 未満の場合は、b=c に設定します。それ以外の場合は a=c に設定します。
  6. 3へ

必要な緯度ごとにそれを行います。

機能していることを確認するには、分点で計算を行います。計算した経度はほぼ同じになるはずです (理由を理解していることを確認してください)。いずれかの至点でもう一度実行すると、経度はかなり変化するはずであり、アルゴリズムは北または南約 67 度に達すると失敗します (理由がわかりますか?)。

于 2012-08-21T19:42:49.493 に答える
1

NOAA の太陽計算機で、あなたのリストにある極北極点と極南極点の日の出時刻を調べました。緯度/経度と今日の日付を入力すると、投稿した表と同じ日の出時刻が得られましたが、計算機は日の出時刻を最も近い分にのみ与えるという条件付きです。

それにもかかわらず、あなたの質問が行に沿っていた場合、私のコードには何が問題なのですか? 答えは、ほとんどの場合、Nothing at allです。

しかし、あなたの質問が本当に日の出時刻と位置と日付の違いについて理解できていないのは何ですか? あなたの質問は、SOのトピックから真剣に外れています。

于 2012-08-21T14:12:45.203 に答える
-1

空の太陽の位置は一定ではありません。12 月の現地の見かけの正午は、平均的な現地の正午より数分早くなる可能性がありますが、6 月の現地の見かけの正午は、数分「遅れて」来る可能性があります。この「ぐらつき」は均時差によって予測されますが、これを正しく理解すれば、赤道から離れた場所でより顕著な効果が得られます。

于 2014-10-20T18:42:50.990 に答える