V5.01版的日月食算法所作的改革:
在一次日食过程中,有些参数几乎是不变的,或者说,在一次日食过程中,这些参数的变化几乎可以忽略不计,看作常数即可,我把这些参数首先全部算出。
public static var bba = 1; //贝圆极赤比
public static var tanf1 = 0.0046; //半影锥角
public static var tanf2 = 0.0045; //本影锥角
public static var srad = 0.0046; //太阳平均半径
public static var bhc = 0; //黄交线与赤交线的夹角,简易作图用
public static var dyj = 23500; //地月距
每次日食,这些参数是要重新计算一次。
以前这些参数是大多在各个子程序中要用到的时候临时计算,虽然精确一些,但造成程序不好理解。
把一些参数固定为常数的好处:有利用笔算!!!通过这几个月的编程计算,日食计算“殊路同归”,天文学家早已研究了几百年,哪些可以简化的地方,前人早已研究得十分透彻。以至于,在《中国天文年历》或NASA等资料中,有一些必给的参数“根数”,如tanf1,tanf2等,以前我不太清楚给这些参数有多大的意义,只认为“地月坐标已知,影子的位置自然是确定的”,却没有意识到还有许多“常数”简化计算或使计算思路更清析。当然,在简化的过程中要作不少误差分析。
《日月食计算概要》一书,很想读懂他,但因扫描得太模糊,实在看不下去,所以一直看不清天文学家们的算法。通过近几个月的自己深入计算,基本猜出了他们在算什么,他们大约如何控制精度。
我的计算过程与天文大师们的计算过程不太一样。大师们主要把计算过程公式化,然后在计算过程中按照公式逐步进行计算,也就是将笔算转为电算。我的算法根本不适用于笔算,我在计算过程中不断的调用几个特殊函数,如空间直线与椭球交点求解函数、直线与椭圆位置关系的几个函数,我追求计算过程模块化(做成各个功能函数),因此,分析我的算法,无需过多关系中间数据的演算过程,只需分析模块功能及算法步骤。比如,求解影子的轮廓线,我的算法描述为:(1)描述出月边缘上一点的坐标和太阳边缘上一点的坐标,这两点的方位角相同。(2)调用空间直线与地球的交点函数,求经过这两点的直线与地球的交点。(3)把各个方位角的交点连接起来得到轮廓线。而在《日月食计算概要》中,则给出一组公式来计算。