我正在实施本书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''。
然而,我的第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。该计划的输出是:
得到的δ'是-8°34'14.28“而不是-8°32'17”
我已将计算出的H'值替换为书籍值,以查看该书是否包含遗留错误,但即使我这样做,该值也是错误的。
因此......我的一个大问题是,我的实施是错误的(在哪里,我看不到它),或者书籍计算错误。
(Edit :) Class使用strictfp注释,使用java.util.StrictMath。
答案 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(α$, δ$);
}