
日の出方程式または日の入り方程式を使用すると、日の出と日の入りが実際に発生する現地の太陽時に基づいて、 任意の太陽赤緯と緯度に対する日の出または日の入りの時刻を導き出すことができます。
処方
それは次のように定式化されます:
どこ:
原則
地球は1 時間あたり 15° の角速度で自転しています。したがって、 という式(単位は度) は、日の出から現地太陽正午まで、または現地太陽正午から日没までの時間間隔を時間単位で表します。
符号規則は通常、観測緯度が赤道で 0 となり、北半球では正、南半球では負となり、太陽赤緯は太陽が赤道の真上にある春分と秋分では 0 となり、北半球の夏には正、北半球の冬には負となります。
上記の式は、北極圏と南極圏の間の緯度に常に適用されます。北極圏の北または南極圏の南では、1 年に少なくとも 1 日は日の出または日の入りがありません。正式には、北半球の夏には に、北半球の冬には に日の出または日の入りがあります。これらの緯度外の場所では、24 時間昼または 24 時間夜間になります。
太陽時角の表現
冒頭に示した式では、左辺の余弦関数は範囲 [-1, 1] 内の結果を返しますが、右辺の式の値は範囲 内にあります。Fortran 90の形式で に適用可能な式は次のとおりです。
オメガ = acos(max(min(-tan(デルタ*rpd)*tan(ファイ*rpd), 1.0), -1.0))*dpr
ここで、omegaoは度、deltaは度、phiは度、rpdは、dprは に等しくなります。
上記の式は、範囲 の度で結果を返します。 のときは、極夜、つまり 0 時間の昼光であることを意味します。 のときは、極昼、つまり 24 時間の昼光であることを意味します。
半球関係
が北半球の与えられた緯度で、が負の値を持つ対応する日の出時間角であり、同様に、が南半球の同じ緯度で、つまり であり、が対応する日の出時間角であるとすると、次のことがわかります。
- 、
つまり
- 。
上記の関係は、同じ日に、との場合、日の出から日の入りまでの昼間の長さの合計が 24 時間になることを意味し、これは極昼と極夜が発生する地域にも当てはまります。これはさらに、大気の屈折の影響を考慮せずに、任意の日の昼間の長さの世界平均が 12 時間であることを示唆しています。
一般化方程式

上記の式は、大気の屈折(太陽の円盤が地平線上にあるときに約 0.6° 上昇し、空に高く見えるようになる)の影響と、太陽の円盤が張る非ゼロの角度(太陽の見かけの直径)(約 0.5°)を無視しています。天文暦に記載されている太陽の上部の昇りと沈みの時刻は、より一般的な式を使用してこれを補正します。
太陽面の中心の 高度角(a)は約−0.83°(または−50分角)に設定されます。
上記の一般的な方程式は、他の太陽高度にも使用できます。NOAA は、これらの他の高度での屈折補正のための追加の近似式を提供しています。[1]また、米国海軍天文台の「ベクトル天文学ソフトウェア」で使用されている GG Bennett による非区分式などの代替式もあります。[2]
地球上での計算を完了
一般化された方程式は、方程式自体を計算する前に計算する必要がある他の多くの変数に依存しています。これらの方程式では、太陽地球定数が度数で表された角度定数に置き換えられています。
現在のユリウス日を計算する
どこ:
- 2000 年 1 月 1 日 12:00 からの日数です。
- はユリウス日です。
- 2451545.0 は、2000 年 1 月 1 日 12:00:00 のユリウス日のユリウス年と同等です。
- 0.0008 は、うるう秒と地球時間(TT)のユリウス日の部分数です。
- TT は、1958 年 1 月 1 日にTAIより 32.184 秒遅れに設定されました。1972年にうるう秒が導入されると、10 秒が追加されました。2017 年 1 月 1 日までに、さらに 27 秒が追加され、合計 69.184 秒になりました。DUT1 がない場合、0.0008=69.184 / 86400です。
- この操作により、次の整数日数 n に切り上げられます。
平均太陽時
どこ:
- 平均太陽時の近似値であり、日数分の整数で表されます。
- 地球上の観測者の経度(西が負、東が正)です。
太陽平均偏差
どこ:
- M は次の 3 つの式で使用される太陽の平均異常です。
中心の方程式
どこ:
- C はラムダを計算するために必要な中心値の方程式です(次の方程式を参照)。
- 1.9148は、観測者がいる惑星(この場合は地球)の中心の方程式の係数です。
黄道経度
どこ:
- λは黄道経度です。
- 102.9372 は近日点引数の値です。
太陽通過
どこ:
太陽の赤緯
どこ:
- 太陽の赤緯です。
- 23.4397°は地球が太陽に対して傾く最大の角度である[3]
あるいは、太陽の赤緯は次のように近似できる[4]。
どこ:
- d は春分(通常は 3 月 21 日)からの日数です。
時角
これは、大気の屈折と太陽の円盤の直径を補正した上記の式です。
どこ:
観測者の仰角補正が必要な海面上の観測では、分子の正弦項の −0.833° に、またはを加えます。これにより、見かけの傾斜と地上の屈折の両方が補正されます。たとえば、10,000 フィートの観測者の場合、−0.833° に (−115°/60) つまり約 −1.92° を加えます。[5]
日の出と日の入りを計算する
どこ:
- J昇りは実際のユリウス暦の日の出日です。
- Jセットは実際のユリウス暦の日没日です。
Pythonでの実装例
#!/usr/bin/env python3
datetimeからロギングを
インポートします。datetime 、timedelta 、timezone 、tzinfo をインポートします。mathからacos 、asin 、ceil 、cos 、degrees 、fmod 、radians 、sin 、sqrt をインポートします。timeからtimeをインポートします。
log = ログ記録.getLogger ( )
def _ts2human ( ts : int | float , debugtz : tzinfo | None ) -> str :
return str ( datetime . fromtimestamp ( ts , debugtz ))
def j2ts ( j : float | int ) -> float :
return ( j - 2440587.5 ) * 86400
def ts2j ( ts : float | int ) -> float :
戻り値 ts / 86400.0 + 2440587.5
def _j2human ( j : float | int , debugtz : tzinfo | None ) -> str :
ts = j2ts ( j )
return f ' { ts } = { _ts2human ( ts , debugtz ) } '
def _deg2human ( deg : float | int ) -> str :
x = int ( deg * 3600.0 )
num = f '∠ { deg : .3f } °'
rad = f '∠ { radians ( deg ) : .3f } rad'
human = f '∠ { x // 3600 } ° { x // 60 % 60 } ′ { x % 60 } ″' return f ' { rad } = { human } = { num } '
def calc (
current_timestamp : float ,
f : float ,
l_w : float ,
elevation : float = 0.0 ,
* ,
debugtz : tzinfo | None = None ,
) -> タプル[ float , float , None ] | タプル[ None , None , bool ]:
log . debug ( f '緯度 f = { _deg2human ( f ) } ' )
log . debug ( f '経度 l_w = { _deg2human ( l_w ) } ' )
log . debug ( f '現在 ts = { _ts2human ( current_timestamp , debugtz ) } ' )
J_date = ts2j ( current_timestamp )
log . debug ( f 'ユリウス日 j_date = { J_date : .3f }日' )
# ユリウス日
# TODO: ceil ?
n = ceil ( J_date - ( 2451545.0 + 0.0009 ) + 69.184 / 86400.0 )
log . debug ( f 'ユリウス日 n = { n : .3f }日' )
# 平均太陽時
J_ = n + 0.0009 - l_w / 360.0
log . debug ( f '平均太陽時 J_ = { J_ : .9f }日' )
# 太陽平均異常
# M_degrees = 357.5291 + 0.98560028 * J_ # 同じだが見栄えが悪い
M_degrees = fmod ( 357.5291 + 0.98560028 * J_ , 360 )
M_radians = radians ( M_degrees )
log . debug ( f '太陽平均異常 M = { _deg2human ( M_degrees ) } ' )
# 中心の方程式
C_degrees = 1.9148 * sin ( M_radians ) + 0.02 * sin ( 2 * M_radians ) + 0.0003 * sin ( 3 * M_radians )
# 最終的なプログラム結果の差は数ミリ秒です
# https://www.astrouw.edu.pl/~jskowron/pracownia/praca/sunspot_answerbook_expl/expl-4.html
# e = 0.01671
# C_degrees = \
# degrees(2 * e - (1 / 4) * e ** 3 + (5 / 96) * e ** 5) * sin(M_radians) \
# + degrees(5 / 4 * e ** 2 - (11 / 24) * e ** 4 + (17 / 192) * e ** 6) * sin(2 * M_radians) \
# + 度(13 / 12 * e ** 3 - (43 / 64) * e ** 5) * sin(3 * M_radians) \
# + 度((103 / 96) * e ** 4 - (451 / 480) * e ** 6) * sin(4 * M_radians) \
# + 度((1097 / 960) * e ** 5) * sin(5 * M_radians) \
# + 度((1223 / 960) * e ** 6) * sin(6 * M_radians)
log . debug ( f '中心の方程式 C = { _deg2human ( C_degrees ) } ' )
# 黄道経度
# L_degrees = M_degrees + C_degrees + 180.0 + 102.9372 # 同じですが、見栄えが悪いです
L_degrees = fmod ( M_degrees + C_degrees + 180.0 + 102.9372 , 360 )
log . debug ( f '黄道経度 L = { _deg2human ( L_degrees ) } ' )
Lambda_radians = ラジアン( L_degrees )
# 太陽通過(ユリウス日)
J_transit = 2451545.0 + J_ + 0.0053 * sin ( M_radians ) - 0.0069 * sin ( 2 * Lambda_radians )
log . debug ( f '太陽通過時間 J_trans = { _j2human ( J_transit , debugtz ) } ' )
# 太陽の赤緯
sin_d = sin ( Lambda_radians ) * sin ( radians ( 23.4397 ))
# cos_d = sqrt(1-sin_d**2) # まったく同じ精度ですが、1.5 倍遅くなります
cos_d = cos ( asin ( sin_d ))
# 時角
some_cos = ( sin ( radians ( - 0.833 - 2.076 * sqrt ( elevation ) / 60.0 )) - sin ( radians ( f )) * sin_d ) / ( cos ( radians ( f )) * cos_d )
try :
w0_radians = acos ( some_cos )
except ValueError :
return None , None , some_cos > 0.0
w0_degrees = degrees ( w0_radians ) # 0...180
log .debug ( f '時角 w0 = { _deg2human ( w0_degrees ) } ' )
j_rise = J_transit - w0_degrees / 360
j_set = J_transit + w0_degrees / 360
log . debug ( f '日の出 j_rise = { _j2human ( j_rise , debugtz ) } ' ) log . debug ( f '日の入り j_set = { _j2human ( j_set , debugtz ) } ' ) log . debug ( f '日の長さ { w0_degrees / ( 180 / 24 ) : .3f }時間' )
j2ts ( j_rise )、 j2ts ( j_set )、 Noneを返す
def main ():
logging.basicConfig ( level = logging.DEBUG ) latitude = 33.00801longitude = 35.08794elevation = 0print ( calc ( time ( ) , latitude , longitude , elevation , debuggtz = timezone ( timedelta ( hours = 3 ) , ' fake -zone' ) ) )
__name__ == '__main__'の場合:
main ()
参照
参考文献
- ^ NOAA (米国商務省)。「太陽計算の詳細」。ESRL地球監視研究所 - 地球の放射線とエアロゾル。
- ^ 「六分儀高度の補正表」www.siranah.de。
- ^ 「地球ファクトシート」。
- ^ Sayigh, AAM (1979).太陽エネルギーの基礎. ペルガモン・プレス. ISBN 978-0-08-024744-1。
- ^ これらの数字の正確な出典を突き止めるのは困難ですが、「地平線の傾斜に関する注記」には、1 つ重要度の低い数字が記されており、シリーズの別のページでは -2.075 と記されています。
外部リンク
- あらゆる場所の日の出、日の入り、太陽の位置 – 米国のみ
- 世界中のあらゆる場所の日の出、日の入り、昼の長さ
- 日の出/日の入り/太陽面通過/薄暮データ – 米国のみ
- 天文情報センター
- ユリウス暦とグレゴリオ暦の日付の変換
- おおよその太陽座標
- 天文現象を計算するアルゴリズム
- 天文学の答え: 太陽の位置
- 均時差を表す簡単な表現
- 均時差
- 均時差
- 太陽、月、北極星の長期暦 V1.11
- 現在の大気屈折モデルの日の出と日の入りの時刻予測における有効性の評価
