以文本方式查看主题

-  中华农历论坛  (http://bbs.nongli.net/index.asp)
--  历法知识  (http://bbs.nongli.net/list.asp?boardid=2)
----  历术甲子篇  (http://bbs.nongli.net/dispbbs.asp?boardid=2&id=63311)

--  作者:xjw01
--  发布时间:2014/5/2 21:56:00
--  历术甲子篇

《史记·历书》推算原理及方法

2014年5月1日,于家里,许剑伟
1、历日周期性:
回归年与朔望月的比值是12+7/19=235/19
史记历书规定回归年为365+1/4,那么朔望月为(365+1/4)*(19/235)=29+499/940
三统历规定朔望月为29+43/81,那么回归年是(29+43/81)*(235/19)=365+385/1539
2、难以消除的误差:
不管是三统历还是史记历术,他们都认一个理,那就是235月等于19年时长。这就会出现严格的19年7闰历谱现象。
因此,只要给出回归年与朔望月中的一个,就可以推导出另一个值。
如果给定值足够精确,那么另一个的精度决定于19年7闰理论的精度。
19年7闰的参数即为235/19,相对误差约为13ppm,那么,对于8万个历日(约220年),将产生1日“朔”或“气”的计算误差。
当然,给定的那个周期值,也有误差不少误差,所以历谱与天象的吻合度还会下降。
史记历书的历元也不准,这也会引起额外误差,不过,这种误差没有“积累性”
3、排历:
史记历书人为规定,阴历与阳历的记时起点是相同的,始于某一天晚上12:000,这一天可能是在公元前104年冬至。
在这一天,日月合朔,在这同一时刻,太阳也到了冬至点。
司马迁等,可能没有找到这么巧合的一天。但历书总得写下去,及B104年冬至还是个不错的选择。
接下来,阴历(朔日)、阳历(节气)分别用上述定义好的周期线性外推。实际上就是朔日等差序列和节气等差序列。
推出这两个等差序列后,按照无中置闰法排历谱即可。
4、关于演算过程
史记历书只给出演算的中间结果,没有给出演算过程。
现在使用计算机演算,建议用等差序列计算即可,直接分数运算,这样会更方便一些。
5、关于译文以及后人的详尽讲解
很多书籍,用古法复算并解释,同时采用了大量古代数学上的“术语”,与现代数学差别较大,粗读,还是象“武功秘籍”
6、本文算法:等差序列

以下内容为程序代码:


<input id=nHao type=hidden
value="焉逢摄提格,太初元年。
端蒙单阏,太初二年。
游兆执徐,太初三年。
强梧大荒落,太初四年。
徒维敦牂,天汉元年。
祝犁协洽,天汉二年。
商横涒滩,天汉三年。
昭阳作鄂,天汉四年。
横艾淹茂,太始元年。
尚章大渊献,太始二年。
焉逢困敦,太始三年。
端蒙赤奋若,太始四年。
游兆摄提格,征和元年。
强梧单阏,征和二年。
徒维执徐,征和三年。
祝犁大芒落,征和四年。
商横敦牂,后元元年。
昭阳汁洽,后元二年。
横艾涒滩,始元元年。
尚章作噩,始元二年。
焉逢淹茂,始元三年。
端蒙大渊献,始元四年。
游兆困敦,始元五年。
强梧赤奋若,始元六年。
徒维摄提格,元凤元年。
祝犁单阏,元凤二年。
商横执徐,元凤三年。
昭阳大荒落,元凤四年。
横艾敦牂,元凤五年。
尚章汁洽,元凤六年。
焉逢涒滩,元平元年。
端蒙作噩,本始元年。
游兆阉茂,本始二年。
强梧大渊献,本始三年。
徒维困敦,本始四年。
祝犁赤奋若,地节元年。
商横摄提格,地节二年。
昭阳单阏,地节三年。
横艾执徐,地节四年。
尚章大荒落,元康元年。
焉逢敦牂,元康二年。
端蒙协洽,元康三年。
游兆涒滩,元康四年。
强梧作噩,神雀元年。
徒维淹茂,神雀二年。
祝犁大渊献,神雀三年。
商横困敦,神雀四年。
昭阳赤奋若,五凤元年。
横艾摄提格,五凤二年。
尚章单阏,五凤三年。
焉逢执徐,五凤四年。
端蒙大荒落,甘露元年。
游兆敦牂,甘露二年。
强梧协洽,甘露三年。
徒维涒滩,甘露四年。
祝犁作噩,黄龙元年。
商横淹茂,初元元年。
昭阳大渊献,初元二年。
横艾困敦,初元三年。
尚章赤奋若,初元四年。
焉逢摄提格,初元五年。
端蒙单阏,永光元年。
游兆执徐,永光二年。
强梧大荒落,永光三年。
徒维敦牂,永光四年。
祝犁协洽,永光五年。
商横涒滩,建昭元年。
昭阳作噩,建昭二年。
横艾阉茂,建昭三年。
尚章大渊献,建昭四年。
焉逢困敦,建昭五年。
端蒙赤奋若,竟宁元年。
游兆摄提格,建始元年。
强梧单阏,建始二年。
徒维执徐,建始三年。
祝犁大荒落,建始四年。">
<script language.javascript>
var nh = nHao.value;
nh = nh.split(\'\\r\\n\'); //年号
var Q=[], S=[]; //气朔表
var kq = 1461/96;   //气时间间距365.25/24;
var ks = 27759/940; //朔时间间距29+499/940;

function Qda(k){ return Math.floor(k*kq+0.1/96 ); } //计算第k个气
function Sda(k){ return Math.floor(k*ks+0.1/940); } //计算第k个朔

function calc(y){
 var i,j,n;
 //气日计算
 n = y*24; //气起算序数
 for(i=0;i<24;i++) //24节气
   Q[i] = Qda(n+i);
 //朔日计算
 n = Math.floor(Q[0]/ks+0.5); //朔起算序数
 if(Sda(n)>Q[0]) n--;
 for(i=0;i<14;i++) //14朔
   S[i] = Sda(n+i);

 //排历
 var nun,dx,zq,dz,s;
 dz = (((y*24*kq)%1)*24).toFixed(3);
 s = nh[y]
   + y+\'年,积\'+n+\'月。\'
   + \'冬至\'+dz+\'时<br>\'
   + \'月份,月首积日,本月天数,中气<br>\';

 for(i=j=0;i<13&&j<24;i++,j+=2){
  if(S[i+1]<=Q[j]) nun = \'闰\', zq = \'-\', j-=2; //闰月
  else             nun = \'\',   zq = Q[j]-S[i]+1;
  dx = S[i+1]-S[i]; //本月天数
  s += ((j/2+10)%12+1)+\'月 \'+ S[i]+\' \'+dx+\' \'+zq+nun+\'<br>\';
 }
 //输出
 document.write(s);
}

calc(0); //计算第1年
calc(2); //计算第3年


</script>

 


--  作者:浪-淘-沙
--  发布时间:2014/5/5 12:55:00
--  
正因为一直坚持235朔望月与19回归年等长,所以古代的历谱运行一段时间就会失天。(即使起始点是精确的,而实际上起始点也确实有误差。)////////////
所以古代的历法版本很多,大多是修正失天现象,以便历谱更密合天象。少数是修正历算理论。