高度方位角的时角计算结果错误

Wrong result calculation Hour angle from altitude azimuth

我正在制作一个 Javascript 程序,其中一个功能是在给定时间和纬度的情况下将 altitude/azimuth 转换为 right-ascension/declination。我的代码可以相当准确地找到磁偏角,我用 Stellarium 检查过。我一直在使用 this 网站来帮助我进行数学运算。

我的程序给了我错误的水平赤经值,我打算用它来找到赤经(我已经有一个函数可以找到当地的恒星时间,它可以工作)。这是我的等式代码
var ha = asin(-sin(az)*cos(alt) / cos(dec)) * (180 / Math.PI); 此代码在 Javascript 中,但我定义了自定义 sin/cos/asin 函数,将度数作为输入,return 弧度,因为这是我的数据所在的形式。

我使用的网站也说这个等式应该给出相同的结果
var ha = acos((sin(alt) - sin(lat)*sin(dec)) / (cos(lat) * cos(dec))) * (180 / Math.PI);
但是,这两个方程式给出了不同的结果,而且根据恒星币的说法,这两个方程式都不正确。我已经检查过我输入的所有变量都是正确的,而且我几乎可以肯定我输入的方程是正确的。 Here 是 github 上的完整代码。我需要帮助弄清楚如何解决这个问题。
--注意这可以是 运行 with node js with no libraries 我得到的结果是 { ra: [ 23, 57, 37.9 ], dec: [ -5, 24, 38.88 ] }
它应该得到 { ra: [ 5, 36, 22.6 ], dec: [ -5, 24, 38.88 ] 它不必很精确,我只真正关心 ra(赤经)的第一个数字。它也被格式化为 HMS 格式。日期时间被硬编码为 2022 年 2 月 1 日 12:00:00,因此如果您要对此进行测试,则应将 stellarium 设置为该日期时间。

这是相关代码

function altazToradec(alt, az, lat, lon, time){
    /*
    right ascension (α)
    declination (δ)
    altitude (a)
    azimuth (A)
    siderial time (ST)
    latitude (φ) (Φ)
    */
    var lst = getLST(time, lon);
    var dec = asin(sin(lat)*sin(alt) + cos(lat)*cos(alt)*cos(az)) * (180 / Math.PI);
    var ha = asin(sin(az)*cos(alt) / cos(dec)) * (180 / Math.PI);//acos((sin(alt) - sin(lat)*sin(dec)) * (sec(lat) * sec(dec))) * (180 / Math.PI);//acos((sin(alt) - sin(lat)*sin(dec)) / (cos(lat)*cos(dec))) * (180 / Math.PI);
    var ra = lst - ha;
    console.log(ha)
    return {
        "ra": ra,
        "dec": dec
    }
}

这里还有一些测试用例

console.log(altazToradecHms(-34.6825, 63.7814, 40.5853, -105.0844, new Date('February 1, 2022 12:00:00').getTime()))// Ft. Collins Co M42 Orion nebula Feb 1st 2022 12:00 noon
console.log(altazToradecHms(-34.6825, 63.7814, 41.875, -87.624, new Date('January 1, 2022 08:00:00').getTime()))//Chicago M42 Orion nebula Jan 1st 2022 8:00 AM
console.log(altazToradecHms(301.7678, 64.41758, 51.49, -0.14, new Date('February 1, 2020 12:00:00').getTime()))//London Eta Cas Feb 1st 2020 12:00 noon

哪个return

{ ra: [ 23, 57, 37.9 ], dec: [ -5, 24, 38.88 ] }
{ ra: [ 19, 4, 59.25 ], dec: [ -6, 16, 33.68 ] }
{ ra: [ 5, 59, 37.02 ], dec: [ -31, 34, 55.6 ] }

而不是

{ ra: [ 5, 36, 22.7], dec: [ -5, 22, 44 ] }
{ ra: [ 5, 36, 22.7 ], dec: [ -5, 22, 40.3 ] }
{ ra: [ 0, 50, 25.7 ], dec: [ 57, 56, 4.7 ] }

注意:我已经检查过,我也相信 getLST() 函数有效,我已经检查过了。 谢谢 - CR。

试试下面的方法。显着变化包括:

  • 在建立 J2000.0 日期时指定 'GMT+0000',除了传递给 altazToradec() 的日期。否则,new Date() returns 当地时间。

  • 来自 MathWorks.com 的 'DEC' 和 'HA' 的来源计算(查看“函数”选项卡下)。

  • 注意:'HA' 和 'RA' 的单位是度,而不是小时。要转换为小时,请乘以(24 小时/360 度),或简单地除以(15 度/小时)。

  • 样本数据来自 StarGazing.net

function deg2rad( x ) { return x * Math.PI / 180 };
function rad2deg( x ) { return x * 180 / Math.PI };

function sinDeg( x ) {
  return Math.sin( deg2rad( x ) );
}

function cosDeg( x ) {
  return Math.cos( deg2rad( x ) );
}

function asinDeg( x ) {
  return rad2deg( Math.asin( x ) );
}

function atan2Deg( y, x ) {
  return rad2deg( Math.atan2( y, x ) );
}

// getLST copied from https://github.com/Blank2275/AstroCoordsJS/blob/master/index.js
// and then tweaked.

function getLST(time, lon){
    //time = new Date(time)
    const J2000Date = new Date('January 1, 2000 12:00:00 GMT+0000').getTime();
    const diff = time - J2000Date;
    const d = diff / (1000 * 60 * 60 * 24);
    var hours = time.getUTCHours();
    var minutes = time.getUTCMinutes();
    var seconds = time.getUTCSeconds();
    var ms = time.getUTCSeconds();
    var utc = (hours * (1000 * 60 * 60) + minutes * (1000 * 60) + seconds * 1000 + ms) / (1000 * 60 * 60 * 24) * 360;//(now.getTime() - beginning.getTime()) / (1000 * 60 * 60 * 24) * 360;
    var lst = 100.46 + (0.985647 * d) + lon + utc;
    if(lst > 360){
        while(lst > 360){
            lst -= 360;
        }
    } else if(lst < 0){
        while(lst < 0){
            lst += 360;
        }
    }
    return lst;
}

// Equations sourced from https://www.mathworks.com/matlabcentral/fileexchange/24581-convert-azimuth-and-elevation-to-right-ascension-and-declination

function altazToradec( alt, az, lat, lon, time ){
    /*
    right ascension (α)
    declination (δ)
    altitude (a)
    azimuth (A)
    siderial time (ST)
    latitude (φ) (Φ)
    */
    var lst = getLST( time, lon );
    var dec = asinDeg( sinDeg( alt ) * sinDeg( lat ) + cosDeg( alt ) * cosDeg( lat ) * cosDeg( az ) );
    var ha = atan2Deg(
      -sinDeg( az ) * cosDeg( alt ) / cosDeg( dec ),
      ( sinDeg( alt ) - sinDeg( dec ) * sinDeg( lat ) ) / ( cosDeg( dec ) * cosDeg( lat ) )
    );
    var ra = ( lst - ha ) % 360;

    return {
        "ha": ha,
        "ra": ra,
        "dec": dec
    }
}

// See example from http://www.stargazing.net/kepler/altaz.html#twig04

console.log( 'Input:  ALT = 49.169122, AZ = 269.14634, LAT = 52.5, LON = 0, Date = 2310 UT on 10th Aug 1998' );
console.log( 'Expected Output:  HA = 54.382617, DEC = 36.466667' );
x = altazToradec( 49.169122, 269.14634, 52.5, 0, new Date('August 10, 1998 23:10:00 GMT+0000') );
console.log( x );