用于计算Java中天体视差校正的数学错误

时间:2016-02-12 16:18:38

标签: java math astronomy

我正在实施本书Practical Astronomy with your Calculator or Spreadsheet的计算。到目前为止,我的计算结果与本书中的示例计算结果完全相同。

然而,到达§39“计算视差修正”时,我遇到了一些我无法理解的差异。

手头的任务描述如下:

  

作为一个例子,让我们计算26岁月亮的明显右上升和下降   1979年2月16时45分UT,从经度100°W和纬度50°N的海拔60米处观测。地心坐标为α= 22h 35m 19s和δ= -7°41'13'',月球的赤道水平视差是1°01'09''。

本书描述了计算顺序如下: enter image description here

然而,我的第7步的结果是-31.993415,但书中说-31,99 4 415。如果我用计算器上的书的值来做第7步的数学,那么结果也是-31.99 3 415,所以我的结果似乎是正确的,这本书是错误的......

我可以忍受,但步骤10也有所不同。我的结果是-8,570634,书籍结果是-8.538165,相差很大。我已经一遍又一遍地阅读第10步,看看我的代码中是否有错误,但我没有看到它。

直到现在,我的计算和书籍计算完全一样,我被卡住了。我做错了什么(首选),或者这本书出错了(让我们希望不再有......)

此功能的我的Java代码如下:

    static EquatorialCoordinate parallax(EquatorialCoordinate body, ObserverLocation observer, ZonedDateTime zdt, double P) {
    double Hd = 15d * raha(body.α, zdt, observer.λ);
    step("α", body.α);
    step("δ", body.δ);
    step("φ", observer.φ);
    step("λ", observer.λ);
    step("h", observer.h);
    step("H", Hd);

    double H = toRadians(Hd);
    Parallax ρ = parallax(observer.φ, observer.h);

    step("P", P);
    P = toRadians(P);

    double δ = toRadians(body.δ);
    double r = 1d / sin(P);
    step("r", r);
    double ρsinφ = ρ.sin;
    double ρcosφ = ρ.cos;
    step("ρcosφ'",ρcosφ);
    step("ρsinφ'",ρsinφ);
    double Δ = atan((ρcosφ * sin(H)) / ((r * cos(δ)) - (ρcosφ * cos(H))));
    step("Δ", toDegrees(Δ));
    H += Δ;
    step("H'", toDegrees(H));
    Δ = toDegrees(Δ);
    double α$ = body.α - (Δ / 15d);
    step("α'", α$);

    double divident = (r * sin(δ)) - ρsinφ;
    double divisor = ( r * cos(δ) * cos(H) ) - ρcosφ;
    double δ$ = atan(cos(H) * (divident / divisor));
    δ$ = toDegrees(δ$);
    step("δ'", δ$);
    return new EquatorialCoordinate(α$, δ$);
}

“step”函数执行简单格式化的printf。该计划的输出是:

  • α22.588611
  • δ-7.686944
  • φ50.000000
  • λ-100.000000
  • h 60.000000
  • H -31.642500
  • P 1.019167
  • r 56.221228
  • ρcosφ'0.644060
  • ρsinφ'0.762422
  • Δ-0.350915
  • H'-31.993414
  • α'22.612005
  • δ'-8.570634

得到的δ'是-8°34'14.28“而不是-8°32'17”

我已将计算出的H'值替换为书籍值,以查看该书是否包含遗留错误,但即使我这样做,该值也是错误的。

因此......我的一个大问题是,我的实施是错误的(在哪里,我看不到它),或者书籍计算错误。

(Edit :) Class使用strictfp注释,使用java.util.StrictMath。

2 个答案:

答案 0 :(得分:0)

你写

H += Δ;

这改变了H的值。

然后你写

double δ$ = atan(cos(H) * (divident / divisor));

当它应该使用旧值时,使用新版本的H。

答案 1 :(得分:0)

感谢@svasa,我发现第10步的除数应该包含H,而不是H'。 正确的代码是:

static EquatorialCoordinate parallax(EquatorialCoordinate body, ObserverLocation observer, ZonedDateTime zdt, double P) {
    double H = toRadians(15d * raha(body.α, zdt, observer.λ));
    P = toRadians(P);
    Parallax ρ = parallax(observer.φ, observer.h);
    double δ = toRadians(body.δ);
    double r = 1d / sin(P);
    double Δ = atan((ρ.cosφ * sin(H)) / ((r * cos(δ)) - (ρ.cosφ * cos(H))));
    double H$ = H + Δ; 
    double α$ = body.α - (toDegrees(Δ) / 15d);
    double δ$ = toDegrees(atan(cos(H$) * ((r * sin(δ) - ρ.sinφ) / (r * cos(δ) * cos(H) - ρ.cosφ))));

    return new EquatorialCoordinate(α$, δ$);
}