[天文学]DE405_DE406星历表算法.docVIP

  1. 1、本文档被系统程序自动判定探测到侵权嫌疑,本站暂时做下架处理。
  2. 2、如果您确认为侵权,可联系本站左侧在线QQ客服请求删除。我们会保证在24小时内做出处理,应急电话:400-050-0827。
  3. 3、此文档由网友上传,因疑似侵权的原因,本站不提供该文档下载,只提供部分内容试读。如果您是出版社/作者,看到后可认领文档,您也可以联系本站进行批量认领。
查看更多
[天文学]DE405_DE406星历表算法.doc

DE405/406星歷表算法?? Post By:2009-2-5 20:43:00 #pragma hdrstop #pragma argsused //有入口參數的此行不能少 #include stdio.h #include stdlib.h #include conio.h #include sxwnl_eph.cpp /*=========================================================== ????????????????? [ DE星歷表計算程序 ] ?????????? 實際測試過DE405及DE406,? xjw01@莆田十中 2009.2 ·本程序在C++Builder6.0中編譯通過 ? 如果VC6.0編譯,請加上 #include stdafx.h 即可。但在在VC中, ? 本程序的讀寫速度降低數倍。 ·程序的功能: ? 1.把DE星歷表的文本星歷庫轉為二進制格式 ? 2.進行星歷計算測試並給出實現算法 ? ·本程序根據JPL網站提供的DE星歷表CD盤資料嚴格計算星歷,與幾萬個標準 ? 數據比較,誤差小於10^-13 ·JPL網站上提供的DE星歷表分為兩部分: ? header.xxx頭文件以及插值數據庫,可以在以下地址下載 ?  HYPERLINK /pub/eph/planets/ascii/ \t _blank /pub/eph/planets/ascii/ ? 該ftp中還提供了插值計算程序,有c、fortran、java等版,其中c程序無 ? 法在window下編譯通過。fortran等版與其提供的頭文件也不匹配,也無 ? 法調試成功。他們所提供的exe測試文件也無法在window平台下運行,所 ? 以編寫些程序解決這些問題. ·插值係數數據庫(以下簡稱數據庫)由多個txt文件組成,每個文件覆蓋一 ? 定的時間範圍.如ascm1900.406數據庫適用於BC1900到BC1800年, ? ascp1900.406適用範圍是1900到2000年。不同版本的DE星歷表,各數據 ? 庫適用的範圍不一定相同,還須根據數據庫內部的數據進行分析。 ·同一版本的數據庫可以使用copy命令連起來,合併為一個數據庫,如: ? copy ascm0100.406+ascp0000.406+ascp0100.406+ascp0200 data.406 ? 但應注意,應根據時間的前後關係按順序連接。如果使把ascm0100.406與 ? ascp0100.406直接連接起來,中間就出現了100年的斷裂,將造本程序將識 ? 別成功。 ·每個數據庫中由若干個數據塊構成,各數據塊按時間順序連接。不過使用 ? copy命令連接後,在兩個文的連接處有一個重複數據塊,讀取時應跳過連接 ? 處的重複塊。各數塊適用的時間範圍一般只有幾十天,如DE405每個數據 ? 塊均為32天。同一版本的星歷表,所有數據塊的時間長度是相同的。一個 ? 數據塊中含有太陽系各個天體坐標的插值係數。不同版本包含的天體個數 ? 不一定全部相同。 ·各天體插值係數在數據塊中的索引位置由頭文件定義。文件結構詳見JPL? 星歷表文件結構示意圖 ·插值算法採用切比雪夫多項式插值 ·本程序生成的二進制文件與JPL官方定義的不太相同。其數據結構是原先 ? fortran的,用c語言生成相同格式的文件十分煩麻,所以本程序放棄官方 ? 定義的格式標準而自行定義數據結構,這使程序變得很短,實現相同的功 ? 能,代碼量不到500行,比官方推薦的數千行c代碼精簡5倍以上。另一方 ? 面,官方程序也表明,其c程序不一定能夠在window下運行(實際上根本沒 ? 有調試過),所以自行定義數據結構是一種較好的選擇。 ===========================================================*/ void ascii2bin(char* headName,char* dataName,char* outName,double startjd,double stopjd){ //頭文件名,數據文件名,輸出文件,起止JD ?if (stopjdstartjd){ printf(错误:终JD小于始JD); exit(0); } ?FILE *fp1, *fp2, *fp3; ?if((fp3=fopen(outName,r)) != NULL) { ?? fclose(fp3); ?? printf(目標文件 %s 已存在,是否覆蓋?y/n\n, outName); ?? if (getch()!=y) exit(0); ?} ?if((fp1=fopen(headName,r))==NULL

文档评论(0)

开心农场 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档