日历里三赤日历轮回是什么意思思?

和合本圣经中有哪些你可能不认识的字?
Related Articles【图片】说,为什么把这么赤几的立绘雪藏了!【恋与制作人吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0可签7级以上的吧50个
本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:235,043贴子:
说,为什么把这么赤几的立绘雪藏了!
哇塞,我都脑补了一出大戏了!带声音的那种!
我也没想到有生之年居然看叠叠发的声明差点看哭了,哎呀呀
前排dd,看了睡不着系列
还藏了好多衣服
原来立绘都是这样画出来的,哎好想去看看画师怎么一步步把野男人做出来的
然后,这个长发许墨也很有感觉
是啊!这么好的立绘竟然没出
贴吧拳王争霸赛中累计获取30场胜利
哼我们悠然有这么多衣服,老不给我们换!
刚开始的白起我认都认不粗来原谅我没图有图的小伙伴帮我补图吧
这么好的立绘为什么不放出来
我觉得悠然那几套衣服都比病号裙好看是怎么肥事
镇楼图超好看,为啥不放进剧情
划重点,超市遇爱豆
总裁也不是只有西装,穿大衣帅翻了啊!
镇楼要是能把带你离开的卡面替了感激不尽丑哭了
叠纸的线稿真不很好看,虽然很流畅很清晰……
这个CG很好看啊,为什么不放出来,,,这么多立绘也被吃了
哈哈哈哈哈哈哈哈哈哈
我也想要这张卡
天哪我喜欢这张卡
当年的身体比例如今的洛洛
我觉得现在出这张肯定会被喷,参考纯真
出来了又单车抢劫犯又成了新的起起落落图
镇楼真滴不错
镇楼真的好看(?Д`)
贴吧热议榜
使用签名档&&
保存至快速回贴昌黎台历报价 图 -【平阳县新华彩印厂】
昌黎台历报价 图
发布人:PWG0577
发布时间:
产品品牌:
产品单价:
最小起订:
产品单价:
发货期限:
发货城市:
昌黎台历报价 图
&&挂历的出现给年历注入“新鲜血液”。我国绘画的三大画科(花鸟画、人物画、山水画)也成为挂历题材的主体。如《中国历代花鸟画选》、《历代仕女》、《故宫藏古代山水画选》等。以《中国历代花鸟画选》为例,选有南宋李迪的《雪树寒禽图》、明代院体派花鸟大家吕纪的《雪柳双凫图》、清代“海上画派”代表人物任颐的《凤凰图》等,工笔、写意、墨笔等花鸟技法汇于一轴。从我国古代到近代的画坛流派的专辑也是挂历题材的另一看点,如“明四家”、“清六家”的《明清画林擢秀》、“吴门四家”的《吴门画萃》、“扬州画派”的《扬州八怪画选》等;现当代著名画家的力作及有“”色彩的挂历更是亮点,比如林风眠的《舞》、钱松的《太湖三春》、刘旦宅的《苏轼》、《赤脚医生好》中的《凉山新貌》。名家们的精湛笔墨、精美的印刷效果,给人们的生活带来高雅的艺术享受和隽永的趣味。题材上乘的挂历也成为美术爱好者们的绝佳摹本。
类别:普通挂历,材质:纸,包装:纸箱,产品编号:PWG001,规格:42*57.5cm,加印LOGO:可以,品牌:PWG月历,使用场合:广告促销、会议庆典、办公福利、商务、答谢客户、开业典礼、节日庆祝,送礼对象、送同事、送客户、送领导、送同学,是否提供加工定制:是
品味阁月历厂(PWG)成立于1990年,公司地址位于平阳县昆阳镇礼品工业园区,公司现有员工100余人。我们是为企事业单位及个人提供台历、挂历、周历定做的专业挂历厂,主要产品有:丝绸挂历、成都塑胶台历、商务周历、便签台历、仿皮周历、高档挂历台历、新颖挂历台历、吊牌、年画,办公台座。同时提供专版挂历定做、专版台历定做,为企业提供一站式推广、采购服务。厂家直接供货,价格更实惠,款式更丰富,定做更可靠。
&&目前,我们每家必备的挂历和台历即便由日历进展来的,然而这不过近百年的历史.至于日历从何时揭示的,谁也说不清,只是据史料登记,大约在1100年前唐顺宗永贞元年,皇宫中曾经在利用日历了.当时的日历又称皇历,不但登记着日期,而且是编修国史的重要材料.彼时候的日历与目前对于点儿相仿.把一年分为12册,按每月的天数来确定每册的页数,并将月份和日期写在每一页上,然后交给伺候皇帝的太监临时保管,待太监在每日的空页上记下皇帝的言行并在每月月终交皇帝过目,批准后,送史官存档.史官再将日历的内容与朝廷,国内各地区的大事联合起来,经提炼,润色后,登记下来,便成为国史.尔后,由于日历给生存带来众多得体,就逐渐地进去了不少在朝大官的家庭,穿越一番改变,编制成自家的日历.再后来,随着日历向公众化,家庭化的进展,人们也就把历书上的干支月令,节气及黄道吉日都印在日历上,并留下供记事用的的大片空白。挂历的出版发行改换了我国传统的“历书”和“年历”记时法,过去年底年底,家家户户买几张年历画贴在堂屋内,一贴一年,天天都是老气貌,而挂历12个月具有12张不同的画面,而且画面美观慷慨,月月给人一种鲜美感,宾客来了经常翻一翻,欣赏一番,歌唱一番,不但使宾客享乐了“美”,而且也使主人心里美滋滋的,因而,挂历一上市就受到人们的溺爱。
材质:铜板纸、设计:是、造型:中国结、印刷:双面、装订:是、年份:2018年、适用送礼场合:广告促销、分类:台历挂历印刷、烫金:是、UV:是、覆膜:光膜、排版打样:是、压纹:是
品味阁的设计队伍和生产队伍更是一级棒!
品味阁的做事和做人原则一样:
诚信第一、一专多能、能者多劳、劳者多酬!
&&品味阁作为挂历题材范畴,其用途主要有以下几方面:一、本产品可一年至几年挂历使用,主要为企业及单位做广告宣传。二、使用完挂历后可以简单拆下当环保袋使用,使企业广告走出户外达到更好的广告宣传。三、底面可以当作画长年挂里作为装饰。四、印刷采用彩色印刷,图案精美、可视效果,可作为平常往来礼品、赠品之用。五、是新世纪人类共同倡导,绿色环保是社会永恒的主题,侧面起到一个全人类的环保意识宣传。六、同时,也适用于各类业务活动及展览展销会,是企事业单位理想的广告促销、礼品赠品。
低价格、高质量的彩色印刷品一直被业界所称颂,5年来得益于全国上千家客户信赖与支持,公司现规模更大、效率更高、成本更低,更能确保全国最低价,公司通过全国网络接单印刷,快递、物流,中铁等送货,一直面向全国诚招店,随时与我们联系,期待与您共赢!
&&优质的台历定做厂家在制作工艺上更优秀,能在质感及美感方面更讲究,而且在设计风格上更合理,从而能在品质保障方面有更大的优势,所以科学来进行选择将很有必要。要是能在可靠性上更佳,还是得有更多的选择,以便能在服务水准上更让人满意,所以更好来进行选择将很有必要。当然不同风格的台历定做应进行更好的设计,然后在用材上更好选择,以便能在品质上更佳,只有能在可靠性方面更让人满意,才能在整体效果方面更受欢迎,所以合理来进行选择将很重要。工艺水准更佳的台历生产企业,能为客户提供更优质的服务,进而能在整体效果方面更佳,所以更好来进行选择将很有必要。至少它能在为客户提供服务的过程中更到位,所以选择印刷厂很关键。
公司设计能力强,印刷质量高。公司有设计员16人,均为本科以上文化,大部份有5年以上的专业经验,“准确、美观、快捷”是对公司设计制作人员的基本要求。“不生产不合格产品,不移交不合格产品、让客户轻松快捷完成高质量的印刷任务”是公司铁的法则。同时公司开展学习型组织建设,使公司设计水平和印刷质量不断提高。
&&个性台历日渐“走红”:个性台历登温州市场,让摄影、冲印行业多了一份收益。从三、四年前引入个性台历至今,市内许多家摄影店增设了台历照片摄影业务,照片冲印店则增加了高质量冲印个性台历的业务。这项业务正随着市民认可度的提升,日渐成为一些行业的主营业务。品味阁现在在国内挂历市场占有率在70%以上,我们的台历挂历都是非常有创意的产品,尤其注重环保和实用性,广告效果以及2次利用宣传效果非常不错,是一种非常实用而又廉价的宣传媒介,如果贵公司需要定做台历挂历,可以和我联系。
我厂是国内规模最大的印刷包装重点企业之一,我们要为振兴民族印刷行业,弘扬中华优秀文化,繁荣我国印刷事业和打造出口外贸平台而努力奋斗。公司拥有最先进的印刷设备和一流的工作团队,一贯致力于印刷新技术的创新和运用,具有良好的商业信誉和规范的服务保障体系,产品远销等几十个。具备策划、设计、印刷、采购和品控等一体化全方位的服务。面对瞬息万变的市场,我们将继续以客户为关注焦点,本着以服务客户为导向的销售理念。
&&优质的挂历印刷企业在保证挂历设计效果方面很到位,完全能在可靠性方面有更大的优势。只有能在可靠性方面更优,才能让用户更满意,为此,我们还是得从专业的角度来选,毕竟它能带给我们的便捷更多,所以更科学来进行选择将很重要,应更好来把握才行。通过对挂历更好的设计,将能在美观性及实用性上进行体现,进而能在服务能力方面有更大的优势,所以更科学来做出选择很重要。要是在印刷挂历的时候通过更好的设计,肯定能带来更大的好处,完全能在服务水准上得到快速提升。
到朋友家做客,抬眼望去,桌上摆着一本新颖别致的台历,你会很有兴趣的翻一遍,欣赏之后,你还会向主人夸赞一番,“这本台历真漂亮”,主人会告诉你:这是XX企业赠送的,其实不告诉你也会知道,因为在你欣赏美丽画面的同时,企业广告内容也同时映进了你的视野。企业广告无论采用哪种形式其最终目的都是让更多的消费者了解本企业,知道本企业产品,更好地推销商品,更大地赚取利润。企业在选择广告形式时会综合考虑其广告费用和广告传播效果,台历广告通过赠送和摆桌上展示可以起到广泛传播的目的。首先台历在赠送过程中,许多人会争着抢着看,你赠给他,他送给我,赠送的过程也就是很好的相信你也曾经这样问过别人,宣传过程。
月历作为工作生活必需品,使用量大,广告位置醒目,使用时间持久,是企业宣传的好礼品,一直是礼品市场的常青树。但随着市场的发展,月历赠品市场同质化严重,创新不足。多年来一直致力于礼品台历挂历的创新开发,组织市场新产品供应给广大客户。款式新颖、品种齐全、价格优,欢迎各位新老客商联系订购。
&&首先,分析一下你的竞争对手。俗话说,知己知彼,百战不殆。看一下对手是否有属于他们自己的商务台历。你肯定想开发一种区别于对手的个性台历,并且比它更能给人留下深刻印象。因此在做印刷之前应当了解竞争对手产品的信息。其次,做市场调查。这是许多商业投资之前很重要的一条规则。它之所以很重要是因为能够让你了解如何在台历设计,台历画面以及在台历印刷方式等方面吸引更多的消费者。第三,获得专业的设计和印刷专家的帮助。一个人不可能的完成台历的印刷,如果你想把这个业务做得专业,就离不开专家的帮助。试着雇佣专业摄影师和设计师,以及专业的印刷厂,这也许会帮助你。第四,选择合适的台历尺寸。很多时候我们并不想印刷一个特别大的台历带回家。因此为了携带方便,我们应当选择合适的台历尺寸。一个标准的台历尺寸会更加受欢迎。第五,利用高质量的印刷材料。台历印刷中,质量是一个很重要的因素,商务台历更是如此。高质量的材质能够使台历使用足够一年。在纸张的选择上应当选择厚实,光滑,防水的纸张。
在进行台历定做的时候,找有经验的厂家更合适,它们能根据客户的需要来定制,从用材,到品质保障,都能有更良好的效果,进而能在品质保障方面有更多收获,所以合理来进行选择将很有必要,至少它能在可靠性方面有更多收获,所以科学来进行选择将很有必要。
以上消息来自网络,本网不对以上信息真实性、准确性、合法性负责我居然失智把崩三推荐给了学姐……【崩坏3rd吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0可签7级以上的吧50个
本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:1,053,845贴子:
我居然失智把崩三推荐给了学姐……
这可能是我脑回路最不正常的一次了……虽然几率很小,但是万一入坑了我岂不是千古罪人……要不要赶紧做些什么挽回一下
你又开始了
然后你学姐什么反应?
为了让名字听起来高大上一些,我还特意换了个说法
情头,告辞
发张女装以示诚意
妹子装大佬会出事的
回头你学姐就跟你学去援了。你还可以尝试一次。
8楼和11楼的操作很强
学姐入坑——被喂shi——不服氪金——不出货,被海豹秀一脸——暴怒,大力氪——吃土——找楼主借钱——继续氪——无法还账——肉偿,计划通!
你这么可爱还怕学姐对你生气么
日常贴吧舔兔子1/1
哼唧怪,你跟学姐有什么仇
穿女装勾引她,让她对你产生兴趣,这样就会放弃游戏了
莫名其妙被秀了一波恩爱
就我注意到了头像吗
问她喜欢兔子还是游戏
女装谢罪?哼唧
情头,你说你...算了已经没什么可暴躁的了?
说你是不是又被删贴了,我的关注闪了好几次
然后呢,第二天没有头的学姐拿着99抽没NaCl的扩充记录对你说已经没有什么好怕了?
贴吧热议榜
使用签名档&&
保存至快速回贴Copyright & , NORYES, All Rights Reserved.
欢迎转载,请保留此版权声明。
---------------------------------------------------------------------------------------
& & 转载自
& & 日历在我们的生活中扮演着十分重要的角色,上班、上学、约会都离不开日历。每年新年开始,人们都要更换新的日历,你想知道未来一年的这么多天是怎么被确定下来的吗?为什么去年的国庆节是星期五而今年的国庆节是星期三?那就来研究一下日历算法吧。本文将介绍日历的编排规则,确定某日是星期几的计算方法,以及如何在计算机上打印某一年的年历。
& & 要研究日历算法,首先要知道日历的编排规则,也就是历法。所谓历法,指的就是推算年、月、日的时间长度和它们之间的关系,指定时间序列的法则。我国的官方历法是中国公历,也就是世界通用的格里历(Gregorian Calendar),中国公历的年分为平常年和闰年,平常年一年是365天,闰年一年是366天。判定一年是平常年还是闰年的规则如下:
& & 1、如果年份是 4 的倍数,且不是 100 的倍数,则是闰年;
& & 2、如果年份是 400 的倍数,则是闰年;
& & 3、不满足 1、2 条件的就是平常年。
& & 总结成一句话就是:四年一闰,百年不闰,四百年再闰。
& & 中国公历关于月的规则是这样的,一年分为十二个月,其中一月、三月、五月、七月、八月、十月和十二月是大月,一个月有 31 天。四月、六月、九月和十一月是小月,一个月有 30 天。二月天数要根据是否是闰年来定,如果是闰年,二月是 29 天,如果是平常年,二月是 28 天。
2、计算星期
& & 除了年月日,人们日常生活中还对日期定义了另一个属性,就是星期几。星期并不是公历范畴内的东西,但是人们已经习惯用星期来管理和规划时间,比如一个星期工作五天,休息两天等等,星期的规则彻底改变了人们的生活习惯,因此星期已经成为历法中的一部分了。星期的命名最早起源于古巴比伦文化。公元前 7-6 世纪,巴比伦人就使用了星期制,一个星期中的每一天都有一个天神掌管。这一规则后来传到古罗马,并逐渐演变成现在的星期制度。
& & 如何知道某一天到底是星期几?除了查日历之外,是否有办法推算出来某一天是星期几呢?答案是肯定的,星期不象年和月那样有固定的历法规则,但是星期的计算也有自己的规律。星期是固定的 7 天周期,其排列顺序固定,不随闰年、平常年以及大小月的天数变化影响。因此,只要确切地知道某一天是星期几,就可以推算出其它日期是星期几。推算的方法很简单,就是计算两个日期之间相差多少天,用相差的天数对 7 取余数,这个余数就是两个日期的星期数的差值。举个例子,假设已经知道 1977 年 3 月 27 日是星期日,如何得知 1978 年 3 月 27 日是星期几?按照前面的方法,计算出 1977 年 3 月 27 日到 1978 年 3 月 27 日之间相差 365 天,365 除以 7 余数是 1,所以 1978 年 3 月 27 日就是星期一。
& & 上述方法计算星期几的关键是求出两个日期之间相隔的天数。有两种常用的方法计算两个日期之间相隔的天数,一种是利用公历的月和年的规则直接计算,另一种是利用儒略日计算。利用公历规则直接计算两个日期之间相差的天数,简单地讲就是将两个日期之间相隔的天数分成三个部分:前一个日期所在年份还剩下的天数、两个日期之间相隔的整数年所包含的天数和后一个日期所在的年过去的天数。如果两个日期是相邻两个年份的日期,则第二部分整年的天数就是 0。以 1977 年 3 月 27 日到 2005 年 5 月 31 日为例,1977 年还剩下的天数是 279 天,中间整数年是从 1978 年到 2005 年(不包括2005 年),共 26 年,包括 7 个闰年和 20 个平常年,总计 9862 天,最后是 2005 年从 1 月 1 日到 5 月 31 日经过的天数 151 天。三者总和 10292 天。直接利用公历规则计算日期相差天数的算法实现如下(为了简化算法复杂度,这个实现假设用于定位星期的那个日期总是在需要计算星期几的那个日期之前):
int CalculateDays(int ys, int ms, int ds, int ye, int me, int de)
int days = CalcYearRestDays(ys, ms, ds);
if(ys != ye) /*不是同一年的日期*/
if((ye - ys) &= 2) /*间隔超过一年,要计算间隔的整年时间*/
days += CalcYearsDays(ys + 1, ye);
days += CalcYearPassedDays(ye, me, de);
days = days - CalcYearRestDays(ye, me, de);
/*计算一年中过去的天数,包括指定的这一天*/
int CalcYearPassedDays(int year, int month, int day)
int passedDays = 0;
for(i = 0; i & month - 1; i++)
passedDays += daysOfMonth[i];
passedDays +=
if((month & 2) && IsLeapYear(year))
passedDays++;
return passedD
/*计算一年中还剩下的天数,不包括指定的这一天*/
int CalcYearRestDays(int year, int month, int day)
int leftDays = daysOfMonth[month - 1] -
for(i = i & MONTHES_FOR_YEAR; i++)
leftDays += daysOfMonth[i];
if((month &= 2) && IsLeapYear(year))
leftDays++;
return leftD
计算years年1月1日和yeare年1月1日之间的天数,
包括years年1月1日,但是不包括yeare年1月1日
int CalcYearsDays(int years, int yeare)
int days = 0;
for(i = i & i++)
if(IsLeapYear(i))
days += DAYS_OF_LEAP_YEAR;
days += DAYS_OF_NORMAL_YEAR;
& & 另一种计算两个日期相差天数的方法是利用儒略日(Julian Day,JD)进行计算。首先介绍一下儒略日,儒略日是一种不记年,不记月,只记日的历法,是由法国学者 Joseph Justus Scaliger()在 1583 年提出来的一种以天数为计量单位的流水日历。儒略日和儒略历(Julian Calendar)没有任何关系,命名为儒略日也仅仅他本人为了纪念他的父亲--意大利学者 Julius Caesar Scaliger()。简单来讲,儒略日就是指从公元前 4713 年 1 月 1 日 UTC 12:00 开始所经过的天数,JD0 就被指定为公元前 4713 年 1 月 1 日&12:00 到公元前 4713 年 1 月 2 日 12:00 之间的 24 小时,依次顺推,每一天都被赋予一个唯一的数字。例如从 1996 年 1 月 1 日 12:00 开始的一天就是儒略日JD2450084。使用儒略日可以把不同历法的年表统一起来,很方便地在各种历法中追溯日期。如果计算两个日期之间的天数,利用儒略日计算也很方便,先计算出两个日期的儒略日数,然后直接相减就可以得到两个日期相隔的天数。
& & 由公历的日期计算出儒略日数是一个很简单的事情,有多个公式可以计算儒略日,本文选择如下公式计算儒略日:
其中 y 是年份,m 是月份,d 是日期,如果 m 小于或等于 2,则 m 修正为 m+12,同时年份修正为 y-1。c 值由以下方法计算:
& & 下面就是由公历日期计算儒略日的算法实现:
119&int&CalculateJulianDay(int&year,&int&month,&int&day)
121&&&&&int&B&=&0;
123&&&&&if(month&&=&2)
125&&&& &&& month&+=&12;
126&&&& &&& year&-=&1;
128&&&&&if(IsGregorianDays(year,&month,&day))
130&&&& &&& B&=&year&/&100;
131&&&& &&& B&=&2&-&B&+&year&/&400;
134&&&&&double&dd&=&day&+&0.;&/*本日12:00后才是儒略日的开始(过一秒钟)*/
135&&&&&return&int(365.25&*&(year&+&4716)&+&0.01)&+&int(30.60001&*&(month&+&1))&+&dd+&B&-&1524.5;
& & 儒略日的计算通常精确到秒,得到的 JD 数也是一个浮点数,本文仅仅是为了计算日期相隔的整数天数,因此都采用整数计算。由于儒略日的周期开始与每天中午12:00,而历法中的天数通常是从0:00开始的,因此儒略日计算上对日期的天数进行了修正。日的儒略日是05年5月31日的儒略日是2453522,差值是10292,和前一种方法计算的结果一致。
& & 我们用两种方法计算出两个日期之间的天数都是10292,现在用10292除以7得到余数是2,也就是说日与日星期数差两天,所以日就是是星期二。
& & & &上述计算星期的方法虽然步骤简单,但是每次都要计算两个日期的时间差,不是非常方便。如果能够有一个公式可以直接根据日期计算出对应的星期岂不是更好?幸运的是,这样的公式是存在的。此类公式的推导原理仍然是通过两个日期的时间差来计算星期,只是通过选择一个特殊的日期来简化公式的推导。这个所谓的特殊日期指的是某一年的 12 月 31 日这天刚好是星期日这种情况。选择这样的日子有两个好处,一个是计算上可以省去计算标准日期这一年的剩余天数,另一个是计算出来的日期差余数是几就是星期几,不需要再计算星期的差值。人们知道公元元年的 1 月 1 日是星期一,那么公元前 1 年的 12 月 31 日就是星期日,用这一天作为标准日期,就可以只计算整数年的时间和日期所在的年积累的天数,这个星期公式就是:
w = (L * 366 + N * 365 + D) % 7&&&&&&&&&&&&&&&&&&&&&&&&&&&& (公式&2)
& & 公式中的 L 是从公元元年到 y 年 m 月 d 日所在的年之间的闰年次数,N 是平常年次数,D 是 y 年内的积累天数。将整年数 y - 1 = L + N 带入上式,可得:
w = ( (y - 1) * 365 + L + D) % 7&&&&&&&&&&&&&&&&&&&&&&&&&&&& &(公式&3)
& & 根据闰年规律,从公元元年到y年之间的闰年次数是可以计算出来的,即:
& & 将L带入公式2,得到星期w的最终计算公式:
& & 还以日为例,利用公式5计算w的值为:
得到 2005 年 5 月 31 日是星期二,和前面的计算方法得到的结果一致。根据上述分析,可得写出使用公式 5 计算星期的算法实现:
146&int&TotalWeek(int&year,&int&month,&int&day)
148&&&&&int&d&=&CalcYearPassedDays(year,&month,&day);
149&&&&&int&y&=&year&-&1;
150&&&&&int&w&=&y&*&DAYS_OF_NORMAL_YEAR&+&y&/&4&-&y&/&100&+&y&/&400&+&d;
152&&&&&return&w&%&7;
&&&&&&&&公式 5 的问题在于计算量大,不利于口算星期结果。于是人们就在公式 5 的基础上继续推导更简单的公式。德国数学家克里斯蒂安&蔡勒(Christian Zeller, )在 1886 年推导出了著名的蔡勒(Zeller)公式:
对计算出的 w 值除以7,得到的余数就是星期几,如果余数是0,则为星期日。蔡勒公式中各符号的含义如下:
w&:星期;
c&:世纪数&& 1的值,如21世纪,则&= 20;
m&:月数,的取值是大于等于3,小于等于14。在蔡勒公式中,某年的1月和2月看作上一年的13月和14月,比如日要当成2000年的14月1日计算;
y&:年份,取公元纪念的后两位,如1998年,&= 98,2001年,&= 1;
d&:某月内的日数
& & 为了方便口算,人们通常将公式6中的一项改成。
& & 目前人们普遍认为蔡勒公式是计算某一天是星期几的最好的公式。但是蔡勒公式有时候可能计算出的结果是负数,需要对结果+7进行修正。比如日,用蔡勒公式计算出的结果是&-1,实际上这天是星期六。根据前面分析的结果整理出的蔡勒公式算法实现如下:
155&int&ZellerWeek(int&year,&int&month,&int&day)
157&&&&&int&m&=&
158&&&&&int&d&=&
160&&&&&if(month&&=&2)&/*对小于2的月份进行修正*/
162&&&& &&& year--;
163&&&& &&& m&=&month&+&12;
166&&&&&int&y&=&year&%&100;
167&&&&&int&c&=&year&/&100;
169&&&&&int&w&=&(y&+&y&/&4&+&c&/&4&-&2&*&c&+&(13&*&(m&+&1)&/&5)&+&d&-&1)&%&7;
170&&&&&if(w&&&0)&/*修正计算结果是负数的情况*/
171&&&& &&& w&+=&7;
173&&&&&return&w;
& & 蔡勒公式(公式6)和前面提到的公式 5 都只适用于格里历法。罗马教皇在 1582 年修改历法,将 10 月 5 日指定为 10 月 15 日,从而正式废止儒略历法,开始启用格里历法。因此,上述求星期几的公式只适用于 1582 年 10 月 15 日之后的日期,对于 1582 年将 10 月 4 日之前的日期,蔡勒也推导出了适用与儒略历法的星期计算公式:
公式 7 适用于对 1582 年 10 月 4 日之前的日期计算星期,1582 年 10 月 5 日与 1582 年 10 月 15 日之间的日期是不存在的,因为它们都是同一天。
& & 格里历历法简单,除二月外每月天数固定,二月则根据是否是闰年确定是 28 天还是 29 天,每天的星期数可以通过蔡勒公式(公式 6)计算,有了这些信息,就可以按照一定的排版格式将某一年的日历打印出来。排版打印的算法非常简单,就是按照顺序打印 12 个月的月历,因此,打印月历的函数就是输出算法的重点。代码没什么特别之处,就是用一些小技巧确定每个月的第一天的开始位置,打印月历的核心代码如下:
229&void&PrintMonthCalendar(int&year,&int&month)
231&&&&&int&days&=&GetDaysOfMonth(year,&month);&/*确定这个月的天数*/
232&&&&&if(days&&=&0)
233&&&& &&&&
235&&&& PrintMonthBanner(nameOfMonth[month&-&1]);
236&&&& PrintWeekBanner();
237&&&&&int&firstDayWeek&=&ZellerWeek(year,&month,&1);
238&&&& InsertRowSpace(firstDayWeek);
239&&&&&int&week&=&firstDayW
240&&&&&int&i&=&1;
241&&&&&while(i&&=&days)
243&&&& &&& printf("%-10d",&i);
244&&&& &&&&if(week&==&6)&/*到一周结束,切换到下一行输出*/
245&&&& &&&&{
246&&&& &&& &&& SetNextRowStart();
247&&&& &&&&}
248&&&& &&& i++;
249&&&& &&& week&=&(week&+&1)&%&7;
GetDaysOfMonth()函数其实就是从daysOfMonth表中查一下每月的天数,如果是闰年,则对二月的天数修正(+1),daysOfMonth表定义如下:
int daysOfMonth[MONTHES_FOR_YEAR] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
计算星期不必对每一天都计算一次,只要对每个月的第一天计算一次就可以了,以后的日期可以用&week = (week + 1) % 7&直接推算出星期几。下面就是我们的算法打印输出的效果:
********************************************************************************
&&&&&&&&&&&&&&&&&&&&&&&&&&& &&Calendar of 2012
********************************************************************************
----------January----------
Sunday&&& Monday&&& Tuesday&& Wednesday Thursday& Friday&&& Saturday
1&&&&&&&& 2&&&&&&&& 3&&&&&&&& 4&&&&&&&& 5&&&&&&&& 6&&&& &&&&7
8&&&&&&&& 9&&&&&&&& 10&&&&&&& 11&&&&&&& 12&&&&&&& 13&&&&&&& 14
15&&&&&&& 16&&&&&&& 17&&&&&&& 18&&&&&&& 19&&&&&&& 20&&&&&&& 21
22&&&&&&& 23&&&&&&& 24&&&&&&& 25&&&&&&& 26&&&&&&& 27&&&&&&& 28
29&&&&&&& 30&&&&&&& 31
----------February----------
Sunday &&&Monday&&& Tuesday&& Wednesday Thursday& Friday&&& Saturday
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 1&&&&&&&& 2&&&&&&&& 3&&&&&&&& 4
5&&&&&&&& 6&&&&&&&& 7&&&&&&&& 8&&&&&&&& 9&&&&&&&& 10&&&&&&& 11
12&&&&&&& 13&&&&&&& 14&&&&&&& 15&&&&&&& 16&&&&&&& 17&&&&&&& 18
19&&& &&&&20&&&&&&& 21&&&&&&& 22&&&&&&& 23&&&&&&& 24&&&&&&& 25
26&&&&&&& 27&&&&&&& 28&&&&&&& 29
----------March----------
Sunday&&& Monday&&& Tuesday&& Wednesday Thursday& Friday&&& Saturday
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 1&&&&&&&& 2&&&&&&&& 3
4&&&&& &&&5&&&&&&&& 6&&&&&&&& 7&&&&&&&& 8&&&&&&&& 9&&&&&&&& 10
11&&&&&&& 12&&&&&&& 13&&&&&&& 14&&&&&&& 15&&&&&&& 16&&&&&&& 17
18&&&&&&& 19&&&&&&& 20&&&&&&& 21&&&&&&& 22&&&&&&& 23&&&&&&& 24
25&&&&&&& 26&&&&&&& 27&&&&&&& 28&&&&&&& 29&&&&&&& 30&&&&&&& 31
2、二十四节气
& & 二十四节气在中国古代历法中扮演着非常重要的角色,本文将介绍二十四节气的基本知识,以及如何使用 VSOP82/87 行星运行理论计算二十四节气发生的准确时间。
& & 中国古代历法都是以月亮运行规律为主,严格按照朔望月长度定义月,但是由于朔望月长度和地球回归年长度无法协调,会导致农历季节和天气的实际冷暖无法对应,因此聪明的古人将月亮运行规律和太阳运行规律相结合制定了中国农历的历法规则。在这种特殊的阴阳结合的历法规则中,二十四节气就扮演着非常重要的作用,它是联系月亮运行规律和太阳运行规律的纽带。正是由于二十四节气结合置闰规则,使得农历的春夏秋冬四季和地球绕太阳运动引起的天气冷暖变化相一致,成为中国几千年来生产、生活的依据。
&&&&&&& 二十四节气起源于中国黄河流域。远在春秋时代,古人就开始使用仲春、仲夏、仲秋和仲冬四个节气指导农耕种植。后来经过不断地改进与完善,到秦汉年间,二十四节气已经基本确立。公元前&104年,汉武帝颁布由邓平等人制定的《太初历》,正式把二十四节气订于历法,明确了二十四节气的天文位置。二十四节气天文位置的定义,就是从太阳黄经零度开始,沿黄经每运行15度所经历的时日称为&一个节气&。太阳一个回归年运行360度,共经历24个节气,每个公历月对应2个节气。其中,每月第一个节气为&节令&,即:立春、惊蛰、清明、立夏、芒种、小暑、立秋、白露、寒露、立冬、大雪和小寒等12个节令;每月的第二个节气为&中气&,即:雨水、春分、谷雨、小满、夏至、大暑、处暑、秋分、霜降、小雪、冬至和大寒等12个中气。&节令&和&中气&交替出现,各历时15天,人们习惯上把&节令&和&中气&统称为&节气&。
&&&&&&& 为了更好地理解二十四节气的天文位置,首先要解释几个天文学概念。&天球&是人们为了研究天体的位置和运动规律而引入的一个假象的球体,根据观察点(也就是球心)的位置不同,可分为&日心天球&、&地心天球&等等。图(1)就是天球概念的一个简单示意图:
图(1)天球概念示意图
天文学中常用的一个坐标体系就是&地心天球&,它与地球同心且有相同的自传轴,理论上具有无限大的半径。地球的赤道和南北极点延伸到天球上,对应着天赤道和南北天极点。和地球上用经纬度定为位置一样,天球也划分了经纬度,分别命名为&赤经&和&赤纬&,地球上的经度用的是度(分秒)为单位,赤经以时(分秒)为单位。天空中的所有天体都可以投射到天球上,用赤经和赤纬定为天体在天球上的位置。&黄道(Ecliptic)&是地球绕太阳公转轨道的轨道平面与天球(地心天球)相交的大圆,由于地球公转受月球和其它行星的摄动,地球的公转轨道并不是严格的平面,因此黄道的严格定义是:地月系质心绕太阳公转的瞬时平均轨道平面与天球相交的大圆。黄道和天赤道所在的两个平面并不是重叠的,它们之间存在一个23度26分的交角,称为&黄赤交角&。由于黄赤交角的存在,黄道和天赤道就在天球上有两个交点,这两个交点就是春分点和秋分点。在天球上以黄道为基圈可以形成黄道坐标系,在黄道坐标系中,也使用了经纬度的概念,分别称为&黄经&和&黄纬&。天体的黄经从春分点起沿黄道向东计量,春分点是黄经0度,沿黄道一周是360度,使用的单位是度、分和秒。黄纬以黄道测量平面为准,向北记为0度到90度,向南记为0度到-90度。
&&&&&&& 黄道平面可以近似理解为地球绕太阳公转的平面,以黄道为基圈的黄道坐标系根据观测中心是太阳还是地球还可以区分为日心坐标系和地心坐标系,对应天体的黄道坐标分别被称为&日心黄经、日心黄纬&和&地心黄经、地心黄纬&。日心黄经和日心黄纬比较容易理解,因为太阳系的行星都是绕太阳公转,以太阳为中心将这些行星向天球上投影是最简单的确定行星位置关系的做法。但是人类自古观察太阳的周年运动,都是以地球为参照,以太阳的周年视运动位置来计算太阳的运行轨迹,使用的其实都是地心黄经和地心黄纬,要了解古代历法,理解这一点非常重要。图(2)就解释了造成这种视觉错觉的原因:
图(2)太阳黄道视觉位置原理图
&&&&&&& 古人定义二十四节气的位置,是太阳沿着黄道运行时的视觉位置,每个节气对应的黄道经度其实是地心黄经。从图(2)可以看出日心黄经和地心黄经存在180度的转换关系,同样可以理解,日心黄纬和地心黄纬在方向上是反的,因此可以很方便地将两类坐标相互转换,转换公式是:
太阳地心黄经&=&地球日心黄经&+ 180&&&&&&&&&&&&&&&&&& (3.1式)
太阳地心黄纬 = -地球日心黄纬&&&&&&&&&&&&&&&&&&&&&&&& (3.2式)
&&&&&&& 了解了以上的天文学基础之后,就可以着手对二十四节气的发生时间进行计算。我们常说的节气发生时间,其实就是在太阳沿着黄道做视觉运动过程中,当太阳地心黄经等于某个节气黄经度数时的那个瞬间的时间。所谓的用天文算法计算二十四节气时间,就是根据牛顿力学原理或开普勒三大行星定律,计算出与历法密切相关的地球、太阳和月亮三个天体的运行轨道和时间参数,以此得出当这些天体位于某个位置时的时间。这样的天文计算需要计算者有扎实的微积分学、几何学和球面三角学知识,令广大天文爱好者望而却步。但是随着VSOP-82/87行星理论以及ELP-2000/82月球理论的出现,使得天文计算变得简单易行,本文就是以VSOP-82/87行星理论为计算依据,计算二十四节气的准确时间。
&&&&&&& 古代天文学家在对包括地球和月亮在内的行星运行轨道精确计算后发现,天体的运行因为受相近天体的影响,并不严格遵循理论方法计算出来的轨道,而是在理论轨道附近波动。这种影响在天文学上被称为摄动,摄动很难被精确计算,只能根据经验估算。但是经过长期的观测和计算,天文学家发现行星轨道因为摄动影响而产生的波动其实也是有规律的,即在相当长的时间内呈现出周期变化的趋势。于是天文学家开始研究这种周期变化,希望通过一种类似曲线拟合的方法,对一些周期计算项按照某种计算式迭代求和计算代替积分计算来模拟行星运行轨迹。这种计算式可以描述为:a + bt + ct2&+ & xcos(p + qt + rt2&+ &),其中t是时间参数,这样的理论通常被称为半解析(semi-analytic)理论。其实早在十八世纪,欧洲学者Joseph Louis Lagrange就开始尝试用这种周期项计算的方法修正行星轨道,但是他采用的周期项计算式是线性方程,精度不高。
&&&&&&& 1982年,P.Bretagnon公开发表了VSOP行星理论(这个理论的英文名称是:Secular Variations of the Planetary Orbits,VSOP的缩写其实是源于法文名称:Variations S&culaires des Orbites Plan&taires),VSOP理论是一个描述太阳系行星轨道在相当长时间范围内周期变化的半分析(semi-analytic)理论。VSOP82理论是VSOP理论的第一个版本,提供了对太阳系几大行星位置计算的周期序列,通过对周期序列进行正弦或余弦项累加求和,就可以得到这个行星在给定时间的轨道参数。不过VSOP82由于每次都会计算出全部超高精度的轨道参数,这些轨道参数对于历法计算这样的民用场合很不适用。1987年,Bretagnon 和 Francou 创建了VSOP87行星理论,VSOP87行星理论不仅能计算各种精密的轨道参数,还可以直接计算出行星的位置,行星位置可以是各种坐标系,包括黄道坐标系。VSOP87行星理论由6张周期项系数表组成,分别是VSOP87、VSOP87A、VSOP87B、VSOP87C、VSOP87D和VSOP87E,其中VSOP87D表可以直接计算行星日心黄经(L)、日心黄纬(B)和到太阳的距离(R),此表计算出的结果适用于节气位置判断。
&&&&&&& VSOP87D表包含了三部分数据,分别是计算行星日心黄经的周期项系数表(L表)、计算行星日心黄纬的周期项系数表(B表)和计算行星和太阳距离的周期项系数表(R表)。VSOP87D表有太阳系8大行星的数据,本文的计算只关心与地球相关的数据。L表由L0-L5六部分组成,每一部分都包含若干个周期项系数条目,比如L0表有559个周期项系数条目,L1表有341个条目等等。L表的每个周期项系数条目包含若干个参数,用于计算各种轨道参数和位置参数,计算地球的日心黄经只需要用到其中三个系数。计算所有的周期项系数并不是必须的,有时候减少一些系数比较小的周期项可以减少计算所花费的时间,当然,这会牺牲一点精度。假设计算地球日心黄经的三个系数是A、B和C,则每个周期项的计算表达式是:
A * cos(B + C&)&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&(3.3式)
其中&是儒略千年数,&的计算公式如下:
& = (JDE - ) / 365250&&&&&&&&&&&&&&& &&&&(3.4式)
JDE是计算轨道参数的时间,单位是儒略日,是公元日 12时的儒略日数,关于儒略日的概念,请参考&日历生成算法&的第一篇《中国公历(格里历)》中的说明以及计算方法。以L0表的第二个周期项为例,这个周期项数据中与日心黄经计算有关的三个系数分别是A= ,B=4.,C=9140,则第二个周期项的计算方法是: * cos(4. + 914 * &)。对L0表的各项分别计算后求和可得到L0表周期项总和L0,对L表的其它几个部分使用相同的方法计算周期项和,可以得到L1、L2、L3、L4和L5,然后用用3.5式计算出最终的地球日心黄经,单位是弧度:
L = (L0 + L1 * &+ L2 * &2&+ L3 * &3&+ L4 * &4&+L5 * &5) / 108&&&&&&&&&&(3.5式)
用同样的方法对地球日心黄纬的周期项系数表和计算行星和太阳距离的周期项系数表计算求和,可以得到地球日心黄纬B和日地距离R,B的单位是弧度,R的单位是天文单位(AU)[1]。由于3.5式的计算方法需要多次计算&的乘方,浮点数的乘方计算的速度比较慢,实际计算时,通常对3.5式进行变换,用乘法和加法代替直接的乘方计算,这是一种常用的转换:
L = (((((L5 * & + L4) * & + L3) * & + L2) * & + L1) * & + L0) / 108&& &&&&&(3.6式)
本文就是使用3.6式代替3.5式进行计算。
&&&&&&& VSOP82/87行星理论中的周期项系数对不同的行星具有不同的精度,对地球来说,在年之间的200年跨度期间,计算精度是0.005"。前文曾说过,对于不需要这么高精度的计算应用时,可以适当减少一些系数比较小的周期项,减少计算量,提高计算速度。Jean Meeus在他的《天文算法》一书中就给出了一套精简后的VSOP87D表的周期项,将计算地球黄经的L0表由原来的559项精简到64项,计算地球黄纬的B0表甚至被精简到只有5项,从实际效果看,计算精度下降并不多,但是极大地减少了计算量。
&&&&&&& 使用VSOP87D周期项系数表计算得到的是J2000.0平黄道和平春分点(mean dynamic ecliptic and equinox)为基准的日心黄经(L)和日心黄纬(B),其值与标准FK5系统略有差别,如果对精度要求很高可以采用下面的方法将计算得到的日心黄经(L)和日心黄纬(B)转到FK5系统[2]:
首先然后&L',单位是度:
&L' = L - 1.397 * T - 0.00031*T2&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&(3.7式)
3.7式中的T是儒略世纪数,它与儒略千年数&的关系是:T = 10 *&。然后使用L'计算L和B的修正值&DL和&DB:
&&DL = -0.09033 + 0.03916 * ( cos(L') + sin(L') ) * tan(B)&&&&&&&&&&&& (3.8式)
&&DB = +0.03916 * ( cos(L') - sin(L') ) &&&&&&&&&&&&&&&&&&&&&&&&&&&&(3.9式)
&&DL和&DB的单位都是",是度分秒角度单位体系,需要将3.6式计算出得L和B转换成以度(&)为单位的值后再进行修正。
&&&&&&& CalcSunEclipticLongitudeEC()函数就是使用VSOP87行星理论计算行星日心黄经的代码实现,整个计算过程和前文描述一样,首先根据VSOP87D表的数据计算出L0-L5,然后用3.6式计算出地球的日心黄经,3.6式计算出来的单位是弧度,因此转换成度分秒单位,最后使用3.1式将结果转换成太阳的地心黄经:
&double&CalcSunEclipticLongitudeEC(double&dt)
&&&&&double&L0&=&CalcPeriodicTerm(Earth_L0,&sizeof(Earth_L0)&/sizeof(VSOP87_COEFFICIENT),&dt);
&&&&&double&L1&=&CalcPeriodicTerm(Earth_L1,&sizeof(Earth_L1)&/sizeof(VSOP87_COEFFICIENT),&dt);
&&&&&double&L2&=&CalcPeriodicTerm(Earth_L2,&sizeof(Earth_L2)&/sizeof(VSOP87_COEFFICIENT),&dt);
&&&&&double&L3&=&CalcPeriodicTerm(Earth_L3,&sizeof(Earth_L3)&/sizeof(VSOP87_COEFFICIENT),&dt);
&&&&&double&L4&=&CalcPeriodicTerm(Earth_L4,&sizeof(Earth_L4)&/sizeof(VSOP87_COEFFICIENT),&dt);
&&&&&double&L5&=&CalcPeriodicTerm(Earth_L5,&sizeof(Earth_L5)&/sizeof(VSOP87_COEFFICIENT),&dt);
&&&&&double&L&=&(((((L5&*&dt&+&L4)&*&dt&+&L3)&*&dt&+&L2)&*&dt&+&L1)&*&dt&+&L0)&/;
&&&&&/*地心黄经 = 日心黄经 + 180度*/
&&&&&return&(Mod360Degree(Mod360Degree(L&/&RADIAN_PER_ANGLE)&+&180.0));
Mod360Degree()函数将大于360&或小于0&的值调整到0-360&之间,便于转换显示。CalcPeriodicTerm()函数使用3.3式对一个周期项系数表进行求和计算,可以指定需要计算的周期项数:
&double&CalcPeriodicTerm(const&VSOP87_COEFFICIENT&*coff,&int&count,&double&dt)
&&&&&double&val&=&0.0;
&&&&&for(int&i&=&0;&i&&&&i++)
&&&& &&& val&+=&(coff[i].A&*&cos((coff[i].B&+&coff[i].C&*&dt)));
&&&&&return&
同样的方法计算太阳的地心黄纬:
&double&CalcSunEclipticLatitudeEC(double&dt)
&&&&&double&B0&=&CalcPeriodicTerm(Earth_B0,&sizeof(Earth_B0)&/sizeof(VSOP87_COEFFICIENT),&dt);
&&&&&double&B1&=&CalcPeriodicTerm(Earth_B1,&sizeof(Earth_B1)&/sizeof(VSOP87_COEFFICIENT),&dt);
&&&&&double&B2&=&CalcPeriodicTerm(Earth_B2,&sizeof(Earth_B2)&/sizeof(VSOP87_COEFFICIENT),&dt);
&&&&&double&B3&=&CalcPeriodicTerm(Earth_B3,&sizeof(Earth_B3)&/sizeof(VSOP87_COEFFICIENT),&dt);
&&&&&double&B4&=&CalcPeriodicTerm(Earth_B4,&sizeof(Earth_B4)&/sizeof(VSOP87_COEFFICIENT),&dt);
&&&&&double&B&=&(((((B4&*&dt)&+&B3)&*&dt&+&B2)&*&dt&+&B1)&*&dt&+&B0)&/&;
&&&&/*地心黄纬 = -日心黄纬*/
&&&&return&-(B&/&RADIAN_PER_ANGLE);
AdjustSunEclipticLongitudeEC()函数根据3.8式计算黄经的修正量,longitude和latitude参数是由VSOP87理论计算出的太阳地心黄经和地心黄纬,单位是度,dt是儒略千年数,返回值单位是度:
&double&AdjustSunEclipticLongitudeEC(double&dt,&double&longitude,&double&latitude)
&&&&&double&T&=&dt&*&10;&//T是儒略世纪数
&&&&&double&dbLdash&=&longitude&-&1.397&*&T&-&0.00031&*&T&*&T;
&&&&&// 转换为弧度
&&&& dbLdash&*=&RADIAN_PER_ANGLE;
&&&&&return&(-0.09033&+&0.03916&*&(cos(dbLdash)&+&sin(dbLdash))&*&tan(latitude&*RADIAN_PER_ANGLE))&/&3600.0;
&&&&&&&&经过上述计算转换得到坐标值是理论值,或者说是天体的几何位置,但是FK5系统是一个目视系统,也就是说体现的是人眼睛观察效果(光学位置),这就需要根据地球的物理环境、大气环境等信息做进一步的修正,使其和人类从地球上观察星体的观测结果一致。
【下篇将介绍修正理论和修正算法,请继续关注】
小知识1:天文单位
&&&&&&&&天文单位(英文:Astronomical Unit,简写AU)是一个长度的单位,约等于地球跟太阳的平均距离。天文单位是天文常数之一,是天文学中测量距离,特别是测量太阳系内天体之间的距离的基本单位。地球到太阳的平均距离大约为一个天文单位,约等于1.496亿千米。&1976年,国际天文学联会把一天文单位定义为一颗质量可忽略、公转轨道不受干扰而且公转周期为365.2568983日(即一高斯年)的粒子与一个质量相等约一个太阳的物体的距离。当前普遍被接受并使用的天文单位的值是149,597,870,691&30米(约一亿五千万公里)。
小知识2:FK5系统
&&&&&&& FK5常用的目视星表系统,又称第五基本星表,是在FK4(第四基本星表)的基础上发展出来的,对FK4星表进行了修正,于1984年正式启用。它定义了一个以太阳质心为中心,J2000.0平赤道和春分点为基准的天球平赤道坐标系。近年来国际上又编制了FK6星表(第六基本星表),但是还没有被正式启用。
&&&&&&& 经过上述计算转换得到坐标值是理论值,或者说是天体的几何位置,但是FK5系统是一个目视系统,也就是说体现的是人眼睛观察效果(光学位置),这就需要根据地球的物理环境、大气环境等信息做进一步的修正,使其和人类从地球上观察星体的观测结果一致。
&&&&&&& 首先需要进行章动修正。章动是指地球沿自转轴的指向绕黄道极缓慢旋转过程中,由于地球上物质分布不均匀性和月球及其它行星的摄动力造成的轻微抖动。英国天文学家詹姆斯&布拉德利()最早发现了章动,章动可以沿着黄道分解为水平分量和垂直分量,黄道上的水平分量记为&D&,称为黄经章动,它影响了天球上所有天体的经度。黄道上的垂直分量记为&D&,称为交角章动,它影响了黄赤交角。目前编制天文年历所依据的章动理论是伍拉德在1953年建立的,它是以刚体地球模型为基础的。1977年,国际天文联合会的一个专家小组建议采用非刚体地球模型――莫洛坚斯基II模型代替刚体地球模型计算章动,1979年的国际天文学联合会第十七届大会正式通过了这一建议,并决定于1984年正式实施。
&&&&&&& 地球章动主要是月球运动引起的,也具有一定的周期性,可以描述为一些周期项的和,主要项的周期是6798.4日(18.6年),但其它项是一些短周期项(小于10天)。本文采用的计算方法取自国际天文联合会的IAU1980章动理论,周期项系数数据来源于《天文算法》一书第21章的表21-A,该表忽略了IAU1980章动理论中系数小于0.0003"的周期项,因此只有63项。每个周期项包括计算黄经章动(&D&)的正弦系数(相位内项系数)、计算交角章动的(&D&)余弦系数(相位外项系数)以及计算辐角的5个基本角距(M、M'、D、F、&O)的线性组合系数。5个基本角距的计算公式是:
平距角(日月对地心的角距离):D = 297.85036 + 480 * T&- 0.0019142 * T2&+ T3&/ 189474&&&&&&&&(3.10式)太阳(地球)平近点角:M = 357.52772 +
* T&- 0.0001603 * T2&- T3&/ 300000&&&&&&&&&(3.11式)月球平近点角M'= 134.96298 + 398 * T + 0.0086972 * T2&+ T3&/ 56250&&&&&&&&(3.12式)
月球纬度参数:F = 93.27191 + 538 * T&- 0.0036825 * T2&+ T3&/ 327270&&&&&&&&&&(3.13式)黄道与月球平轨道升交点黄经:&O= 125.04452 -
* T + 0.0020708 * T2&+ T3&/ 450000&&&&&&&&&&&&(3.14式)
以上各式中的T是儒略世纪数,计算出来的5个基本角距的单位都是度,在计算正弦或余弦时要转换为弧度单位。计算每一个周期项的黄经章动过程是这样的,首先将3.10-3.14式计算出来的值与对应的5个基本角距系数组合,计算出辐角。以本文使用的章动周期项系数表中的第七项为例,5个基本角距对应的系数分别是1、0、-2、2和2,辐角&的值就是:-2D + M + 2F + 2&O。计算出辐角后就可以计算周期项的值:
S = (S1+ S2 * T) * sin(&)&&&&&&&&&&&&&&&&&&&&&&&&& (3.15式)
仍以第七项为例,S的值就是(-517 + 1.2 * T)*&sin(&)。对每一项的值S累加就可得到黄经章动,单位是0.0001"。交角章动的计算方法与黄经章动的计算类似,辐角&的值是一样的,只是计算章动使用的是余弦系数:
C = (C1 + C2 * T) * cos(&)&&&&&&&&&&&&&&&&&&&&&&&&& (3.16式)
CalcEarthLongitudeNutation()函数就是计算黄经章动的实现代码:
&double&CalcEarthLongitudeNutation(double&dt)
&&&&&double&T&=&dt&*&10;
&&&&&double&D,M,Mp,F,O
&&&& GetEarthNutationParameter(dt,&&D,&&M,&&Mp,&&F,&&Omega);
&&&&&double&resulte&=&0.0&;
&&&&&for(int&i&=&0;&i&&&sizeof(nutation)&/&sizeof(nutation[0]);&i++)
&&&& &&&&double&sita&=&nutation[i].D&*&D&+&nutation[i].M&*&M&+&nutation[i].Mp&*&Mp&+nutation[i].F&*&F&+&nutation[i].omega&*&O
&&&& &&& resulte&+=&(nutation[i].sine1&+&nutation[i].sine2&*&T&)&*&sin(sita);
&&&&&/*先乘以章动表的系数 0.0001,然后换算成度的单位*/
&&&&&return&resulte&*&0.0001&/&3600.0;
&GetEarthNutationParameter()辅助函数用于计算5个基本角距:
&void&GetEarthNutationParameter(double&dt,&double&*D,&double&*M,&double&*Mp,&double*F,&double&*Omega)
&&&&&double&T&=&dt&*&10;&/*T是从J2000起算的儒略世纪数*/
&&&&&double&T2&=&T&*&T;
&&&&&double&T3&=&T2&*&T;
&&&&&/*平距角(如月对地心的角距离)*/
&&&&&*D&=&297.85036&+&480&*&T&-&0.0019142&*&T2&+&T3&/&;
&&&&&/*太阳(地球)平近点角*/
&&&&&*M&=&357.52772&+&&*&T&-&0.0001603&*&T2&-&T3&/&;
&&&&&/*月亮平近点角*/
&&&&&*Mp&=&134.96298&+&398&*&T&+&0.0086972&*&T2&+&T3&/&56250.0;
&&&&&/*月亮纬度参数*/
&&&&&*F&=&93.27191&+&538&*&T&-&0.0036825&*&T2&+&T3&/&;
&&&&&/*黄道与月亮平轨道升交点黄经*/
&&&&&*Omega&=&125.04452&-&&*&T&+&0.0020708&*&T2&+&T3&/&;
同样,计算交角章动的实现代码是:
&double&CalcEarthObliquityNutation(double&dt)
&&&&&double&T&=&dt&*&10;&/*T是从J2000起算的儒略世纪数*/
&&&&&double&D,M,Mp,F,O
&&&& GetEarthNutationParameter(dt,&&D,&&M,&&Mp,&&F,&&Omega);
&&&&&double&resulte&=&0.0&;
&&&&&for(int&i&=&0;&i&&&sizeof(nutation)&/&sizeof(nutation[0]);&i++)
&&&& &&&&double&sita&=&nutation[i].D&*&D&+&nutation[i].M&*&M&+&nutation[i].Mp&*&Mp&+nutation[i].F&*&F&+&nutation[i].omega&*&O
&&&& &&& resulte&+=&(nutation[i].cosine1&+&nutation[i].cosine2&*&T&)&*&cos(sita);
&&&&&/*先乘以章动表的系数 0.001,然后换算成度的单位*/
&&&&&return&resulte&*&0.0001&/&3600.0;
&&&&&&&&&除了章动修正,对于目测系统来说,还要进行光行差修正。光行差是指在同一瞬间,运动中的观察者所观测到的天体视方向与静止的观测者所观测到天体的真方向之差。造成光行差的原因有两个,一个是光的有限速度,另一个是观察者的运动。在地球上的天文观测者因和地球一起运动(自传+公转),他所看到的星光方向与假设地球不动时看到的方向不一样。以太阳为例,光线从太阳传到地球需要约8分钟的时间,在这8分钟多的时间中,地球沿着公转轨道移动了一段距离人们根据现在的观察认定太阳在那个视位置,事实上那是8分钟前太阳的位置。在精确的天文计算中,需要考虑这种光行差引起的视位置差异,在计算太阳的地心视黄经时,要对其进行光行差修正。地球上的观测者可能会遇到几种光行差,分别是因地球公转引起的周年光行差,因地球自传引起的周日光行差,还有因太阳系或银河系运动形成的长期光行差等等,对于从地球上观察太阳这种情况,只需要考虑周年光行差和周日光行差。因太阳公转速度比较快,周年光行差最大可达到20.5角秒,在计算太阳视黄经时需要考虑修正。地球自传速度比较慢,周日光行差最大约为零点几个角秒,因此计算太阳视黄经时忽略周日光行差。
&&&&&&& 下面是一个粗略计算太阳地心黄经光行差修正量的公式,其中R是地球和太阳的距离:
AC = -20".4898 / R&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&(3.17式)
分子20.4898并不是一个常数,但是其只的变化非常缓慢,在0年是20".4893,在4000年是20".4904。前文提到过,太阳到地球的距离R可以用VSOP87D表的R0-R5周期项计算出来,R的单位是&天文单位(AU)&,和计算太阳地心黄经和地心黄纬类似,太阳到地球的距离可以这样算出来:
&double&CalcSunEarthRadius(double&dt)
&&&&&double&R0&=&CalcPeriodicTerm(Earth_R0,&sizeof(Earth_R0)&/sizeof(VSOP87_COEFFICIENT),&dt);
&&&&&double&R1&=&CalcPeriodicTerm(Earth_R1,&sizeof(Earth_R1)&/sizeof(VSOP87_COEFFICIENT),&dt);
&&&&&double&R2&=&CalcPeriodicTerm(Earth_R2,&sizeof(Earth_R2)&/sizeof(VSOP87_COEFFICIENT),&dt);
&&&&&double&R3&=&CalcPeriodicTerm(Earth_R3,&sizeof(Earth_R3)&/sizeof(VSOP87_COEFFICIENT),&dt);
&&&&&double&R4&=&CalcPeriodicTerm(Earth_R4,&sizeof(Earth_R4)&/sizeof(VSOP87_COEFFICIENT),&dt);
&&&&&double&R&=&(((((R4&*&dt)&+&R3)&*&dt&+&R2)&*&dt&+&R1)&*&dt&+&R0)&/&;
&&&&&return&R;
也可以不使用VSOP,而用下面的公式直接计算日地距离R:
R = 1. (1 - e2) / (1 + e * cos(v))&&&&&&&&&&&&&&&&&(3.18式)
其中e是地球轨道的离心率:
e = 0. - 0. * T - 0. * T2&&& &&(3.19式)
v的计算公式是v = M + C,其中M是太阳平近地角:
M = 357.52910 +
* T - 0.0001559 * T2&- 0. * T3&&&&&(3.20式)
中心C的太阳方程:
C = (1.914600 - 0.004817 * T - 0.000014 * T2) * sin(M)
+ (0.019993 - 0.000101 * T) * sin(2M)
+ 0.000290 * sin(3M)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& (3.21式)
以上各式中的T都是儒略世纪数,M和C的单位都是度,带入3.18式计算时需要转换成弧度单位,计算出R以后,就可以这样计算光行差修正量:
AC = K / R (K是光行差常数,K =&20".49552)&&&&&&& &&(3.22式)
无论是使用3.17式还是使用3.22式,最终计算出来的太阳光行差修正单位都是角秒。
&&&&&&& 由VSOP87理论计算出来的几何位置黄经,经过坐标转换,章动修正和光行差修正后,就可以得到比较准确的太阳地心视黄经,GetSunEclipticLongitudeEC()函数就是整个过程的代码:
&double&GetSunEclipticLongitudeEC(double&jde)
&&&&&double&dt&=&(jde&-&JD2000)&/&;&/*儒略千年数*/
&&&&&// 计算太阳的地心黄经
&&&&&double&longitude&=&CalcSunEclipticLongitudeEC(dt);
&&&&&// 计算太阳的地心黄纬
&&&&&double&latitude&=&CalcSunEclipticLatitudeEC(dt)&*&3600.0;
&&&&&// 修正精度
&&&& longitude&+=&AdjustSunEclipticLongitudeEC(dt,&longitude,&latitude);
&&&&&// 修正天体章动
&&&& longitude&+=&CalcEarthLongitudeNutation(dt);
&&&&&// 修正光行差
&&&&&/*太阳地心黄经光行差修正项是: -20".4898/R*/
&&&& longitude&-=&(20.4898&/&CalcSunEarthRadius(dt))&/&(20&*&PI);
&&&&&return&
参数jde是力学时时间,单位是儒略日,返回太阳地心视黄经,单位是度。
&&&&&&& 到现在为止,我们已经知道如何使用VSOP82/87理论计算以儒略日为单位的任意时刻的太阳地心视黄经,但是这和实际历法计算需求还不一致,历法计算需要根据太阳地心视黄经反求出此时的时间。VSOP82/87理论没有提供反向计算的方法,但是可以采用根据时间正向计算太阳视黄经,配合误差修正进行迭代计算的方法,使正向计算出来的结果向已知结果收敛,当达到一定的迭代次数或计算结果与已知结果误差满足精度要求时,停止迭代,此时的正向输入时间就是所求的时间。地球公转轨道是近似椭圆轨道,轨道方程不具备单调性,但是在某个节气附件的一小段时间区间中,轨道方程具有单调性,这个是本文迭代算法的基础。
&&&&&&& 实际上,我们要做的事情就是求解方程的根,但是我们面临的这个方程没有求根公式。对此类问题,数学上通常采用的迭代求解方法有二分逼近法和牛顿迭代法,事实上二分逼近法可以用更好的策略,比如用黄金分割代替二分法进行逼近区间的选择。接下来我们将分别介绍这两种方法在计算二十四节气中的应用,首先介绍黄金分割逼近法。
&&&&&&& 已知太阳视黄经的值,反求对应的时间的过程是这样的,首先根据节气对应的视黄经角度值W,估算出节气可能的时间区间[A, B],然后找到这个时间区间内黄金分割点对应的时间值C,C的计算采用3.23式:
C = ((B - A) * 0.618) + A&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& (3.23式)
用C值估算出太阳视黄经W&,如果W& & W,则调整调迭代时间区间为[A, C],如果W& & W,则调整迭代时间区间为[C, B],然后重复上述过程,直到W& 与W的差值满足精度要求为止(区间上下限A和B的差值小于门限制也可以作为迭代退出条件)。采用黄金分割法进行逼近求值的算法实现如下:
34&double&CalculateSolarTerms(int&year,&int&angle)
36&&&&&double&lJD,&rJD;
37&&&& EstimateSTtimeScope(year,&angle,&lJD,&rJD);&/*估算迭代起始时间区间*/
39&&&&&double&solarTermsJD&=&0.0;
40&&&&&double&longitude&=&0.0;
44&&&& &&& solarTermsJD&=&((rJD&-&lJD)&*&0.618)&+&lJD;
45&&&& &&& longitude&=&GetSunEclipticLongitudeECDegree(solarTermsJD);
46&&&& &&&&/*
47&&&& &&& &&& 对黄经0度迭代逼近时,由于角度360度圆周性,估算黄经值可能在(345,360]和[0,15)两个区间,
48&&&& &&& &&& 如果值落入前一个区间,需要进行修正
49&&&& &&& */
50&&&& &&& longitude&=&((angle&==&0)&&&&(longitude&&&345.0))&?&longitude&-&360.0&:
52&&&& &&&&(longitude&&&double(angle))&?&rJD&=&solarTermsJD&:&lJD&=&solarTermsJD;
53&&&&&}while((rJD&-&lJD)&&&0.0000001);
55&&&&&return&solarTermsJD;
这里要特别说明一下,由于角度的360度圆周性,当在太阳黄经0度附近逼近时,区间的上下界可能分别位于(345, 360]和[0, 15)两个区间上,此时需要将(345, 360]区间修正为(-15, 0],使得逼近区间边界的选取能够正常进行。EstimateSTtimeScope()函数估算节气的时间区间,估算的依据是每个月的节气时间比较固定,最多相差一两天,考虑的几千年后岁差的影响,这个估算范围还可以再放宽一点,比如,对于月内的第一个节气,可以将时间范围估算为4日到9日,对于月内的第二个节气,可以将时间范围估算为16日到24日,保证迭代范围内有解。EstimateSTtimeScope()函数算法简单,这里就不列出代码了。
&&&&&&& 二分逼近或黄金分割逼近算法实现简单,很容易控制,但是也存在效率低,收敛速度慢的问题,现在我们介绍牛顿迭代法,牛顿迭代法是一种在实数域和复数域上近似求解方程的方法。假设我们要求解的方程是f(x) = 0,如果f(x)的导函数f&(x)是连续的,则在真实解x附近的区域内任意一点x0开始迭代,则牛顿迭代法必收敛,特别当f&(x)不等于0的时候,牛顿迭代法是平方收敛的,也就是说,每迭代一次,结果的有效数字将增加一倍。
&&&&&&& 简单的说,对于方程f(x) = 0,f(x)的导函数是f&(x),则牛顿迭代法的迭代公式是:
Xn+1&= xn&& f(xn)/f&(xn)&&&&&&&&&&&&&&&&&&&&&&&&&&&&& (3.24式)
现在问题就是如何确定方程f(x)。对于我们面临的问题,可以理解为已知angle,通过GetSunEclipticLongitudeEC(solarTermsJD)函数反向求解solarTermsJD的值,因此我们的方程可以理解为:
f(x) = GetSunEclipticLongitudeEC(x) & angle = 0
确定了方程f(x),剩下的问题就是求导函数f&(x)。严格的求解,应该根据GetSunEclipticLongitudeEC()函数,以儒略千年数dt为自变量,按照函数求导的规则求出导函数。因为GetSunEclipticLongitudeEC()函数内部是调用其他函数,因此可以理解为是一个多个函数组合的复合函数,类似f(x) = g(x) + h(x, k(x)) + p(x)这样的形式,可以按照求导规则逐步对其求导得到导函数。但是我不打算这么做,因为我有更简单的方法,那就是使用计算导数的近似公式。其实求导函数的目的就是为了得到某一点的导数,如果有近似公式可以直接得到这一点的导数,就不用费劲求导函数了。
&&&&&&& 如果函数f(x)是单调函数,或者是在某个区间上是单调函数,则在此函数的其单调区间上某一点的导数值可以用近似公式计算,这个近似公式是:
f&(x0) = (f(x0&+ 0.000005) & f(x0&& 0.000005)) / 0.00001&&&&&&&&&&& (3.25式)
这是一个精度很高的近似公式,完全可以满足民用历法计算的精度要求。
&&&&&&& 根据以上分析结果,使用牛顿迭代法求解节气的算法就很容易实现了,以下就是牛顿迭代法求解节气的代码:
74&double&CalculateSolarTermsNewton(int&year,&int&angle)
76&&&&&double&JD0,&JD1,stDegree,stD
78&&&& JD1&=&GetInitialEstimateSolarTerms(year,&angle);
81&&&& &&& JD0&=&JD1;
82&&&& &&& stDegree&=&GetSunEclipticLongitudeECDegree(JD0)&-&
83&&&&&&&& stDegreep&=&(GetSunEclipticLongitudeECDegree(JD0&+&0.000005)
84&&&&&&&&&&&&&&&&&&&&&&&-&GetSunEclipticLongitudeECDegree(JD0&-&0.000005))&/0.00001;
85&&&&&&&& JD1&=&JD0&-&stDegree&/&stD
86&&&&&}while((fabs(JD1&-&JD0)&&&0.0000001));
88&&&&&return&JD1;
经过验证,牛顿迭代法具有非常好的收敛效果,一般只需3次迭代就可以得到满足精度的结果。
&&&&&&& 至此,我们就有了完整的计算节气发生时间的方法,输入年份和节气对应的太阳黄经度数,即可求的节气发生的精确时间。最后说明一下,以上算法中讨论的时间都是力学时时间(TD),与国际协调时(UTC)以及各个时区的本地时间都有不同,以上计算出来的时间都需要调整成本地时间,比如中国的中原地区就是东八区标准时(UTC + 8)。关于力学时、国际协调时(世界时)的定义,请参考文末的小知识3:力学时、原子时和国际协调时。应用本文的算法计算出2012年各个节气的时间如下(已经转换为东八区标准时),与紫金山天文台发布的《2012中国天文年历》中发布的时间在分钟级别上完全吻合(此年历只精确到分钟):
, 06:43:54.28&& 小寒
, 00:09:49.08&& 大寒
, 18:22:22.53&& 立春
, 14:17:35.37&& 雨水
, 12:21:01.56&& 惊蛰
, 13:14:24.17&& 春分
, 17:05:34.65&& 清明
, 00:12:03.28&& 谷雨
, 10:19:39.54&& 立夏
, 23:15:30.28&& 小满
, 14:25:52.96&& 芒种
, 07:08:46.98&& 夏至
, 00:40:42.66&& 小暑
, 18:00:50.72&& 大暑
, 10:30:31.88&& 立秋
, 01:06:48.41&& 处暑
, 13:28:59.41&& 白露
, 22:48:57.14&& 秋分
, 05:11:41.45&& 寒露
, 08:13:32.83&& 霜降
, 08:25:56.47&& 立冬
, 05:50:08.09&& 小雪
, 01:18:55.23&& 大雪
, 19:11:35.61&& 冬至
小知识3:力学时、原子时和国际协调时
&&&&&&& 力学时全称是&牛顿力学时&,也被称作是&历书时&。它描述天体运动的动力学方程中作为时间自变量所体现的时间,或天体历表中应用的时间,是由天体力学的定律确定的均匀时间。力学时的初始历元取为1900年初附近,太阳几何平黄经为279&41&48&P.04的瞬间,秒长定义为1900.0年回归年长度的1/7。1958年国际天文学联合会决议决定:自1960年开始用力学时代替世界时作为基本的时间计量系统,规定天文年历中太阳系天体的位置都按力学时推算。力学时与世界时之差由观测太阳系天体(主要是月球)定出,因此力学时的测定精度较低,1967年起被原子时代替作为基本时间计量系统。
&&&&&&& 国际协调时又称世界时,是以本初子午线的平子夜起算的平太阳时,又称格林威治时间。世界各地地方时与世界时之差等于该地的地理经度。世界时1960年以前曾作为基本时间计量系统被广泛应用。由于地球自转速度变化的影响,它不是一种均匀的时间系统。后来世界时先后被历书时和原子时所取代。
&&&&&&& 原子时是以物质的原子内部发射的电磁振荡频率为基准的时间计量系统。原子时的初始历元规定为日世界时0时,秒长定义为铯-133原子基态的两个超精细能级间在零磁场下跃迁辐射周所持续的时间。这是一种均匀的时间计量系统。1967年起,原子时已取代力学时作为基本时间计量系统。
参考文章:
[1]&《Secular variations of the planetary orbits》http://www.worldlingo.com/ma/enwiki/en/Secular_variations_of_the_planetary_orbits
[2] Jean.Meeus.Astronomical.Algorithms(天文算法)
[3] M.Chapront-Touze and J.Chapront.ELP 2000-85 - A semi-analytical lunar ephemeris adequate for historical times.Astronomy And Astrophysics,1998
[4] P.Bretagnon and G.Francou.Planetray theories in rectangular and spherical variables VSOP87 solutions. Astronomy And Astrophysics,1998
& & & &中国农历的朔望月是农历历法的基础,而朔望月又是严格以日月合朔发生的那一天作为月首,因此日月合朔时间的计算是制定农历历法的关键。本文将介绍ELP-2000/82月球运行理论,以及如何用ELP-2000/82月球运行理论计算日月合朔时间。
&&&&&&& 要计算日月合朔时间,首先要对日月合朔这一天文现象进行数学定义。朔望月是在地球上观察到的月相周期,平均长度约等于29.53059日,而恒星月(天文月)是月亮绕地球公转一周的时间,长度约27.32166日。月相周期长度比恒星月长大约两天,这是因为在月球绕地球旋转一周的同时,地球还带着它绕太阳旋转了一定的角度的缘故,所以月相周期不仅与月球运行有关,还和太阳运行有关。日月合朔的时候,太阳、月亮和地球三者接近一条直线,月亮未被照亮的一面对着地球,因此地球上看不到月亮,此时又被称为新月。图(1)就是日月合朔天文现象的示意图:
图(1)日月天文现象示意图
月亮绕太阳公转的白道面和地球绕太阳公转的黄道面存在一个最大约5&的夹角,因此大多数情况下,日月合朔时都不是严格在同一条直线上,不过也会发生在同一直线的情况,此时就会发生日食。图(1-b)显示了日月合朔时侧切面上月亮的三种可能的位置情况,当月亮处在位置2时就会发生日食。由图(1)可知,日月合朔的数学定义就是太阳和月亮的地心视黄经差为0的时刻。
&&&&&&& 要计算日月合朔,需要知道太阳地心视黄经和月亮地心视黄经的计算方法。&日历生成算法&系列的第三篇《用天文方法计算二十四节气》一文已经介绍了如何用VSOP82/87行星理论计算太阳的地心视黄经,本文将继续介绍如何用ELP-2000/82月球理论计算月亮的地心视黄经。ELP-2000/82月球理论是M. Chapront-Touze和J. Chapront在1983年提出的一个月球位置的半解析理论,和其它半解析理论一样,ELP-2000/82理论也包含一套计算方法和相应的迭代周期项。这套理论共包含37862个周期项,其中20560个用于计算月球经度,7684个用于计算月球纬度,9618个用于计算地月距离。但是这些周期项中有很多都是非常小的值,例如一些计算经纬度的项对结果的增益只有0.00001角秒,还有一些地月距离周期项对距离结果的增益只有0.02米,对于精度不高的历法计算,完全可以忽略。
&&&&&&& 有很多基于ELP-2000/82月球理论的改进或简化理论,《天文算法》一书的第四十五章就介绍了一种改进算法,其周期项参数都是从ELP-2000/82理论的周期项参数转换来的,忽略了小的周期项。使用该方法计算的月球黄经精度只有10&,月亮黄纬精度只有4&,但是只用计算60个周期项,速度很快,本文就采用这种修改过的ELP-2000/82理论计算月亮的地心视黄经。这种计算方法的周期项分三部分,分别用来计算月球黄经,月球黄纬和地月距离,三部分的周期项的内容一样,由四个计算辐角的系数和一个正弦(或余弦)振幅组成。计算月球黄经和月球黄纬使用正弦表达式求和:A * sin(&),计算地月距离用余弦表达式求和:A * cos(&),其中辐角&的计算公式是:
& = a * D + b * M + c * M& + d * F&&&&&&&&&&&&&&&&&&&&&&&& &&(4.1式)
4.1式中的四个辐角系数a、b、c和d由每个迭代周期项给出,日月距角D、太阳平近地角M、月亮平近地角M&以及月球生交点平角距F则分别有4.2式-4.5式进行计算:
D = 297.8502042 + 5168 * T - 0.0016300 * T2
+ T3&/ 545868 - T4&/ &&&&&&&&&&&&&&&&&& (4.2式)M = 357.5291092 + 9 * T - 0.0001536 * T2
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&(4.3式)M' = 134.9634114 + 6313 * T + 0.0089970 * T2
+ T3&/ 69699 - T4&/
&&&&&&&&&&&&&&&&&&&&(4.4式)F = 93.2720993 + 5273 * T - 0.0034029 * T2
- T3&/ 3526000 + T4&/ &&&&&&&&&&&&&&&&& (4.5式)
以上各式计算结果的单位是度,其中T是儒略世纪数,T计算由4.6式计算:
T = (JDE - ) / 36525.0&&&&&&&&&&&&&&&&&&&&&&& &&(4.6式)
以计算月球黄经的周期项第二项的计算为例,第二项数据如下,辐角系数a = 2,b = 0,c = -1,d = 0,振幅A = 1274027,黄经计算用正弦表达式,则I2的计算如下所示:
I2&= 1274027 * sin(2D & M&)&&&&&&&&&&&&&&&&&&&&&&&&&&& (4.7式)
在套用4.7式计算出60个月球黄经周期项值的时候,需要注意对包含了太阳平近地角M的项进行修正,因为M的值与地球公转轨道的离心率有关,因为离心率是个与时间有关的变量,导致振幅A实际上是个变量,需要根据时间进行修正。月球黄经周期项的修正方法是:如果辐角中包含了M或-M时,需要乘以系数E修正;如果辐角中包含了2M或-2M,则需要乘以系数E的平方进行修正。系数E的计算表达式如下:
E = 1 - 0.002516 * T - 0.0000074 * T2&&&&&&&&&&&&&&&&&&&&&&(4.8式)
其中T值由4.6式计算。上面的计算月球黄经的第二个周期项中M对应的系数是0,因此I2不需要修正,但是第五个周期项中M对应的系数是1,因此I5需要乘以E进行修正。套用4.7式计算出60个月球黄经周期项值I1-I60之和&SI:
&SI = I1&+ I2&+ & + I60&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& (4.9式)
&&&&&&& 月球黄纬的周期项和&Sb的计算方法与月球黄经周期项和&SI的计算方法一样,每个月球黄纬周期项也包含振幅A和四个辐角系数a、b、c和d,对于太阳平近地角M的系数b不是0的情况也需要乘以E或E2进行修正。地月距离的周期项和&Sr也可以按照上面的方法计算,计算地月距离的目的是为了计算月亮光行差,因为地月距离较小,从地球观察月亮产生的光行差也很小,相对于本文算法的精度(月球黄经精度10&,月亮黄纬精度4&)来说,可以忽略光行差修正,因此就不用计算地月距离。
&&&&&&& 由于金星和木星对月球的摄动影响,需要对计算出的月球黄经周期项和&SI和月球黄纬周期项和&Sb金星摄动修正,修正的方法如下:
&SI += +3958 * sin( A1 ) + 1962 * sin( L' - F ) + 318 * sin( A2 )&&&&&&&&&& &&(4.10式)
&Sb += -2235 * sin( L' ) + 382 * sin( A3) + 175 * sin( A1 - F ) + 175 * sin( A1 + F )&&& &&&+ 127 * sin( L' - M') - 115 * sin( L' + M')&&&&&&&&&&&&&&&&&&&&&&&&&& (4.11式)
其中M&和F分别由4.4式和4.5式计算得到,L&是月球平黄经,计算方法是:
L'=218.3164591 + 34236 * T - 0.0013268 * T2
+ T3&/ 538841 - T4&/ &&&&&&&&&&&&&&&&&&&&&&&& (4.12式)
A1、A2和A4是摄动角修正量,计算方法如下:
A1 = 119.75 + 131.849 * T&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& (4.13式)A2 = 53.09 +
* T&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& (4.14式)A3 = 313.45 +
* T&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& (4.15式)
完成所有修正后,就可以用4.16式和4.17式最终得到月亮的地心视黄经和地心视黄纬:
& = L'+ &SI / &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& (4.16式)
& = &Sb / &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& (4.17式)
&SI和&Sb最后要除以是因为周期项系数中振幅A的单位是0.000001度,因此&和&的单位是度。下面给出计算月球地心视黄经的代码:
123&double&GetMoonEclipticLongitudeEC(double&dbJD)
125&&&&&double&Lp,D,M,Mp,F,E;
126&&&&&double&dt&=&(dbJD&-&JD2000)&/&36525.0;&/*儒略世纪数*/
128&&&& GetMoonEclipticParameter(dt,&&Lp,&&D,&&M,&&Mp,&&F,&&E);
130&&&&&/*计算月球地心黄经周期项*/
131&&&&&double&EI&=&CalcMoonECLongitudePeriodicTbl(D,&M,&Mp,&F,&E);
133&&&&&/*修正金星,木星以及地球扁率摄动*/
134&&&& EI&+=&CalcMoonLongitudePerturbation(dt,&Lp,&F);
136&&&&&/*计算月球地心黄经*/
137&&&&&double&longitude&=&Lp&+&EI&/&;
139&&&&&/*计算天体章动干扰*/
140&&&& longitude&+=&CalcEarthLongitudeNutation(dt&/&10.0);
142&&&& longitude&=&Mod360Degree(longitude);
143&&&&&return&
函数参数dbJD是力学时儒略日时间,返回以度为单位的月球视黄经。其中GetMoonEclipticParameter()函数分别根据4.2式、4.3式、4.4式、4.5式、4.8式和4.12式计算日月距角D、太阳平近地角M、月亮平近地角M&、月球生交点平角距F、修正系数E和月球平黄经L&,不需多说明,只要根据以上各式直接计算即可。CalcMoonECLongitudePeriodicTbl()函数计算60个月球黄经周期项和,并根据M值系数的情况进行修正,算法实现如下:
42&double&CalcMoonECLongitudePeriodicTbl(double&D,&double&M,&double&Mp,&double&F,double&E)
44&&&&&double&EI&=&0.0&;
46&&&&&for(int&i&=&0;&i&&&COUNT_ITEM(Moon_longitude);&i++)
48&&&& &&&&double&sita&=&Moon_longitude[i].D&*&D&+&Moon_longitude[i].M&*&M&+Moon_longitude[i].Mp&*&Mp&+&Moon_longitude[i].F&*&F;
49&&&& &&& sita&=&DegreeToRadian(sita);
50&&&& &&& EI&+=&(Moon_longitude[i].eiA&*&sin(sita)&*&pow(E,fabs(Moon_longitude[i].M)));
53&&&&&return&EI;
&CalcMoonLongitudePerturbation()函数计算月球黄经摄动修正量,使用了4.13式和4.14式给出的计算方法:
87&double&CalcMoonLongitudePerturbation(double&dt,&double&Lp,&double&F)
89&&&&&double&T&=&&/*T是'ca?从'b4?J2000起'c6?算'cb?的'b5?儒'c8?略'c2?世'ca?纪'bc?数'ca?*/
90&&&&&double&A1&=&119.75&+&131.849&*&T;
91&&&&&double&A2&=&53.09&+&&*&T;
93&&&& A1&=&Mod360Degree(A1);
94&&&& A2&=&Mod360Degree(A2);
96&&&&&double&result&=&3958.0&*&sin(DegreeToRadian(A1));
97&&&& result&+=&(1962.0&*&sin(DegreeToRadian(Lp&-&F)));
98&&&& result&+=&(318.0&*&sin(DegreeToRadian(A2)));
100&&&&&return&
&&&&&&& 至此,本文已经介绍了使用ELP-2000/82月球理论计算任意时刻月亮地心视黄经的方法,结合&日历生成算法&系列的第三篇《用天文方法计算二十四节气》一文介绍的计算太阳地心视黄经的方法,就可以计算日月合朔的准确时间了。由于ELP-2000/82月球理论也没有根据月球黄经反算时间的方法,因此本文也采用和《用天文方法计算二十四节气》一文中一样的牛顿迭代法计算日月合朔时间。
&&&&&&& 关于牛顿迭代法可以参考相关的数学资料,&日历生成算法&系列的第三篇《用天文方法计算二十四节气》一文对如何使用牛顿迭代法有简单的介绍,可以参考一下。总的来说,就是要先定义需要求解的方程f(x),根据上文的介绍,我们需要求解的是太阳的地心黄经和月亮的地心黄经差值是0的时候的时间,《用天文方法计算二十四节气》一文已经介绍了求太阳地心黄经的函数GetSunEclipticLongitudeECDegree(),本文也给出了求月亮地心黄经的函数GetMoonEclipticLongitudeECDegree(),因此可以定义方程为:
f(x) =&GetMoonEclipticLongitudeECDegree(x) & GetSunEclipticLongitudeECDegree(x) = 0
其中x是儒略日单位的,我们要用牛顿迭代法求方程f(x)=0时的解x,也就是时间值。牛顿迭代法求解的迭代式是:
Xn+1&= Xn&& f(Xn)/f&(Xn)
这里也不多解释了。导函数仍然使用近似公式,也不解释了,直接上迭代求解的代码了:
102&double&CalculateMoonShuoJD(double&tdJD)
104&&&&&double&JD0,&JD1,stDegree,stD
106&&&& JD1&=&tdJD;
107&&&&&do
109&&&& &&& JD0&=&JD1;
110&&&& &&&&double&moonLongitude&=&GetMoonEclipticLongitudeECDegree(JD0);
111&&&& &&&&double&sunLongitude&=&GetSunEclipticLongitudeECDegree(JD0);
113&&&& &&& stDegree&=&moonLongitude&-&sunL
116&&&& &&& stDegreep&=&(GetMoonEclipticLongitudeECDegree(JD0&+&0.000005)&-GetSunEclipticLongitudeECDegree(JD0&+&0.000005)&-GetMoonEclipticLongitudeECDegree(JD0&-&0.000005)&+GetSunEclipticLongitudeECDegree(JD0&-&0.000005))&/&0.00001;
117&&&& &&& JD1&=&JD0&-&stDegree&/&stD
118&&&&&}while((fabs(JD1&-&JD0)&&&0.));
120&&&&&return&JD1;
&&&&&&& 至本文结束,我们已经能够使用半解析算法计算太阳的黄经和月亮的黄经,并且能够通过牛顿迭代法或者24节气的准确时间和日月合朔的准确时间,在这基础上就可以进行中国农历的推算了,&日历生成算法&系列的下一篇将介绍中国农历的历法规则和推算方法。
&&&&&&& 再次说明一下,以上算法中讨论的时间都是力学时时间(TD),与国际协调时(UTC)以及各个时区的本地时间都有不同,以上计算出来的时间都需要调整成本地时间,比如中国的中原地区就是东八区标准时(UTC + 8)。应用本文的算法计算出2012年前后15个日月合朔时间如下(已经转换为东八区标准时):
, 14:09:41.25
, 02:06:27.25
, 15:39:24.16
, 06:34:40.84
, 22:37:08.91
, 15:18:22.12
, 07:46:59.97
, 23:02:06.39
, 12:24:02.83
, 23:54:28.03
, 10:10:36.99
, 20:02:30.98
, 06:08:05.90
, 16:41:37.60
, 03:43:31.34
& & & & 世界各国的日历都是以天为最小单位,但是关于年和月的算法却各不相同,大致可以分为三类:
阳历--以天文年作为日历的主要周期,例如:中国公历(格里历)
阴历--以天文月作为日历的主要周期,例如:伊斯兰历
阴阳历--以天文年和天文月作为日历的主要周期,例如:中国农历
我国古人很早就开始关注天象,定昼夜交替为&日&,月轮盈亏为&月&,寒暑交替为&年&,在总结日月变化规律的基础上制定了兼有阴历月和阳历年性质的历法,称为中国农历。本文将介绍中国农历的历法规则、天干地支(Heavenly Stems,Earthly Branches)的计算方法以、二十四节气与中国农历的关系以及知道节气和日月合朔的精确时间的情况下推算中国农历年历的方法。
&&&&&&& 在介绍中国农历的历法之前,必须要先介绍一下中国古代的纪年方法。中国古代用天干地支纪年,严格来讲,天干地支纪年以及十二属相并不是中国农历历法的一部分,但是在中国历史上直到今天,天干地支以及十二属相一直都是做为中国农历纪年关系密切的一部分而存在,因此这里先介绍一下天干地支纪年法以及十二属相。
&&&&&&& 中国古代纪年不用数字,而是采用天干地支组合。天干有十个,分别是:甲、乙、丙、丁、戊、己、庚、辛、壬、癸;地支有十二个,分别是:子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥。使用时天干地支各取一字,天干在前,地支在后,组合成干支,例如甲子、乙丑、丙寅等等,依次轮回可形成六十种组合,以这些天干地支组合纪年,每六十年一个轮回,称为一个甲子。实际上中国古代纪月、纪日以及纪时辰都采用干支方法,这些干支组合起来就是我们熟悉的生辰八字。十二属相又称&十二生肖&,由十一种源自自然界的动物:鼠、牛、虎、兔、蛇、马、羊、猴、鸡、狗、猪以及传说中的龙组成,用于纪年时,按顺序和十二地支组合成子鼠、丑牛、寅虎、卯兔、辰龙、巳蛇、午马、未羊、申猴、酉鸡、戌狗和亥猪。天干地支以及十二生肖常组合起来描述农历年,比如公历2011年就是农历辛卯兔年、2012年是壬辰龙年等等。
&&&&&&& 计算某一年的天干地支,有很多经验公式,如果知道某一年的天干地支,也可以直接推算其它年份的天干地支。举个例子,如果知道2000年是庚辰龙年,则2012年的干支可以这样推算:()% 10=2,2012年的天干就是从庚开始向后推2个天干,即壬;2012年的地支可以这样推算:(2012 - 2000)% 12 = 0,2012年的地支仍然是辰,因此2012年的天干地支就是壬辰,十二生肖龙年。对于2000年以前的年份,计算出年份差后只要将天干和地支向前推算即可。例如1995年的干支可以这样计算:(2000 & 1995)%10 = 5,(2000 & 1995)%12 = 5,庚向前推算5即是乙,辰向前推算5即是亥,因此1995年的干支就是乙亥,十二生肖猪年。这个干支推算算法的实现如下:
&&202&void&CalculateYearGanZhi(int&year,&int&*gan,&int&*zhi)
&&204&&&&&int&sc&=&year&-&2000;
&&205&&&&&*gan&=&(7&+&sc)&%&10;
&&206&&&&&*zhi&=&(5&+&sc)&%&12;
&&208&&&&&if(*gan&&&0)
&&209&&&& &&&&*gan&+=&10;
&&210&&&&&if(*zhi&&&0)
&&211&&&& &&&&*zhi&+=&12;
获得2008年的干支纪年:
&&&&9&TCHAR&*nameOfTianGan[COUNTS_FOR_TIANGAN]&=&{_T("甲"),_T("乙"),_T("丙"),_T("丁"),_T("戊"),_T("己"),_T("庚"),_T("辛"),_T("壬"),_T("癸")&};
&&&10&TCHAR&*nameOfDiZhi[COUNTS_FOR_DIZHI]&=&{_T("子"),_T("丑"),_T("寅"),_T("卯"),_T("辰"),_T("巳"),_T("午"),_T("未"),_T("申"),_T("酉"),_T("戌"),_T("亥")};
&&146&&&&&int&gan,
&&148&&&& CalculateYearGanZhi(2008,&&gan,&&zhi);
&&150&&&& text.Format(_T("农历【%s%s】%s年"),
&&151&&&& &&& &&& &&& year,&m_curMonth,&nameOfTianGan[gan&-&1],&nameOfDiZhi[zhi&-&1],&nameOfShuXiang[zhi-&1]);
结果是:农历戊子鼠年。
&&&&&&& 中国农历是以月亮运行周期为基础,结合太阳运行规律(二十四节气)制定的历法,农历月的定义规则就是中国农历历法的关键,因此要了解中国农历的历法规则,就必须知道如何定义月,如何设置闰月?中国农历的一年有十二个月或十三个月,但是正统的叫法只有十二个月,分别是正月、二月、三月、四月、五月、六月、七月、八月、九月、十月、冬月和腊月(注意,正统的中国农历是没有十一月和十二月的,如果你用的历法软件有显示农历十一月和农历十二月,就说明非常不专业)。中国民间常用&十冬腊月天&来形容寒冷的天气,其实指的就是十月,十一月和十二月这三个最冷的月份。一年有十三个月的情况是因为有闰月,多出来的这个闰月没有月名,只是跟在某个月后面,称为闰某月。比如公历2009年对应的农历乙丑年,就是闰五月,于是这一年可以过两个端午节。
&&&&&&& 中国农历为什么会有闰月?其实中国农历置闰月是为了协调回归年和农历年的矛盾。前面提到过,中国农历是一种阴阳历,农历的月分大月和小月,大月一个月是30天,小月一个月是29天。中国农历把日月合朔(太阳和月亮的黄经相同,但是月亮不可见)的日期定位月首,也就是&初一&,把月圆的时候定为望日,也就是&十五&,月亮绕地球公转一周称为一个朔望月。天文学的朔望月长度是29.5306日,中国农历以朔望月为基础,严格保证每个月的头一天是朔日,这就使得每个月是大月还是小月的安排不能固定,通常需要通过天文学观测和计算来确定。一个农历年由12个朔望月组成,这样一个农历年的长度就是29.5306&&12 = 354.3672日,而阳历的一个天文学回归年是365.2422日,这样一个农历年就比一个回归年少10.88天,这个误差如果累计起来过16年就会出现&六月飞雪&的奇观了。为了协调农历年和回归年之间的矛盾,聪明的先人在天文观测的基础上,找到了&闰月&的方法,通过在适当的月份插入闰月来保证每个农历年的正月到三月是春季,四月到六月是夏季,七月到九月是秋季,十月到十二月是冬季,也就是说,让历法和天文气象能够基本对上,不至于出现&六月飞雪&。
&&&&&&& 那么多长时间增加一个闰月比较合适呢?最早人们推算是&三年一闰&,后来是&五年两润&,随着历法计算的精确,最终定型为&十九年七闰&。这个&十九年七闰&又是怎么算出来的呢?其实就是求出回归年日数

我要回帖

更多关于 日历上的开市是什么意思 的文章

 

随机推荐