以下两个函数比“平公式”要精确得多。平均误差在15分钟以内。
用它计算普通的万年历是足够的。你还可以认真分析其中的振动项和长期项就知道为什么19年7闰注定要失败。
以下两个函数是我利用现代的行星运动理论(方案)导出来的,精度大可放心。
//低精度定气朔计算(仍比古代日历精准很多)
function suo_low(W){ //低精度定朔望弦计算,在2000年+-1400年,误差在2小时以内,W是日月黄经差
var v = 7771.37714500204;
var t = ( W + 1.08472 )/v, L;
t -= ( -0.0000331*t*t
+ 0.10976 *Math.cos( 0.785 + 8328.6914*t)
+ 0.02224 *Math.cos( 0.187 + 7214.0629*t)
- 0.03342 *Math.cos( 4.669 + 628.3076*t ) )/v
+ (32*(t+1.8)*(t+1.8)-20)/86400/36525;
return t*36525 + 2451545;
}
function qi_low(W){ //最大误差小于30分钟,平均5分,W是太阳黄经,0度计算春分,W为弧度。
var t,L,v= 628.3319653318;
t = ( W - 4.895062166 )/v; //第一次估算,误差2天以内
t -= ( 53*t*t + 334116*Math.cos( 4.67+628.307585*t) + 2061*Math.cos( 2.678+628.3076*t)*t )/v/10000000; //第二次估算,误差2小时以内
L = 48950621.66 + 6283319653.318*t + 53*t*t //平黄经
+334166 * Math.cos( 4.669257+ 628.307585*t) //地球椭圆轨道级数展开
+3489 * Math.cos( 4.6261 + 1256.61517*t ) //地球椭圆轨道级数展开
+2060.6 * Math.cos( 2.67823 + 628.307585*t ) * t //一次泊松项
- 994 - 834*Math.sin(2.1824-33.75705*t); //光行差与章动修正
t -= (L/10000000 -W )/628.332 + (32*(t+1.8)*(t+1.8)-20)/86400/36525;
return t*36525 + 2451545;
}
以上两个函数返回的是2000年1月1.5日起算的儒略日数(格林尼治平午起算),而且是世界时,不是力学时。儒略日数的计算方法在《天文算法》中有,不要用蔡勒公式之类的方不来计算,这类方法不太通用,也不太好用。
另外,定气朔历法中,“含冬至的月份定为第1月(子月,十一月)”如果你实在不能理解,那你还有待于进一步学习中国历法之后再与大家讨论,不然大家与你讨论的结果几乎等于0。
如果需要古代历法或现代历法资料,可以找本论坛上与你讨论的那些朋友要一些,与你讨论的那些朋友都是比较专业的。
精确到秒的气朔计算,在《寿星万年历》中有,不过程序很长很长。
以上那两个函数随然精度低,但外推能力很强,你推算+-10000年后,看看你的19年7闰准不准。
定气定朔公式给你也,就看你的置闰法要怎么设置了,你把历谱说排出来最有说服力。我编排农历时,用上面两个公式就可以了,可以不用其它公式,也不必再使用其它任何天文数据。
[此贴子已经被作者于2009-5-9 17:58:42编辑过]