农历的编算规则和模拟计算

首先,网络上的很多资料根本没有进行去伪存真,有很多冗余但过于繁杂的规则,而且并不方便转化为计算程序。另一些则是混淆了不同的概念。

事实上,国家标准 GB/T 33661-2017《农历的编算和颁行》说得比较清楚,它的概念全部挂靠在天文学概念上,相当明确。不过我们还可以再做一点优化,还能减少一点引入的概念。

概念引入

  • 冬至。“日影最长”,日心、地心、黄极和真天极四点共平面的时间点之一。

    • 日心指的是太阳系的质心,地心指的是地球及其所有卫星的质心。黄极是过日心的地球公转平面的垂线上的一点,真天极是岁差章动模型中的章动参考极。

    • 以日心为极点、地球公转角动量为极轴建立的球坐标系中,地球坐标和地球自转角动量的黄经 \lambda (也就是普通球坐标系中的方位角 \theta )分量相同时即为冬至。

      \lambda_\oplus=L^\text{spin}_{\lambda, \oplus}
  • 朔。月心在日心与地心之间的时间点。

    • “之间”实际上强要求三点共线,但三点共线的另一个时间点是望。因此有必要分辨点在哪侧。

    • 事实上,没有任何规律能够要求地球和月亮的公转角动量总是共线。因此月心并不总是在黄道平面上,也即该条规则只需要考虑或者月心在黄道面上的投影在日地之间,或者在公转球坐标系中说,地月黄经相同即可。

    • 甚至大多数时候三点共线在黄纬的意义上都达不到。能达成的时候朔点一定在发生日食,而望点一定在发生月食,而且是全食或者环食,而不是偏食。

      \lambda_\odot = \lambda_\oplus, r_\odot < r_\oplus
  • 回归年是两次冬至的时间间隔。

  • 经过真春分点把太阳系的空间按照方位角即黄经进行大致 12 等分得到一些球楔体(sphere wedge),地心穿过这些球楔体的界面的时间点都是中气。

    • 精确地,在公转球坐标系中,地球坐标和地球自转角动量的黄经分量之差为 30 度的整数倍时,就是中气。

      \lambda_\oplus-L^\text{spin}_{\lambda, \oplus}=k \times 30^\circ\, (k \in \mathbb Z)
  • 朔望月是两次朔的时间间隔。

  • 存在中气的朔望月是平月,不存在中气的朔望月是闰月。

  • 存在冬至的朔望月是十一月。

基于地球自转周期的模拟计算

就直接用 excel 拉表。因为是周期运动,所以首先计算的是相位。
事实上所选取的周期函数是取小数部分 \{x\},周期为 1。Excel 中可以用函数 mod(B3, 1) 来实现。
代入如下数据:回归年 T_\oplus = 365.2422 , 朔望月 T'_\odot = 29.53059 。地球初相 \varphi_{0, \oplus} = -0.085 ,月球初相 \varphi_{0, \odot} = -0.1

在 A3 填入 Excel 计算式 = A2 + 1/H$1 ,用 A 列表示地球相位,其中 H$1A2 分别是回归年和地球初相,而地球相位为 0 时即冬至点。直接用匀速圆周运动近似了,可能在闰月分布上略有不准。值得一提的是,每行表示的是一整天的完成结算,所以冬至日,即包含冬至点的一个整天,应当用 该日结算时地球相位的小数部分,小于前一日结算时地球相位的小数部分 ,即 MOD(A34,1)<MOD(A33,1) 来判断。

在 B3 填入 = B2 + 1/H$2 ,用 B 列表示月球赝相位,其中 H$2B2 分别是朔望月和月球初相,而地球相位为 0 时即冬至点。之所以说是赝相位,因为这是月球绕地公转与地球绕日公转的耦合。
在 C3 填入 =INT(B3*12) ,用 C 列表示从给定的冬至日完成结算到该日完成结算所经过的中气数。
在 D3 填入 =IF(MOD(B3,1)>MOD(B4,1),MOD(C3-2,12)+1,D4) ,用 D 列表示农历月份。置闰规则“整个朔望月期间是否存在中气”导致月份编号的确定是在整个朔望月完成结算时确定的。确定了一个月份编号之后再向前回溯,把之前的每一天的月份数给填上,因此是一个反向的迭代。 MOD(C3-2,12)+1 完成了从中气数的统计到月份的最终确定的一个换算。这样的统计自动完成了置闰规则的判断。
在 E3 填入 =IF(MOD(B3,1)>MOD(B2,1),E2+1,1) ,用 E 列表示农历日期。每当一日完成结算时新捕获到一个朔,就意味着一个朔望月的完成结算。事实上每月 1 日都并不完全落在一个朔望月之内,而是分在一对相邻的朔望月之中。

D 列是向上迭代,而 E 列是向下迭代,这体现了一些复杂性。不过把表格往下一拉,拉他个 450 行,就能比较清楚了。
这个初相的设置其实相当有意思,就是说,月球初相是在朔点的前几天,而地球初相则使得冬至点在一个月底。因此模拟结果是出现闰腊月。

这里模拟的演算还是最简单的那一批。主要是正常的中学生也都只要求对圆轨道的行星运动进行运算,而椭圆运动……当作 366 段扇形用面积定律来估算倒是也能做,甚至有割有补,误差不算很大。

一些辨析

有的资料声称农历必须使用北京时间来制定,因为在地球各处的地方时不同,可能有的中气落在某个月底,而另一些中气则落在某个月初,这导致置闰都出现了不同,有的要闰五月有的要闰八月。事实上这忽视了一个基本原则:无论观察点设在太阳系的任何地方,只要伽利略相对性原理成立,那么中气和朔发生的先后顺序就不会颠倒;并且忽视了这个事实就是:农历 N 月 1 日,总是既有一部分时间在该段朔望月内,而另一部分时间在上一段朔望月内!因此哪怕一个中气发生在该地的地方时为 N 月 1 日,也可以把 N 月设定为闰月,而不是把 N-1 月设定为闰月。

有的挂历是那种月历,一个月四个星期多一点但要使用五到六行,前面有一个第 0 星期,后面有一个第 4 星期(或第 5 星期),这都是不完整的星期。每年买日历的看着这种东西应该都习惯了吧,何必非得央求日期和月份的完整。

事实上我更认同的规则是像这种挂历一样,把一日的朔点之后的部分叫做 N 月 0 日,而朔点之前的部分叫做(N-1)月 30 日(或 29 日)!同样,直接把朔望月的冬至后的部分叫做 0 月,而冬至前半段的叫做 12 月(或 13 月,闰月)。这种规则看起来更是一眼看到底,我算日历的时候也只觉得是何其简单乃尔。

如果按圆轨道近似,那么这相当于把回归年平均分为 12 份。但地球公转速率并不均匀,事实上 1 月的近日点速度较快,中气分布略微密集,7 月的远日点速度较慢,中气分布较稀疏。节气的定义还是为了确定太阳高度和太阳赤纬,所以在考虑地球公转并非圆轨道的精度下,仍然使用空间性质(角位移的每 30 度)来定义中气,而不是用时间性质(回归年的均分)来定义。

国家标准中是采取国际通行的习惯,即将真春分点定为黄经零度的标准,而不是将地球自转角动量的轴向或者地球椭圆轨道的长轴定为黄经零度。后两者分别是真冬至点和近日点。其实由于地球自转轴的进动和章动,真春分点和真冬至点这些东西都在飘,而因为各种星体之间引力带来的相互摄动,很难说在分辨出来地球轨道并非圆轨道的精度下,能不能判断出地球轨道仍然是个闭合曲线。但是用真春分点完成标定之后,直接把空间均匀分割来断定节气,这件事本身还是可以略有指摘的:真春分点标定的是春分时刻的地球自转轴向,但冬至时刻的地球自转轴向还是这个方向吗?这就是我在前文实际上把黄经分量之差为 30 度的整数倍当作中气具体定义的原因。

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...