本文将使用非常理想化的模型粗略地计算白昼时间和正午时刻,并以此算出日出、日没的时间。
怎么算白昼时间?或者说,怎么算白昼时间占一天时间中的比例?算出太阳的周日平行圈(太阳在天球上运动的轨迹)有多大一部分在地平线以上就可以了(忽略太阳一天之内的公转以及地球自转的不均匀)。
想要算出这个比例,需要这两个量:
符号 | 含义 | Why? |
( delta ) | 太阳赤纬(太阳直射点纬度,北纬为正) | 夏天昼长,冬天昼短 |
( varphi ) | 当地纬度(北纬为正) | 北极极昼,南极极夜 |
如图,以北半球冬季为例,把天球、地平线和平行圈画出来,再作几条辅助线,通过几何关系来用 ( delta ) 和 ( varphi ) 表示要求的比例:
设天球的球心为 (O), 半径为 (1), 平行圈的圆心为 (O'), 太阳从 (A) 点升起,从 (B) 点落下,观察者不在极点。连接 (AB), (AO), (AO'), (BO), (BO').
取 (AB) 的中点 (M), 连接 (MO), (MO'). 易知 ( angle{OAO'} = -delta ), ( angle{MOO'} = varphi ).
设 ( angle{MO'A} = heta ), 则所求比例为 ( frac{2 heta}{360^{circ}} = frac{ heta}{180^{circ}} ).
( ecause OO'perp 平面 O'AB )
( herefore OO'perp O'M, OO'perp O'A )
( herefore O'O = sin{(-delta)}, O'A = cos{(-delta)} )
( herefore O'M = O'O cdot an{varphi} = sin{(-delta)} an{varphi} )
( herefore cos{ heta} = frac{O'M}{O'A} = frac{sin{(-delta)} an{varphi}}{cos{(-delta)}} = an{(-delta)} an{varphi} )
( herefore heta = arccos{( an{(-delta)} an{varphi})} )
( herefore frac{ heta}{{180}^{circ}} = frac{arccos{( an{(-delta)} an{varphi})}}{{180}^{circ}} )
得到昼长关于 ( delta ) 和 ( varphi ) 的表达式:
( mathrm{daytime} = frac{arccos{( an{(-delta)} an{varphi})}}{{180}^{circ}} cdot {24}^{mathrm{h}} ) ( (varphi eq pm {90}^{circ}) )
虽然这个式子是从「北半球冬季」这一种情况推出来的,但也适用于南半球和夏季(代入 ( -delta ) 和 ( -varphi ) 容易看出)。
……
那么问题来了:( delta ) 怎么求?还得画个球:
如图,天球的中心是地球,黄道和赤道相交,设春分点为 (E), 秋分点为 (E'), 太阳为 (S), 黄赤交角为 ( varepsilon ), 太阳地心黄经为 ( lambda ).
通过几何关系用 ( varepsilon ) 和 ( lambda ) 表示 ( delta ):
过 (S) 作大圆弧 (SS') 垂直于赤道交赤道于 (S') ( 图示位罝 ).
跟据球面三角形正弦定理,在球面 ( riangle{SES'} ) 中,有:
( frac{sin{(-delta)}}{sin{varepsilon}}=frac{sin{(-lambda)}}{sin{{90}^{circ}}} )
( sin{delta} = sin{lambda}sin{varepsilon} )
( delta = arcsin{(sin{lambda}sin{varepsilon})} )
这个式子也是适用于各种情况的。
……
问题又来了,( lambda ) 怎么求?这就不用画球了,也没球可画了。一是可以直接用轨道参数去算,二是可以先搞到各节气的日期,然后在邻近的两个节气间进行线性插值。
联立以上各式,可得白昼时间关于纬度和太阳黄经的表达式:
( mathrm{daytime} = {24}^{mathrm{h}}cdotfrac{arccos{( an{(-arcsin{(sin{lambda}sin{varepsilon})})} an{varphi})}}{{180}^{circ}} ) ( (varphi eq pm {90}^{circ}) )
或
( mathrm{daytime} = {24}^{mathrm{h}}cdot(1-frac{arccos{( an{(arcsin{(sin{lambda}sin{varepsilon})})} an{varphi})}}{{180}^{circ}}) ) ( (varphi eq pm {90}^{circ}) )
或
( mathrm{daytime} = {24}^{mathrm{h}}cdot(1-frac{arccos{frac{sin{lambda}sin{varepsilon} an{varphi}}{sqrt{1-sin^2{lambda}sin^2{varepsilon}}}}}{{180}^{circ}}) ) ( (varphi eq pm {90}^{circ}) )
北纬 ( {36.5}^{circ} ) 的白昼时间关于太阳黄经的变化情况如下图:
看起来特别像正弦曲线,尝试拟合一下:
( mathrm{daytime} approx {12}^{mathrm{h}} cdot [(1-frac{arccos{( an{varepsilon} an{varphi})}}{{90}^{circ}})cdot sin{lambda} + 1] ) ( (varphi eq pm {90}^{circ}) )
看看误差:
最大误差 ( pm 6 mathrm{min} ), 效果比较一般,表达式也没简化多少,看来还是得用原式。
有了白昼时间,日出日没时刻可用下面两式计算:
( T_{sunrise} = T_{noon} - frac{mathrm{daytime}}{2} ) (1)
( T_{sunset} = T_{noon} + frac{mathrm{daytime}}{2} ) (2)
问题又来了,正午 ( T_{noon} ) 不一定是 12:00:
首先,区时和地方时之间有可能会差不少,这会导致正午时刻偏离 12:00.
其次,由于太阳运动的不均匀(均時差),正午时刻也会偏离 12:00.
这两个效应会叠加。第一个问题好解决,只要知道时区中央经线的经度和当地的经度,就万事大吉了。第二个就不大好算了。《天文算法》中给出了一个近似公式(我把高阶项都扔掉了):
( E' = T_{mean}-T_{true} = 4 cdot [ an^2{(frac{varepsilon}{2})}cdot sin{2L}+2ecdot sin{(L-varpi)} ] ) ( E' 的单位为分钟 )
其中 (L) 为太阳平黄经(即平太阳黄经,(假想的)平太阳以一个回归年为周期在黄道上做匀速圆周运动。可以近似地认为它等于上个春分和今天之间差的天数(或再乘以平太阳的角速度 ( frac{{360}^{circ}}{{365.2422}^{mathrm{d}}} ) )),(e) 为地球轨道离心率,( varpi ) 为地球近日点(日心)黄经。(e approx 0.0167 ) 和 ( varpiapprox {102.982}^{circ} ) 在短时间内可看作常数。
作图((E) 关于 (L) 的变化情况):
现在要求正午时间,令 ( T_{true} = 12:00 ), 解得:
( T_{mean}=12:00+E' )
补上区时和地方时的偏差,最终得到:
( T_{noon}=12:00 + 4^{mathrm{m}}cdot(L_{zone}-L_{local}) + 4^{mathrm{m}} cdot [ an^2{(frac{varepsilon}{2})}cdot sin{2L}+2ecdot sin{(L-varpi)} ] )
其中 ( L_{zone} ) 和 ( L_{local} ) 分别为时区中央经线的经度和当地的经度(东经为正)。
至此,大功告成,用 (1) 和 (2) 计算日出日没就可以了。