中华农历论坛知识讨论区历法知识 → 关于农历算法的一些讨论


  共有41898人关注过本帖树形打印

主题:关于农历算法的一些讨论

帅哥哟,离线,有人找我吗?
历用五百年
  1楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游民 帖子:30 积分:324 威望:0 精华:0 注册:2006/11/13 14:35:00
关于农历算法的一些讨论  发帖心情 Post By:2006/11/27 17:25:00

首先,我们要确定一个时刻,作为一天的起点(包括这个时刻)。然后我们以月亮通过朔望交界点的那一天作为每个月的第一天,以太阳通过雨水点的那个月作为正月,依次的,以太阳通过各中气点的那个月作为二月、三月等等。
经过长期的观察之后,我们就会发现每个月不是29天就是30天,每年不是12个月就是13个月,每个中气点唯一对应一个月,但是有的月却没有中气。
为了制定我们的历法,我们至少要知道足够精度的朔望月长度,记为ML,和两个中气的间隔时间记为YL,这两个值经过前人长期不懈的观测和计算,我们知道分别为29.5306日和30.4377日。接下来,我们要随便找到某一年,以太阳通过雨水点的时刻到那一年开始的那个时刻的时间,记为DY,以日为单位,还要找出这一年正月里,月亮通过朔望交界点的时刻到那一月开始的那个时刻的时间,记为DM,以日为单位。这两个值是要通过实地观测得出来的。
这个时候,我们就可以通过递推来制订我们的历法,以预测未来月球和太阳的运行情况,并进一步预测月相的变化和气候的变化。

在本算法中我们使用了三个近似处理:
每天的长度总是一样的;
每个朔望月的长度总是一样的;
每两个相邻中气的时间总是一样的。

接下来,我们就逐月推算每月的大小:
Select Case Fix(DM + ML)
    Case is = 29
        The month have 29 days.
 The DM of next month is DM + ML - 29.
    Case is = 30
        The month have 30 days.
 The DM of next month is DM + ML - 30.
End Select

每年中各月的月份、是否为闰月
For i = 1 to 12
This month has A days.
If DY>=A Then
    This month is an Extra Month.
    DY = DY - A
Else
    This month is the i Month.
    DY = DY + YL - A
    i = i + 1
End If
Next

这就是我们的核心算法。通过它,我们可以从任何一个包含中气的月份开始向后推算各月各年的情况。
由于我们所用的DM、DY、ML、YL都是近似值,若干年后,我们的历法必有偏差,我们只要重新观测,更新DM、DY、ML、YL的值就可以了。事实上,诸朝气数最多不过400年,在这些值精确到万分位的时候,通行一朝是完全可以的。

下面对大小月的排列和闰月的出现作一些定性分析
显然0≤DM<1,那么
    DM<0.4694时,当月为小月,下月为大月
    DM≥0.4694时,当月为大月
        DM<0.4694 * 2时,下月为小月,下下月为大月
        DM≥0.4694 * 2时,下月亦为大月,下下月为小月
所以,大小月一般是交替出现,有时会出现连续两个月是大月的情况,但不会出现连续三个月或更多的是大月的情况,也不会出现连续两个月更多的是小月的情况。也就是说,一般是小月大月相继出现一段时间后,接着就出现一个大月,然后又是小月大月相继出现,具体的间隔也不定,大家可以通过计算机推算后,找点规律出来。

一年中最少有十二个月,因为YL * 12 (代表十二个中气循环一次的时间)> ML * 12 (代表十二个朔望月的时间) + 1 (第一个月的DM总小于1),最多有十三个月,因为30(第一个月的DY总小于30) + YL * 12 < ML * 14。两个相邻中气的间隔时间大于30,所以一个月不可能有两个中气,那么一年有十二个月的时候,12个中气必然刚好依次各居一个月,这一年就称为平年,一年有十三个月的时候,必然有且仅有一个月没有中气,那个月就时闰月,这一年就称为闰年。平年的时候,根据大小月的排列规则,一年最多有8个大月,最少有6个大月,因为ML * 12 + 1 < 30 * 8 + 29 * (12 - 8),所以不可能有8个大月,最多为7个大月,那么一年就为354或355天。闰年的时候,根据大小月的排列规则,一年最多有9个大月,最少有6个大月,因为ML * 13 + 1 < 30 * 8 + 29 * (13 - 8),所以不可能有8个或更多的大月,最多为7个大月,那么一年就为383或384天。

因为每月的天数不固定,所以闰月的出现规律也不好讨论,连续十二个月的天数也不固定,所以闰年的出现规律也不好讨论。不过可以肯定是,每年的第一个月肯定不是闰月,因为我们是以包含中气雨水的月份作为正月,也就是每年的第一个月的。所以,闰月必定出现在某个有名字的月份后面,出现在哪个后面就叫闰哪月。


支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
萧铁
  2楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游民 帖子:41 积分:284 威望:0 精华:0 注册:2006/8/17 7:29:00
  发帖心情 Post By:2006/11/28 8:10:00

> 在本算法中我们使用了三个近似处理:
> 每天的长度总是一样的;        ... (1)
> 每个朔望月的长度总是一样的;    ...(2)
> 每两个相邻中气的时间总是一样的。.. (3)

头两个假设问题应不大, 尤其如果平均值是从足够长的周期导出, 如此应有在该周期内最大误差值的数据, 但文中看不到这方面的分析.
第三个假设问题就大了. 原因是现时夏/冬至是在近/远日点附近, 地球绕太阳运转速度在近(远)日点是最慢(快). 所以, 如果将黄道等分(节气的根据), 在近/远日点附近地球行经两个节气点之间的时间可有多达2天的差异. 我手上有个数据: 春分到秋分是186天, 夏至至小暑的时间是31.44天; 秋分到春分是179天, 冬至时只有29天左右. 这也解释了为什么闰月不见发生在十一/十二月.


支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
历用五百年
  3楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游民 帖子:30 积分:324 威望:0 精华:0 注册:2006/11/13 14:35:00
  发帖心情 Post By:2006/11/30 11:16:00

那么,设置一个长度为12的数组

将12个中气的间隔时间填入其中


支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
萧铁
  4楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游民 帖子:41 积分:284 威望:0 精华:0 注册:2006/8/17 7:29:00
  发帖心情 Post By:2006/12/2 6:20:00

用组数或函数处理都可以, 不过要知道它们的局限性. 我前帖提到"现时夏/冬至是在近/远日点附近", 意思是这并不是永恒不变的. 引起变动的其中一个重要原因是岁差. 而引起岁差的机制应可说现已了解清楚, 但这不等於很容易弄出个模型/程式来, 况且还有其他一些不能用岁差解释的扰动尚不完全明白其机制. 说到这里, 想起古人从观象授时到历法推步, 不断创新细化推步技术固然是一种进步, 今天也许不需要观象授时, 但肯定还要观象对时, 所以说到底, 关键一是无论是组数还是函数, 其中使用的数据怎么来; 二是最好先把如何应对微调的问题想清楚, 预先设计好简易的方法放进算法中去.

我不知你搞这个算法的目的是什么, 或许是学校的功课吧? 其实, 类似算法网上可以搜到, 也有的已作成网站工具, 再重新弄一个正是所谓的re-invent the wheel, 不知比现有的强在那里. 换个角度看, 在现今孔雀绿和苏丹红都成了常用词的时代, 老实说我对这些一无监管二无认证的所谓算法的准确性是十分怀疑的. 如果真想搞些认真/有用的研究, 倒不如想想如何验证这些已发表的算法/工具的正确性, 这个题目不仅更有即时的价值, 且更具挑战性.


支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
hst0518
  5楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:2 积分:202 威望:0 精华:0 注册:2006/12/3 12:51:00
  发帖心情 Post By:2006/12/3 13:03:00

如果真想搞些认真/有用的研究, 倒不如想想如何验证这些已发表的算法/工具的正确性, 这个题目不仅更有即时的价值, 且更具挑战性.

支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
历用五百年
  6楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游民 帖子:30 积分:324 威望:0 精华:0 注册:2006/11/13 14:35:00
现有的农历算法  发帖心情 Post By:2006/12/3 13:21:00

现有的农历算法只是把各年的信息放在一个数组里

然后直接调出来显示

而且只有100年的

我需要的是从西汉到清末的信息

包括是否闰年,闰几月,每月多少天


支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
萧铁
  7楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游民 帖子:41 积分:284 威望:0 精华:0 注册:2006/8/17 7:29:00
  发帖心情 Post By:2006/12/5 6:40:00

还是这句话: 怎么验证你指使电脑所产生出来的信息正确无误才是关键, 否则就只能是garbage-in garbage-out. 如果如你说还想囊括从西汉到清末, 那这"正确"两字的含义就更复杂了. 比如说, 如果要能使用此算法结果去查找史书上说的某一天是对应公历何日(或反过来查), 那得根据当时使用的即使是不准确的历法来定年月日, 而不是纯粹根据我们现在的"正确"模型去反推, 或可说是要"正确地"犯[当时所使用那种历法同样的]错误. 月绕地、地绕日这事虽说都属"不以人们的意志为转移"一类, 但化成历法的年月日却是帝皇们一个命令就可从改变的. 汉武帝改行太初历, 那年就有16个月. 应该承认西方在这方面比较进步, 但原则是相同的. 公历在儒略历改格里历时就少了十日. 总之, 这事儿嘛, 比较起所需的背景知识, 编程式是再简单不过了. 如天官书/律历志里那些用文言写成的算法, 就算专攻文史哲的教授也不一定看得懂, 更遑论将之编成程式了. 公元前841年起的历代编年对应公历年份如今已完全确定, 很多书都可以找到. 但要准确到日、时, 有此必要吗? 前辈专家们(有些已是院士级的)花了几十年功夫, 当然拥有必要的知识积累, 但你如果没有机会"站在他们的肩膀上", 恐怕连门儿都未摸到. 而所需要的投入又是否值得? 动手之前不妨先再多想想.

支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
历用五百年
  8楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游民 帖子:30 积分:324 威望:0 精华:0 注册:2006/11/13 14:35:00
  发帖心情 Post By:2006/12/7 19:52:00

《史记-历书第四》上明明写着太初元年12个月嘛

怎么乱说有16个月呢,这样子改历当时的老百姓怎么习惯呢?

《汉书-律历志》里并没有提供具体的算法,倒是《史记-历书第四》里以《太初历》为例具体讨论了当时的历法,只可惜对每月的大小没有进一步说明。

 

*******************************

编辑一下,以免其他朋友误解.

 

史记里历术甲子篇,已经被后人更改过,并非太史公的原作.

太史公的原作,是没有"太初"字样的.

太史公大约卒于武帝末年.

但实际上,我们看到的史记历术甲子篇,武帝之后的帝王年号都标注上去了.难道太史公是神仙,知道后世的帝王的年号?

 

太初元年是甲寅年.

 

而历术甲子篇中的元年是丁丑年.这也说明,太史公记述的并非一部<太初历>.


支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
历用五百年
  9楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游民 帖子:30 积分:324 威望:0 精华:0 注册:2006/11/13 14:35:00
  发帖心情 Post By:2006/12/7 19:56:00

至日点和近/远日点本来就不相干,只是位置很近而已

把它们扯在一起会让别人更混淆的


支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
历用五百年
  10楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游民 帖子:30 积分:324 威望:0 精华:0 注册:2006/11/13 14:35:00
  发帖心情 Post By:2006/12/7 20:05:00

我写的算法是:

向后推算,实时修正

即只管以后的情况,让以后来验证正确性

发现了偏差,马上用新的参数填补

而且在保证参数的精确度为万分之一的情况下,每次修改后用五百年应该是可以的

因为历来诸朝的气数都超不过500年


支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
总数 17 1 2 下一页

返回版面帖子列表

关于农历算法的一些讨论








签名