有关儒略日的问题,不知道如何用统计和delphi来处理?高手中的数学高手进!(200分)

  • 主题发起人 主题发起人 冰力不足
  • 开始时间 开始时间

冰力不足

Unregistered / Unconfirmed
GUEST, unregistred user!
各位师傅好 我想做个软件 但是要用到一些儒略日的数据 有几十万个之多 如下:
2487314.18548766
2487328.94219126
2487343.66373338
2487358.38908187
2487373.14467399
2487387.96716581
2487402.87731068
2487417.90261982
。。。。。。。
已知相邻两个数据之间有大约相等的间隔
请问编程上该怎么处理?写dll又似乎太大 可否运用统计学或者delphi有相关统计的函数可以直接处理,能够获得近似的值就OK? 谢谢!
 
DateTimeToJulianDate 函数 *转换日期时间值为儒略日
DateTimeToModifiedJulianDate 函数 *转换日期时间值为改进的儒略日
JulianDateToDateTime 函数 *转换儒略日期为日期时间值
ModifiedJulianDateToDateTime 函数 *转换修正的儒略日为日期时间值
 
谢谢2楼weiliu 但是您理解错我的意思了 也许我表达得不好
我的意思是有一个数组 里面有几十万个这样的数据 不要用DLL或者数据库 是否有便捷的统计公式或者函数或者过程处理 把它们化为公式或者函数 例如
function shuju(n:integer):Double;
begin
......
end;

这样我调用的时候 只要调用函数
shuju(1),那么就可以得到:2487314.18548766
shuju(2),那么就可以得到:2487328.94219126
 
不好意思,对于这方面没有研究,以下是我在网上查到的一文,里面说应该有计算公式的,看看对你有什么启发:
[儒略日历法的日数的对错与判定方法]

儒略日是一种不记年.月,只记日的历法,这种历法是法国年代学家史家利泽于公元1583年创制的,儒略日是以公元前4712年1月1日为历元,[史家为公元前4713年1月1日],是一个独立的连续不间断的记日长尺。此种历法现在已被天文学家.历法学家,年代学家广泛使用。这种历法是研究古代历史和古代历法等,最为有效的一种工具。它的用途很多,如计算重大事件的总天数,大工程建设的总日数,银行按日计算利息的天数等。只要查算起点的年月日的儒略日天数和终点的儒略日天数,使之相减,就可得出起点到终点的总天数。此种记日的历法在许多方面都是其它历法不能代替的,计算儒略日的方法一般都是查书中的表格,表格中将各世纪,各年,个月日的儒略日天数列出,使用者根据须要来查表格中儒略日天数。而书上表格中世纪,各年的儒略日天数是否正确,无人知晓,我不是怀疑书上表格中儒略日的日数有误,而是我发现不同版本书中,相同年代儒略日数却不同,那么必定有一本书上的儒略日数是错的,可即使知道有一本书的儒略日数有错,但要知道那一本书上的儒略日数有错,也是相当困难的,这个难题一直困扰在我的心中。几年前我就开使研究这个问题,经过几年的研究,我不仅弄清了两本书儒略日的对错,而且发现了一套准确计算任何年儒略日数的公式,以及如何检查书中儒略日数对错的方法,下面我详细谈一谈自己论点论据,以及检查书上儒略日对错的方法。
我研究天文历法已有十余年,我手中有两本历法方面的书,一本是鞠德源先生的[万年历谱],一本是1972年[中国天文年历],而这两本书中列表的各世纪儒略日天数却不同,下面我将两书不同之处列出如下:[部分]
[中国天文年历] [万年历谱]
公元 儒略日 公元 儒略日
1500年1月1日 2268932 1500年1月1日 2268933
1600年 1月1日 2305447 1600年1月1日 2305448
1700年1月1日 2341971 1700年1月1日 2341972
1800年1月1日 2378495 1800年1月1日 2378496,
1900年1月1日 2415019 1900年1月1日 2415020
2000年1月1日 2451544 2000年1月1日 2451545,
以上是两书中各世纪的儒略日天数,[中国天文年历]的各世纪儒略日数均比[万年历谱]上少一日,谁对谁错?这个疑问几年来一直在我心中思考,广大天文历法爱好者对这个问题也一定很感兴趣,在几年以前,我是无法判断和计算出那个对那个错,,经过几年的研究,我发明了一种万年历盘,这种历盘不仅可以计算年干支,月干支,日干支,农历朔日干支.以及二十四节气等,而且还可以准确地计算出任何年代,任何年月日的儒略日的天数。由于有了这个计算公式,我终于解开了心中的疑问,我用计算公式两本书上各世纪,各年一月一日进行了多次验算,一者检验一下我的计算公式是否正确,二者看一看那本书的儒略日错了.经过验证,证明我的计算公式非常准确,而且简单,快捷.在验证时发现了这两本历书都有问题;这两本书中的儒略日天数都有错的地方,下面我就1972年[中国天文年历]和[万年历谱]中的几处错误的地方一一列出,谈谈自己的论点,论据。并将自己计算的公元后各世纪儒略日,日干支,星期列表,供爱好者参考。以及正确判断各年代儒略日数对错的方法.
A,1972年[中国天文年历]从公元1000年到公元2000年各世纪一月一日的儒略日数都是错的,其中,从1000年到1600年1月1日均少一日,1700年,1800年,1900年各世纪1月1日各少两日,2000年1月1日少一日.
B,[万年历谱]从1600年前各世纪一月一日的儒略日数都是正确的,而1700年,1800年,1900年这三个世纪的一月一日的儒略日数均少一日,2000年是正确的。
C,[万年历谱]中各年的;从1年到99年多处出现错误。
以上的结论是用我的计算公式计算后的结论,有人会说你的计算会比天文台的还正确吗?这不要紧,我们以事实为根据,用论据来说话,怎样证明[中国天文年历]和[万年历谱]上儒略日是错误的呢?下面我从四方面谈一谈这个问题.
一,用计算公式来验证对错
二,用日干支验证对错
三,用星期来验证对错
四,用不同年数所应有的闰年和不闰年的定义来验证对错
[一],因为上面的计算结果就是我用计算公式计算的,所以暂不谈计算公式。
[二],用日干支来验证儒略日的正误,我们都知道,干支记日是我国农历的一个主要内容,我国三千多年前就开始使用这种记日的方法.它也是一种不记年,月,只记日的方法,只不过儒略日循环周期是7980年,而干支记日周期是60天而已.一种是记日的长历,一种是记日的短历,但都有同样的功能。任何年的每一天都对应一个干支,儒略日也是一样,任何年的每一天都对应一个儒略日数。所以,那一个儒略日数对应那一个日干支是固定的,而且是可以计算的。如果那一年月日的儒略日数有错,我们用日干支就可以计算出来,但前提是必须知道公元前4712年1月1日的日干支。经过我用公式计算,公元前4712年1月1日干支是癸丑[50],,星期一,计算步骤如下;
示例;1972年[中国天文年历]中1700年1月1日儒略日数是2341971
.用2341971加50,再除以60,余数是41,
这41就是1700年1月1日儒略日2341971所对应的日干支,但是,公元1700年1月1日的日干支实际是43[丙午],这是不容置疑的,所以证明1700年1月1日儒略日2341971是错误的,1700年1月1日正确的儒略日应当是2341973。。。。。。。。。。。。。。。。。。。。。。。. [三],用星期来验证儒略日的正误
公元前4712年1月1日星期一[不必怀疑我的计算]。还以1700年1月1日儒略日为例
用2341971除以7,余数是2,再加上1是星期三。既儒略日2341971所对应的星期是三,但实际上1700年1月1日是星期五,同样也证明儒略日2341971是错的,与2341973.整整少了两日。
当然,这种计算不仅要知道公元前4712年1月1日的日干支,星期,还得知道所计算儒略日数对应的公历年月日的干支,星期。计算后相比较才能知道。一般万年历上只有近一。二百年内各年月日的干支,星期,再早的或再晚的年代就无从查找了。为了让广大天文历法爱好者能自己检验一下儒略日的对错,我用计算公式将公元后各世纪一月一日的儒略日数,及相对应的日干支,星期列表如下,以便各位朋友用上面的方法检查各种版本儒略日的正误,希望各位朋友能把检查各种书上的结果反馈给我。
[公元后] [儒略日] [日干支] [星期]
100年 1757583 53丙辰 三
200年 1794108 38辛丑 二
300年 1830633 23丙戌 一
400年 1867158 8 辛未 日
500年 1903683 53丙辰 六
600年 1940208 38辛丑 五
700年 1976733 23丙戌 四
800年 2013258 8辛未 三
900年 2049783 53丙辰 二
1000年 2086308 38辛丑 一
1100年 2122833 23丙戌 日
1200年 2159358 8辛未 六
1300年 2195883 53丙辰 五
1400年 2232408 38辛丑 四
1500年 2268933 23丙戌 三
1600年 2305448 58辛酉 六
1700年 2341973 43丙午 五
1800年 2378497 27庚寅 三
1900年 2415021 11甲戌 一
2000年 2451545 55戊午 六
2100年 2488070 40癸卯 五
2200年 2524594 34丁酉 三
2300年 2561118 18辛巳 一
2400年 2597642 2乙丑 六
四.用不同年数所应有的闰年和不闰数的定义来验证
用此定义可以正确判断出一段年代中,有多少个闰年,和多少个不闰年,[从起始年1月1日到结束年1月1日]。而知道了多少个闰年和多少个不闰年,就可以计算出这一段年代儒略日是多少日。从而可以计算出书中某一段年代的儒略日数是否正确。定义如下;
A,整世纪的;[格里历年代]
1,起始年是闰年的,100年按25个闰年计算,而不论结束年是否闰年。[即36525日][例;1600年1月1日到1700年1月1日]。
2,起始年不是闰年的,100年按24个闰年计算,而不论结束年是否闰年。[既36524日]计算。[例;1700年1月1日到1800年1月1日,1900年1月1日到2000年1月1日都是36524日]。
3,当100年跨越不闰整百年时,不论起始年是否闰年,均按24个闰年计算。即100年都是36524日]。
[4],儒略历年代,每100年均25个闰年,[36525日],而不论起始年是否闰年。
B,不是整世纪的;[儒略历年代]
1,起始年是闰年的,结束年也是闰年的,闰年数按这段年代中闰年总数减一计算。例如;求 1424年1月1日到1444年1月1日儒略日是多少?这段年代共计6个闰年,但必需按5个闰年计算日数才正确,用5乘366加上15乘365,是,既1424年1月1日到1444年1月1日共计7305日,如果按6个闰年计算,将是7306日,那就不对了。
2起始是闰年的,结束年不是闰年的,这段年代中有几个闰年就按几个闰年计算,
3,起始年不是闰年的,结束年是闰年的,闰年数按这段年代中闰年总数减一计算。
4,起始年不是闰年的,结束年也不是闰年的,这段年代有几个闰年就按几个闰年计算。
[5],格里历年代,如果计算年代不跨越不闰整百年的,按以上四条计算。如果计算年代跨越不闰整百年的,跨越几个不闰百年的,就要减去几日。
用以上几种方法可以检查表格中儒略日数是否正确,当然是计算公式最为简单,准确,但计算公式暂时还不能公布于众。
我用以上几种方法检查了[中国天文年历]的几个年代,同样发现了几处错误,举一例;[中国天文年历]1972年1月1日的儒略日是2441317,1900年1月1日儒略日是2415019,相减是26298,即1900年1月1日到1972年1月1日的儒略日数是26298。我用第四种方法来检查它是否正确,根据第3条定义;起始年不是闰年的,结束年是闰年的,闰年数按这段年代中闰年总数减一计算。我们用72年除4,共计18个闰年,减去一个闰年,剩17个闰年,55个不闰年。17乘366加55乘365,得26297,此即是我计算的1900年1月1日到1972年1月1日的儒略日数,比[中国天文年历]26298少一日。那么谁对谁错?大家查一查闰年数即可知晓。我要提醒大家的是;1972年虽然是闰年,但计算止日是1972年1月1日,而闰日是在2月末,所以,1972年不能以闰年计算就是这个道理。
[万年历谱]列表一百年内各年所加的儒略日天数,我发现同样有错的日数,下面将[万年历谱]各年所加的儒略日数列表如下;[部分]
[年] [日]
一 365
二 730
三 1095
四 1460
八 2921
十二 4382
九十六 35063
我们知道,加1年是在整百年后加的,是加365日还是加366日,与起始年是否闰年有关,例如;从公元1500年1月1日加一年,到1501年1月1日,这一年就是加366日,而1700年1月1日加一年,到1701年1月1日,这一年就是加365日。怎么能固定用365日呢?如果按照我以上定义来实行,就不会出现以上错误,如第2条定义规定;起始年是闰年的,结束年不是闰年的,这段年代中有几个闰年,就按几个闰年计算。从1500年到1501年中有一闰年,那么这一年就按366日来计算。按第4条定义规定;起始年不是闰年的,结束年也不是闰年的,这段年代中有几个闰年就按几个闰年计算。,那么,从1700年1月1日到1701年1月1日中没有闰年,所以,这一年就是365日。
二,[万年历谱]列表中四年是1460日,这明显有错,我们知道,儒略历中每4年中必有一个闰年,所以四年日数必定是1461日,怎么能是1460日呢?在格里历年代中,每4年有时是1460日,有时是1461日。例如;1900年1月1日加4年就要加1460日,而2000年1月1日加4年就要加1461日。用我以上的定义也可以证明。
三,[万年历谱]上九十六年的日数是35063,如果按上表加四年的1460日,应是36523日,我们知道,儒略历每100年必是36525日,按[万年历谱]表的日数计算,整整比实际少了2日,即使加1461日是还少一日,可见,按书上表中儒略日数进行加减,是有很多错误的。
四,[万年历谱]中有如何计算各年月日儒略日的例子,这些例子也有不少错的,取出一个例子来分析;
求1921年7月1日儒略日数的日干支
查表和计算,知儒略日数为;
表1 1900年 2415020
表2 21年 7670
表3 7月1日 + 182
--------------
2422872日
求日干支;2422872+50
----------------- =[40382] 2[乙丑]
60
我经过计算,得出结论是;[万年历谱]]计算1900年7月1日儒略日2422872是对的,日干支也是对的。但是,1900年1月1日儒略日数应是2415021,而不是2415020。而7月1日应加181日,不是182日。虽然最后结果是对的,但式中的三个数却有两处出现错误。我们知道,1921年并不是闰年,2月是28天,到7月1日无论如何也不能加182日。各位天文历法爱好者一查便知道。
从以上几个例子中我们可以看出,儒略日的错误不仅出现在整百年中,几十年,几个月中也有,当然,上面到7月1日182天,可能是计算上的错误。但整世纪的错误,一百年内各年儒略日的错误,这是有目共瞩的。那么,为什么书上屡屡出现这些错误呢?由其象天文台出版的[中国天文年历]也出现这种错误,真是让人费解。我不知道这种错误的表格使用了多少年,因为我没有其它年代有关儒略日的书籍。我也不知道这样的表格是否世界通用,我也没有这面的资料。但是有一点是肯定的,那就是;1972年[中国天文年历]和[万年历谱]中的儒略日有很多错误。
以上是我对[两历]中儒略日对错的看法,及如何验算表格中儒略日对错的方法,和计算某一段年代儒略日数的方法。我希望中国的天文,历法学家看到这篇文章后,希望不吝赐教。对于我的论点论据是否正确,可以批驳,指正。也热忱的希望广大天文,历法爱好者谈谈自己的观点和看法。


辽宁辽阳轴承有限责任公司 王云宽

二零零六年五月十二日[/b]
 
谢谢weiliu 但是跟这些无关 我看我还是必须进一步表达清楚:
有这样几十万个数据
2487314.18548766
2487328.94219126
2487343.66373338
2487358.38908187
2487373.14467399
2487387.96716581
2487402.87731068
2487417.90261982
。。。。。。。
已知相邻两个数据之间有大约相等的间隔
在delphi上能否组织起来 利用高次内插或者其他方法 化繁为简 做成一个函数 这个函数要怎么实现?
我心目中的理想函数:
function shuju(n:integer):Double;
begin
......
end;

这样我调用的时候 只要调用函数
shuju(1),那么就可以得到:2487314.18548766
shuju(2),那么就可以得到:2487328.94219126
..............
shuju(1000000),那么就可以得到:XXXXXXX.XXXXXX
 
间隔
2487314.185487660000000
2487328.942191260000000 14.756703599821700
2487343.663733380000000 14.721542119979800
2487358.389081870000000 14.725348490290300
2487373.144673990000000 14.755592119880000
2487387.967165810000000 14.822491819970300
2487402.877310680000000 14.910144870169400
我计算了你的数据,他们之间大致相同。
另外我想问你一个问题,
1、这些数据你现在使用什么方式存储?
2、你说可以得到近似者就好,你需要的精度是多少?你说说可以满足你要求的精度。
 
楼主的数据之间差异不是完全有规律的,也不是一个固定值,这样,如果精度要求较高的话应该没有什么公式可言了。
 
谢谢zywcd 以及再次谢谢weiliu
zywcd:
我这些数据现在用文本储存 精度当然能够越高越好 最起码能够做到小数点后4-5位就满意了 感谢!
 
日历高手[:D]
 
我有这样的想法,不知道是不是对,供参考。
1、我对于你这样的数据不熟悉,不知道是不是有规律,你应该很清楚。如果数据属于有规律的,比如属于周期变化,我们可以想办法找到其周期,然后拟和出函数。这样在定位了开始位置以后可以简单得到各个位置的数值。
2、使用文本文件的方式,通过定位文本文件的行来完成。
比如这样:(说明:我对于如何高速定位不知道,不过如果采用这样的方式,可以寻找方法)
如果我们想找10000这个数据,
var fp:textfile;
tstr:string;
assignfile(fp,filename);
reset(fp):
for i:=1 to 10000do
readln(fp,tstr);
这个时候tstr中应该就是文本文件中对应该行的数据,
因为你的数据量太大,如果读入内存肯定存在问题。
要是这样的方法可行,我们可以想办法来提高速度。
 
谢谢 但是 读文本的办法不是我要的 我想了解的是delphi中怎么运用统计方法找出规律 并缩短代码量 十分感谢您指教
 
这个数据本身是有规律的吗?
 
有规律的 就如上面您算出的这个间隔 其他的规律没有了
 
如果每行长度是相等的,那么可以把这些数据存为一个文件,并认为这个文件是一个标准的记录文件,然后用内存映射此文件,用指针访问数据,这样访问某条记录只用计算指针位置就行了
 
//补充 意思即:
有几十万个数,找一个函数,该函数的自变量是自然数,自变量去n时,函数值对应的是第n个数据.
 
谢谢轻舞肥羊 我想寻求数学上的处理 这样代码量就不会大
 
那你用这个公式
fun(n) = (nMax - nMin) / (nCount - 1) * (n - 1) + nMin
nMax = 最后一个数(最大)
nMin = 最前一个数(最小)
nCount = 所有数的数量
 
谢谢 这个我试过 用来粗略算恒星的轨道运算还可以套用 解决我这个问题的误差就大了
 
那你拿这一堆没有数学规律的数字,非要编一个规律出来,是不是有点无中生有?
 
我还是坚持开始的想法,除非数据是周期性的变化规律,否则几十万个数据,不管你怎么拟合寻找规律,应该没法达到你的精度要求吧,如果是周期性变化,可以找到方法拟合出一个函数,然后可以简单计算出你的值。
 
后退
顶部