中华农历论坛知识讨论区历法知识 → 送给Q兄两个函数


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

主题:送给Q兄两个函数

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


加好友 发短信
等级:蝙蝠侠 帖子:866 积分:3804 威望:3 精华:20 注册:2008/3/20 22:14:00
送给Q兄两个函数  发帖心情 Post By:2009/5/9 16:41:00

以下两个函数比“平公式”要精确得多。平均误差在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编辑过]

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


加好友 发短信
等级:业余侠客 帖子:315 积分:717 威望:0 精华:0 注册:2008/9/25 22:36:00
  发帖心情 Post By:2009/5/9 20:39:00

用户已被锁定

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


加好友 发短信
等级:蝙蝠侠 帖子:866 积分:3804 威望:3 精华:20 注册:2008/3/20 22:14:00
  发帖心情 Post By:2009/5/10 7:40:00

  Q兄的那几个公式我看过了,确实不错。只是它确实只适用于古代的“平”气朔。你那个置闰公式所需的起点参数以及回归年长度、平朔望长度,在《寿星万年历》2.0版及以后各版本都有都有提供。请参考下表,它是利用现代方法反向归算得到的,计算时请保留所有的有效数字。你用29.5306计算是不行的,它跟本无法保证每个朔日正确,一般要保留6至8个有效数字才能在几百年内与古代历谱相符。当然如果只是闰月,有效数字不必很高。

 

  上述平气、平朔的计算公式表达为:D = k*n + b , 式中n=0,1,2,3,...,N-1;下面给出各朝代颁发历法的k与b的参数,每行第1个参数为b,第2参数为k,结果D表达为儒略日数;h表示k不变b允许的误差,如果b不变则k许可误差为h/N;N是历法颁行期间朔或气的总个数。

//“朔”直线拟合参数
1457698.231017,29.53067166, // -721-12-17 h=0.00032 古历·春秋
1546082.512234,29.53085106, // -479-12-11 h=0.00053 古历·战国
1640640.735300,29.53060000, // -221-10-31 h=0.01010 古历·秦汉
1642472.151543,29.53085439, // -216-11-04 h=0.00040 古历·秦汉
1683430.509300,29.53086148, // -104-12-25 h=0.00313 汉书·律历志(太初历)平气平朔
1752148.041079,29.53085097, //   85-02-13 h=0.00049 后汉书·律历志(四分历)
1807665.420323,29.53059851, //  237-02-12 h=0.00033 晋书·律历志(景初历)
1883618.114100,29.53060000, //  445-01-24 h=0.00030 宋书·律历志(何承天元嘉历)
1907360.704700,29.53060000, //  510-01-26 h=0.00030 宋书·律历志(祖冲之大明历)
1936596.224900,29.53060000, //  590-02-10 h=0.01010 随书·律历志(开皇历)
1939135.675300,29.53060000, //  597-01-24 h=0.00890 随书·律历志(大业历)
1947168.00//  619-01-21
//“气”直线拟合参数
1640650.479938,15.21842500, // -221-11-09 h=0.01709 古历·秦汉
1642476.703182,15.21874996, // -216-11-09 h=0.01557 古历·秦汉
1683430.515601,15.218750011,// -104-12-25 h=0.01560 汉书·律历志(太初历) 回归年y=365.25000
1752157.640664,15.218749978,//   85-02-23 h=0.01559 后汉书·律历志(四分历)     y=365.25000
1807675.003759,15.218620279,//  237-02-22 h=0.00010 晋书·律历志(景初历)       y=365.24689
1883627.765182,15.218612292,//  445-02-03 h=0.00026 宋书·律历志(何承天元嘉历) y=365.24670
1907369.128100,15.218449176,//  510-02-03 h=0.00027 宋书·律历志(祖冲之大明历) y=365.24278
1936603.140413,15.218425000,//  590-02-17 h=0.00149 随书·律历志(开皇历)       y=365.24220
1939145.524180,15.218466998,//  597-02-03 h=0.00121 随书·律历志(大业历)       y=365.24321
1947180.798300,15.218524844,//  619-02-03 h=0.00052 新唐书·历志(戊寅元历)     y=365.24460
1964362.041824,15.218533526,//  666-02-17 h=0.00059 新唐书·历志(麟德历)       y=365.24480
1987372.340971,15.218513908,//  729-02-16 h=0.00096 新唐书·历志(大衍历,至德历)y=365.24433
1999653.819126,15.218530782,//  762-10-03 h=0.00093 新唐书·历志(五纪历)       y=365.24474
2007445.469786,15.218535181,//  784-02-01 h=0.00059 新唐书·历志(正元历,观象历)y=365.24484
2021324.917146,15.218526248,//  822-02-01 h=0.00022 新唐书·历志(宣明历) y=365.24463
2047257.232342,15.218519654,//  893-01-31 h=0.00015 新唐书·历志(崇玄历) y=365.24447
2070282.898213,15.218425000,//  956-02-16 h=0.00149 旧五代·历志(钦天历) y=365.24220
2073204.872850,15.218515221,//  964-02-16 h=0.00166 宋史·律历志(应天历) y=365.24437
2080144.500926,15.218530782,//  983-02-16 h=0.00093 宋史·律历志(乾元历) y=365.24474
2086703.688963,15.218523776,// 1001-01-31 h=0.00067 宋史·律历志(仪天历,崇天历) y=365.24457
2110033.182763,15.218425000,// 1064-12-15 h=0.00669 宋史·律历志(明天历) y=365.24220
2111190.300888,15.218425000,// 1068-02-15 h=0.00149 宋史·律历志(崇天历) y=365.24220
2113731.271005,15.218515671,// 1075-01-30 h=0.00038 李锐补修(奉元历)     y=365.24438
2120670.840263,15.218425000,// 1094-01-30 h=0.00149 宋史·律历志         y=365.24220
2123973.309063,15.218425000,// 1103-02-14 h=0.00669 李锐补修(占天历)     y=365.24220
2125068.997336,15.218477932,// 1106-02-14 h=0.00056 宋史·律历志(纪元历) y=365.24347
2136026.312633,15.218472436,// 1136-02-14 h=0.00088 宋史·律历志(统元历,乾道历,淳熙历)365.24334
2156099.495538,15.218425000,// 1191-01-29 h=0.00149 宋史·律历志(会元历) y=365.24220
2159021.324663,15.218425000,// 1199-01-29 h=0.00149 宋史·律历志(统天历) y=365.24220
2162308.575254,15.218461742,// 1208-01-30 h=0.00146 宋史·律历志(开禧历) y=365.24308
2178485.706538,15.218425000,// 1252-05-15 h=0.04606 淳祐历               y=365.24220
2178759.662849,15.218445786,// 1253-02-13 h=0.00231 会天历               y=365.24270
2185334.020800,15.218425000,// 1271-02-13 h=0.00520 宋史·律历志(成天历) y=365.24220
2187525.481425,15.218425000,// 1277-02-12 h=0.00520 本天历               y=365.24220
2188621.191481,15.218437484,// 1280-02-13 h=0.00013 元史·历志(郭守敬授时历) y=365.24250
2321919.49// 1645-02-04

值得注意的是:儒略日数的小数部分为0.5才对应晚上0点;新唐书·历志(戊寅元历)公元619年开始使用平气定朔,之前使用平气平朔,1645年及以后使用定气定朔。

举例说明:求公元88年2月15(儒略日数为1753245)附近的朔日的具体公历日期。

88年的颁行历为后汉书·律历志的四分历,它的平朔参数 b = 1752148.041079,k = 29.53085097。先把朔日D估计为88年2月15日。又因 D = k*n+b,所以 n = (D-b)/k = 37.15,四舍五入取整得 n = 37。易得准确日期为 D = k*n+b = 1753240.68,转为公历得公元88年2月11号4时,朔日在11日。

 

 


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


加好友 发短信
等级:业余侠客 帖子:315 积分:717 威望:0 精华:0 注册:2008/9/25 22:36:00
  发帖心情 Post By:2009/5/10 7:58:00

用户已被锁定

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


加好友 发短信
等级:蝙蝠侠 帖子:866 积分:3804 威望:3 精华:20 注册:2008/3/20 22:14:00
  发帖心情 Post By:2009/5/10 8:22:00

  现代农历关心的是农历天文年首(即农历的天文年第1个月)与冬至(太阳年)同步计数,而计数的时候一般都用整数来计数,也就是ymy111、浪淘沙等人说的阴阳合拍。现代农历根本就不关心闰月的位置,即闰月该在哪里就在哪里,闰月所在位置合不合里——现代农历并不关心,一部历法要谦顾多方面是不太可能的。实际上,农历年与太阳年同步之后,闰月所在位置一点也不重要,而你天天把19年7闰搬出来,难怪大家有意见。

 

  你自已想想,中央台的北京时间比喻为太阳历,它每年播报一个冬至,我们的手表比喻为农历,每年听到中央台的报时,我们就马上与中央台校对时间一下就可以了,也不必校对得非常准确,校对个大概就可以了,反正每年都要校对,你还怕它跑不准?现在农历实际上就是利用天象自动同步阴阳(自动对时)。

 

  “取整”后相当于一个量化的“数字量”,而“不取整”的小数,相当于一个“模拟量”。我们的电脑时间,跑的是“数字量”,计算机程序,也是“数字化”的。任何“数字量”总会有截断误差,但误差不会超过它的最小位(如个位数上的1)。月计数用的是整数,这是我们所说的“数字量”,以整数月为单位来度量年长度,误差不会超过1个月。每年都与太阳年对时一次,这样每年的误差都不会相差1个月,这样农历的天文年首,永远与冬至相差不会超过1个月,也就是说它会一直很精确的进行农历月计数。相反,“平法”没有天象的强制同步功能,那么将远期的误差将会很大,仅仅地球自转变慢一项,就会让你“平法”受不了,3万年后,自球变慢积累的误差可能积累到0.5个月(最小估计),也可能是2个月,你的平法置闰又怎么可能成立。离开天文知识来谈论农历原理,那是不可思义的。


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


加好友 发短信
等级:蝙蝠侠 帖子:866 积分:3804 威望:3 精华:20 注册:2008/3/20 22:14:00
  发帖心情 Post By:2009/5/10 8:34:00

在V4.x版之后,作了一点改动

 

  1683430.515601,15.218750011, // -104-12-25 h=0.01560 汉书·律历志(太初历)平气平朔 回归年=365.25000
  1752157.640664,15.218749978, //   85-02-23 h=0.01559 后汉书·律历志(四分历) 回归年=365.25000
  1807675.003759,15.218620279, //  237-02-22 h=0.00010 晋书·律历志(景初历) 回归年=365.24689
  1883627.765182,15.218612292, //  445-02-03 h=0.00026 宋书·律历志(何承天元嘉历) 回归年=365.24670
  1907369.128100,15.218449176, //  510-02-03 h=0.00027 宋书·律历志(祖冲之大明历) 回归年=365.24278
  1936603.140413,15.218425000, //  590-02-17 h=0.00149 随书·律历志(开皇历) 回归年=365.24220
  1939145.524180,15.218466998, //  597-02-03 h=0.00121 随书·律历志(大业历) 回归年=365.24321
  1947180.798300,15.218524844, //  619-02-03 h=0.00052 新唐书·历志(戊寅元历)平气定朔 回归年=365.24460
  1964362.041824,15.218533526, //  666-02-17 h=0.00059 新唐书·历志(麟德历) 回归年=365.24480
  1987372.340971,15.218513908, //  729-02-16 h=0.00096 新唐书·历志(大衍历,至德历) 回归年=365.24433
  1999653.819126,15.218530782, //  762-10-03 h=0.00093 新唐书·历志(五纪历) 回归年=365.24474
  2007445.469786,15.218535181, //  784-02-01 h=0.00059 新唐书·历志(正元历,观象历) 回归年=365.24484
  2021324.917146,15.218526248, //  822-02-01 h=0.00022 新唐书·历志(宣明历) 回归年=365.24463
  2047257.232342,15.218519654, //  893-01-31 h=0.00015 新唐书·历志(崇玄历) 回归年=365.24447
  2070282.898213,15.218425000, //  956-02-16 h=0.00149 旧五代·历志(钦天历) 回归年=365.24220
  2073204.872850,15.218515221, //  964-02-16 h=0.00166 宋史·律历志(应天历) 回归年=365.24437
  2080144.500926,15.218530782, //  983-02-16 h=0.00093 宋史·律历志(乾元历) 回归年=365.24474
  2086703.688963,15.218523776, // 1001-01-31 h=0.00067 宋史·律历志(仪天历,崇天历) 回归年=365.24457
  2110033.182763,15.218425000, // 1064-12-15 h=0.00669 宋史·律历志(明天历) 回归年=365.24220
  2111190.300888,15.218425000, // 1068-02-15 h=0.00149 宋史·律历志(崇天历) 回归年=365.24220
  2113731.271005,15.218515671, // 1075-01-30 h=0.00038 李锐补修(奉元历) 回归年=365.24438
  2120670.840263,15.218425000, // 1094-01-30 h=0.00149 宋史·律历志 回归年=365.24220
  2123973.309063,15.218425000, // 1103-02-14 h=0.00669 李锐补修(占天历) 回归年=365.24220
  2125068.997336,15.218477932, // 1106-02-14 h=0.00056 宋史·律历志(纪元历) 回归年=365.24347
  2136026.312633,15.218472436, // 1136-02-14 h=0.00088 宋史·律历志(统元历,乾道历,淳熙历) 回归年=365.24334
  2156099.495538,15.218425000, // 1191-01-29 h=0.00149 宋史·律历志(会元历) 回归年=365.24220
  2159021.324663,15.218425000, // 1199-01-29 h=0.00149 宋史·律历志(统天历) 回归年=365.24220
  2162308.575254,15.218461742, // 1208-01-30 h=0.00146 宋史·律历志(开禧历) 回归年=365.24308
  2178485.706538,15.218425000, // 1252-05-15 h=0.04606 淳祐历 回归年=365.24220
  2178759.662849,15.218445786, // 1253-02-13 h=0.00231 会天历 回归年=365.24270
  2185334.020800,15.218425000, // 1271-02-13 h=0.00520 宋史·律历志(成天历) 回归年=365.24220
  2187525.481425,15.218425000, // 1277-02-12 h=0.00520 本天历 回归年=365.24220
  2188621.191481,15.218437494, // 1280-02-13 h=0.00015 元史·历志(郭守敬授时历) 回归年=365.24250
  2322147.76// 1645-09-21

 

 

  1280年,郭守敬的授时历中,回归年已经采用365.2425,比西方的格里历要早了300年。《授时历》使用的是“平法”,这意味着,如果《授时历》的纪日以太阳历(即节气)为主,月历为辅,也会出现400年97闰现象,而且是均匀分布的,比现在的格里历要好得多。

  之后的《时宪历》比《授时历》有了大幅度的进步,延用了360年,至今也没人改它(改的只是天文算法),因为它确实比较完善。


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


加好友 发短信
等级:蝙蝠侠 帖子:866 积分:3804 威望:3 精华:20 注册:2008/3/20 22:14:00
  发帖心情 Post By:2009/5/10 10:56:00

  我已说过,现在农历中“闰”的次序已不再重要,你要死死抱着“闰”我也没办法。

  目前是“年年校对”,历算过程必须年年严格校对同步,不然就容易出错。

 

  Q说到:“目前不是每年都要校对,而是19年校对7次。具体是:3+3+3+2+3+3+2=19,顺序可以任意截取。”

  这就是Q你的创新了,你要19年同步校对一次也可以啊,那已经是一步新的历法了,你不能不承认。接下来你只要规定在什么时候校对就可以了,如2000年、2019年、2038年……。还有一点,同步校时的规则也可以按以前讨论过的“历理法”校时同步,这样你所希望看到的19年7闰在最近几百年内基本上都实现了。不过你别忘了考虑一下这种历法可能产生的坏处。


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


加好友 发短信
等级:业余侠客 帖子:315 积分:717 威望:0 精华:0 注册:2008/9/25 22:36:00
  发帖心情 Post By:2009/5/10 10:59:00

用户已被锁定

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


加好友 发短信
等级:业余侠客 帖子:315 积分:717 威望:0 精华:0 注册:2008/9/25 22:36:00
  发帖心情 Post By:2009/5/10 11:20:00

用户已被锁定

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


加好友 发短信
等级:蝙蝠侠 帖子:866 积分:3804 威望:3 精华:20 注册:2008/3/20 22:14:00
  发帖心情 Post By:2009/5/10 11:26:00

“   19年的闰周也比西方早啊,可惜都是被我们自己弃而不用。汤若望等人把平气改为定气也许可以说是功过各半。定气从天文角度来说是完全正确的,而从历法角度来说应该是错的。因为严格说来它是空间(位置)概念,不是时间概念,KSL不应该影响农历的置闰,所以从客观上来说农历闰哪一个月的机率应该是均等的。”

 

   这种说法基本正确了,现代人看来,“历”给人用的,应“从简”,不见得需要一味的追求天文学上的“先进性”或天象的严格对应关系。但这并不能说“1984年闰错了”,现代农历有他的置闰规则,你有你的置闰规则,他有他的合理性,你有你的合理性,我没有说你的闰法错得很严重,但你不能理解现代农历的闰法,反而说人农“错闰”,大家肯定要反对你的。

 

  顺便说一下,在定气法中,最近几百年内“闰哪月”的机率是不均等的。空间位置等分与时间等分确定“气”只能说各有好处。历法核心问题之一就是要协调“日期”与“日月地空间位置”二者的关系,

[此贴子已经被作者于2009-5-10 12:26:24编辑过]

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

返回版面帖子列表

送给Q兄两个函数








签名