高度方位角的时角计算结果错误
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 );
我正在制作一个 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 );