제가 천문에 관련된 프로그래밍을 조금 할줄 알다보니 태양의 위치 및 일출/일몰에 대한 문의가 자주 들어옵니다. 개인적인 소스는 있지만 높은 정확도를 위한 것이라 일반인들이 이해하기에는 수준이 높습니다.

출처 : http://very-bored.com/index.php?option=com_content&task=view&id=135&Itemid=29



대부분 문의유형을 살펴보면 태양전지판을 효율적으로 사용하기 위해 태양의 방향에 따라 입사각이 90도가 이뤄지도록 구동하는 장치를 개발을 해야한다던가 수족관의 전등을 일출/일몰 시간에 맞게 자동으로 On/Off시켜줘야 한다는 뭐 아주 간단하면서 정확도가 그리 중요하지 않은 수준의 구현을 요구하는 것들이 대부분 입니다.

일전에 관련되어 문의를 받았지만 요즘에는 개인적으로 너무 바쁘고 여유가 없어서 설명을 드리고 싶지만 드릴 수 있는 시간조차 없었습니다. 몇주가 답변을 못드리다가 잠깐 짬을 내어 답변을 드렸지요.

웹상에서 찾아보면 일몰/일출 시간 소스는 얼마든지 있습니다. 그 방법도 엄청 많이 나와있지요. 단지 어찌 찾아야하는 것인지 있어도 어찌 활용해야하는지 모르시는 분들이 대부분이라 생각합니다. 그래서 여기에 이 부분에 대해 설명한 사이트들을 소개하고 마지막으로 웹에 공개된 C++소스에 주석처리한 것을 공유하겠습니다.

태양위치 계산은 정확도에 따라서 계산방법은 천차만별입니다. 그러므로 완벽한 정답은 없습니다. 상황에 맞게 쓰시면 됩니다.
 
아래내용은 태양의 일출/일몰 계산 방법을 간략하게 소개하고 있습니다.
http://www.stargazing.net/kepler/sunrise.html
 
PHP 언어로 만들어진 일출/일몰 소스입니다.
http://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=39302&sca=%C7%D4%BC%F6&page=29
 
C또는 C++로 만들어진 일출/일몰 소스입니다.
http://www.sci.fi/~benefon/stuff.html
아래 붙여놓은 소스는 여기에서 구현한 C++소스를 주석처리 해놓은 것 입니다. 참고하시고 main()함수부터 천천히 보세요. 이것으로 근사적 일출/일몰 시간을 계산할 수 있습니다.

구현하신다음 맞는지 확인하기 위해 아래 링크를 참고하세요.
http://www2009.kasi.re.kr/knowledge/solun_riset.aspx

// C++ program calculating the sunrise and sunset for
// the current date and a fixed location(latitude,longitude)
// Jarmo Lammi 1999 - 2000
// Last update January 6th, 2000

#include <iostream.h>
#include <math.h>
#include <time.h>

extern double pi;
double tpi = 2 * pi; 
double degs = 180.0/pi;
double rads = pi/180.0;

double L,g,daylen;
double SunDia = 0.53;     // Sunradius degrees(지구에서 본 태양의 반지름각. 단위:도)

double AirRefr = 34.0/60.0; // athmospheric refraction degrees (지구대기 굴절각)//

//   Get the days to J2000
//   h is UT in decimal hours
//   FNday only works between 1901 to 2099 - see Meeus chapter 7
// 이 함수는 J2000 1월 1일 12시 DT를 기준으로 날수(Day Number)를 구합니다. (Meeus의 책 챕터 7을 참고하세요)
// J2000에 대해서는 제 블로그 http://blog.jidolstar.com/487 를 참고하세요.
// 입력값은 년,월,일,시간(실수값)입니다. 
double FNday (int y, int m, int d, float h) {
int luku = - 7 * (y + (m + 9)/12)/4 + 275*m/9 + d;
// type casting necessary on PC DOS and TClite to avoid overflow
luku+= (long int)y*367;
return (double)luku - 730531.5 + h/24.0;
};

//   the function below returns an angle in the range
//   0 to 2*pi
// 
// 들어온 값을 항상 0~2pi 값안으로 normalize시킵니다. 
double FNrange (double x) {
    double b = x / tpi;
    double a = tpi * (b - (long)(b));
    if (a < 0) a = tpi + a;
    return a;
};

// Calculating the hourangle
// 시간각을 계산합니다. 
double f0(double lat, double declin) {
double fo,dfo;
// Correction: different sign at S HS
dfo = rads*(0.5*SunDia + AirRefr); if (lat < 0.0) dfo = -dfo;
fo = tan(declin + dfo) * tan(lat*rads);
if (fo>0.99999) fo=1.0; // to avoid overflow //
fo = asin(fo) + pi/2.0;
return fo;
};

// Calculating the hourangle for twilight times
// 박명시간에 대한 시간각을 계산합니다. 
double f1(double lat, double declin) {
double fi,df1;
// Correction: different sign at S HS
df1 = rads * 6.0; if (lat < 0.0) df1 = -df1;
fi = tan(declin + df1) * tan(lat*rads);
if (fi>0.99999) fi=1.0; // to avoid overflow //
fi = asin(fi) + pi/2.0;
return fi;
};


//   Find the ecliptic longitude of the Sun
//  태양의 황경을 구합니다.
double FNsun (double d) {

//   mean longitude of the Sun (태양의 평균 황경)

L = FNrange(280.461 * rads + .9856474 * rads * d);

//   mean anomaly of the Sun (태양의 평균근점이각)

g = FNrange(357.528 * rads + .9856003 * rads * d);

//   Ecliptic longitude of the Sun (태양의 황경계산)

return FNrange(L + 1.915 * rads * sin(g) + .02 * rads * sin(2 * g));
};

// Display decimal hours in hours and minutes
// 이것은 실수(Real Number)로 표현된 시간을 시:분으로 표기 하기 위한 겁니다. 
void showhrmn(double dhr) {
int hr,mn;
hr=(int) dhr;
mn = (dhr - (double) hr)*60;
if (hr < 10) cout << '0';
cout << hr << ':';
if (mn < 10) cout << '0';
cout << mn;
};


// 메인함수입니다. 
int main(void){
double y,m,day,h,latit,longit;

time_t sekunnit;
struct tm *p;

//  get the date and time from the user
// read system date and extract the year
// 사용자의 시스템에서부터 날짜와 시간을 얻습니다.
/** First get time **/
time(&sekunnit);

/** Next get localtime **/

 p=localtime(&sekunnit);

 y = p->tm_year; //년 
 // this is Y2K compliant method
 y+= 1900;
 m = p->tm_mon + 1; //월 

 day = p->tm_mday; //일

 h = 12; //낮 12시를 기준으로 계산합니다.

//관측장소의 경도(단위 degree),위도(단위 degree),타임존(단위시간) 값을 입력받습니다.
double tzone=2.0;
cout << "Input latitude, longitude and timezone and month\n";
cin >> latit;
cin >> longit;
cin >> tzone;

// testing
// m=6; day=10;

double d = FNday(y, m, day, h);

//   Use FNsun to find the ecliptic longitude of the
//   Sun
// 태양의 황경 
double lambda = FNsun(d);

//   Obliquity of the ecliptic (황도기울기 계산)

double obliq = 23.439 * rads - .0000004 * rads * d;

//   Find the RA and DEC of the Sun (태양의 적경,적위 계산)

double alpha = atan2(cos(obliq) * sin(lambda), cos(lambda)); //태양의 적경
double delta = asin(sin(obliq) * sin(lambda)); //태양의 적위 

// Find the Equation of Time
// in minutes
// Correction suggested by David Smith
// 균시차 계산 
double LL = L - alpha;
if (L < pi) LL += tpi;
double equation = 1440.0 * (1.0 - LL / tpi);
double ha = f0(latit,delta);
double hb = f1(latit,delta);
double twx = hb - ha;	// length of twilight in radians (라디안 단위 박명길이)
twx = 12.0*twx/pi;		// length of twilight in hours (시간단위 박명길이)
cout << "ha=" << ha << "  hb=" << hb << endl; 
// Conversion of angle to hours and minutes (하루길이를 시간단위로 계산) //
daylen = degs*ha/7.5;
     if (daylen<0.0001) {daylen = 0.0;}
// arctic winter     //

double riset = 12.0 - 12.0 * ha/pi + tzone - longit/15.0 + equation/60.0; //뜨는시간
double settm = 12.0 + 12.0 * ha/pi + tzone - longit/15.0 + equation/60.0; //지는시간 
double noont = riset + 12.0 * ha/pi; //정오 시간 

//정오시에 태양의 고도(maximum altitude)
double altmax = 90.0 + delta * degs - latit; 
// Correction for S HS suggested by David Smith
// to express altitude as degrees from the N horizon
if (latit < delta * degs) altmax = 180.0 - altmax;

double twam = riset - twx;	// morning twilight begin 시민박명(아침)
double twpm = settm + twx;	// evening twilight end 시민박명(저녁)

if (riset > 24.0) riset-= 24.0;
if (settm > 24.0) settm-= 24.0;

cout << "\n Sunrise and set\n";
cout << "===============\n";

cout.setf(ios::fixed);
cout.precision(0);
cout << "  year  : " << y << '\n'; //년
cout << "  month : " << m << '\n'; //월
cout << "  day   : " << day << "\n\n"; //일
cout << "Days until Y2K :  " << d << '\n'; //J2000을 기준으로 센 날수 
cout.precision(2);
cout << "Latitude :  " << latit << ", longitude:  " << longit << '\n'; //관측자의 경도와 위도 출력 
cout << "Timezone :  " << tzone << "\n\n"; //타임존 출력 (한국은 UT+9h)
cout << "Declination   : " << delta * degs << '\n'; //태양의 적위
cout << "Daylength     : "; showhrmn(daylen); cout << " hours \n"; //하루길이 

//시민박명(아침) 
cout << "Civil twilight: ";
showhrmn(twam); cout << '\n';
//일출시간 
cout << "Sunrise       : "; //
showhrmn(riset); cout << '\n';

 //정오때 태양 고도(Amendment by D. Smith)
cout << "Sun altitude at noontime "; 
showhrmn(noont); cout << " = " << altmax << " degrees" 
    << (latit>=0.0 ? " S" : " N") << endl;

//일몰시간 
cout << "Sunset        : ";
showhrmn(settm); cout << '\n';
//시민박명(저녁)
cout << "Civil twilight: ";
showhrmn(twpm); cout << '\n';

return 0;
}

어떤가요? 조금만 공을 들이면 완벽히 이해는 못해도 구현은 얼마든지 가능합니다.

글쓴이 : 지돌스타 (http://blog.jidolstar.com/705)


나는 올해 멋진 밤하늘을 보여줄 수 있는 모바일 애플리케이션 및 Flash 애플리케이션을 만드는 것을 목표로 삼았다. 모바일이나 Flash와 같이 렌더링하는데 어려운 환경에서 어떻게 최적화 하는가가 큰 이슈가 되지 않을까 생각이 든다. 아래는 간단하게 만들어본 밤하늘의 모습이다. Flash Player에서 거의 40~50 FPS로 나오는것으로 봐서 이것 조차도 느리다.



각종 천체목록과 연결되고 이미지 서비스도 된다. 천체에 대한 정보도 보여주고 태양계(행성,혜성,위성) 정보도 볼 수 있다. 각 지역에서의 밤하늘 정보를 보여주며 각종 천문현상도 볼 수 있다.

아무튼 일단 너무 큰거 말고 작은것부터 차근차근 만들어 봐야겠다.

글쓴이 : 지돌스타(http://blog.jidolstar.com/645)

CDS는 프랑스의 스트라스부르 관측소 데이터 센터(Centre de Données astronomiques de Strasbourg)에서 제공하는 천체목록 데이타 서비스이다. 여기서는 VizieR(카탈로그), Simbad(천체대상), Aladin(Sky atlas)를 기본해서 다양한 천체목록 서비스를 하고 있다. 이들에 대한 가이드문서를 참고하면 이용하는데 도움이 된다.

CDS는 학술적 내용의 접근에 용이하도록 되어 있기 때문에 일반인들보다는 천문학자들에게 매우 유용하다. 본인은 이곳을 통해 다양한 천체정보를 종종 얻어오곤 한다.

CDS와 같은 서비스가 있는 이유는 천문학에서 다루는 천체들을 정리한 목록과 이름이 정말 많기 때문이다. 같은 대상이라 하더라도 그것들을 정리한 목록의 수가 많기 때문이다. 가령, 안드로메다은하만 하더라도 M31, NGC 224, Andromeda Galaxy, UGC 454, PGC 2557, LEDA 2557(참고:Wikipedia) 등 정말 많다. 이렇게 엄청 많은 목록이 존재할 수 밖에 없었던 이유는 천체목록이 생성된 시기에 따른 기술적 진보가 있었기 때문이다. 여전히 지금도 수많은 천체대상이 많이 발견되고 있기 때문에 이러한 목록은 없어지지 않고 항상 현존하게 된다.

CDS에서 제공하고 있는 목록만 하더라도 엄청 많다. (참고 : Catalogues and files available at CDS) 은하, 성운/성단, 별의 단순 분류에 따른 목록도 있지만 학술적 목적에 의해 만들어진 목록도 꽤 된다는 것을 알 수 있다.

CDS에서는 많은 개발자들의 참여를 유도할 수 있는 서비스가 준비되어 있다.

이 개발자 코너를 통해 CDS에 제공하는 데이터를 다양한 형태로 가공해 다른 서비스를 만들 수 있다.

본인도 천체대상 검색이 필요했다. 사용자가 찾기 원하는 천체의 이름을 입력하면 그에 대한 정보를 얻어오는 기능이다. 그러나 엄청많은 이름의 천체목록을 다 검색하도록 만드는 것은 왠지 불가능해보인다. (언제 데이터베이스를 만들고 그들 의 연관 알고리즘을 언제 만들어!) CDS 개발자 코너에서 제공하고 있는 CDS XML Web Services는 이것을 가능하게 했다.

CDS XML Web Services : http://cds.u-strasbg.fr/cdsws.gml

이 서비스는 XML 형태로 SOAP(Simpe Object Access Protocal)을 이용해 서비스가 진행되며 Simbad, NED, VizieR에서 제공하는 천체목록을 검색해서 결과를 반환해준다.

위 서비스에서 Name Resolver 서비스가 있다.

Name Resolver는 천체이름을 입력하면 다른 천체이름과 천체에 대한 몇가지 이름정보를 반환해주는 역할을 한다.

현재 접근 주소는 4개가 있다. 그러므로 어느 한 주소로 접근하지 못하더라도 다른 주소로 접근하면 되겠다.


    위 주소로 접근해서 사용하는 예제도 CDS Name Resolver 서비스 문서에 매우 잘 나와 있으며 JavaPerl 예제도 있다.
     
    아래는 PHP 예제이다.

    <?php
    $wsdl_url = "http://cdsws.u-strasbg.fr/axis/services/Sesame?wsdl";
    $client = new SoapClient($wsdl_url);
    $tmp = $client->Sesame('M 31', 'x', true, "N");
    var_dump($tmp);
    ?>
    


    위 소스가 제대로 돌아가려면 php.ini 에 Soap가 동작할 수 있을 수 있게 모듈을 열어주어야 한다.  위와 같이 할 경우 M31 대상을 XML형태로 NED에서 찾는 것을 의미한다. XML 형태로 $temp에 저장되므로 별도로 XML 파서를 이용해야할 것이다. 한가지 예이긴 하지만 문서를 잘보면 사용방법을 익힐 수 있다. 읽어오는 방식도 XML뿐 아니라 HTML, String형태로도 반환하며 각종 옵션도 있으므로 꼼꼼히 챙겨보자. 단 deprecated로 표시된 것은 다음에 없어질 것이니 사용하지 말자. 위 형태 말고 다음처럼 쓸수도 있다.

    sesame("m31","x",true,"N"), sesame("m31","xi",false,"A"), sesame("m31","Hpi",true,"NS"), ...


    위 결과는 다음과 같다.


    <?xml version="1.0" encoding="UTF-8"?>
    <Sesame xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:noNamespaceSchemaLocation="http://vizier.u-strasbg.fr/xml/sesame_4.xsd">
    <Target option="N">
      <name>M 31</name>
      <!-- Q5133035 #1 -->
      <Resolver name="N=NED">
        <INFO>from cache</INFO>
        <otype>G</otype>
        <jpos>00:42:44.32 +41:16:08.5</jpos>
        <jradeg>010.6846833</jradeg>
        <jdedeg>+41.2690361</jdedeg>
        <refPos>1992ApJ...390L...9C</refPos>
        <errRAmas>375</errRAmas><errDEmas>375</errDEmas>
        <Vel><v>-300.09229</v><e>3.89730</e><r>1991RC3.9.C...0000d</r></Vel>
        <MType>SA(s)b</MType>
        <oname>MESSIER 031 </oname>
        <alias>NGC 0224</alias>
        <alias>Andromeda Galaxy</alias>
        <alias>UGC 00454</alias>
        <alias>CGCG 535-017</alias>
        <alias>CGCG 0040.0+4100</alias>
        <alias>MCG +07-02-016</alias>
        <alias>GIN 801</alias>
        <alias>B3 0040+409</alias>
        <alias>2MASX J00424433+4116074</alias>
        <alias>IRAS  00400+4059</alias>
        <alias>IRAS F00400+4059</alias>
        <alias>KTG 01C</alias>
        <alias>HOLM 017A</alias>
        <alias>PGC 002557</alias>
        <alias>UZC J004244.3+411608</alias>
        <alias>87GB 004002.2+405940</alias>
        <alias>87GB[BWE91] 0040+4059</alias>
        <alias>6C B004001.6+410004</alias>
        <alias>MY 0040+409A</alias>
        <alias>CXOM31 J004244.3+411608</alias>
        <alias>RX J0042.6+4115</alias>
        <alias>1RXS J004241.8+411535</alias>
        <alias>EXSS 0039.9+4059</alias>
        <alias>1H 0039+408</alias>
        <alias>1ES 0039+409</alias>
        <alias>XSS J00425+4102</alias>
        <alias>LGG 011:[G93] 001</alias>
        <alias>[PFJ93] 44</alias>
        <alias>[MHH96] J004241+411531</alias>
        <alias>[VCV2001] J004244.3+411610</alias>
        <alias>MESSIER 031:[KGP2002] r1-010</alias>
        <alias>MESSIER 031:[PFH2005] 321</alias>
        <alias>MESSIER 031:[VG2007] 001</alias>
        <alias>0039+408</alias>
        <alias>0040+4059</alias>
        <alias>LEDA 002557</alias>
        <nrefs>3044</nrefs>
      </Resolver>
    </Target>
    </Sesame>
    <!--- ====Done (2009-Dec-29,08:30:21z)==== -->
    


    결과에서 alias(별칭) 부분이 바로 검색한 M31의 다른 이름들이다. 정말 많다. ^^;
    간단히 위치정보(jpos, jradeg, jdedeg)도 알 수 있다.

    이를 이용해 다양한 정보를 제공하는 또 다른 천문학 관련 애플리케이션을 만들 수 있게 된다.
    혹시 지나가다가 이것을 이용해서 만든 프로그램이 있다면 알려주었으면 한다. ^^

    글쓴이 : 지돌스타(http://blog.jidolstar.com/641)

    적도좌표계(Equatorial Coordinate System)는 항성(별)의 위치를 측정하는 가장 기본좌표계이다. 이 좌표계에서 별의 위치는 적경(Right Ascension)과 적위(Declination)값이 되며 이 좌표값의 기준점은 춘분점이 된다. 세차 및 장동과 같은 지구의 미세한 변화로 인해 이 춘분점은 계속 바뀌므로 필요에 따라 기준 시간(원기, Epoch)를 지정한다. 

    현대의 별자리는 1930년 국체천문연맹(IAU)에서 88개의 별자리로 지정되어 있다. 이 별자리는 서양기준 별자리이며 각 나라 및 문화권 마다 다양한 별자리가 있긴 하지만 통상 별자리라고 하면 이 88개 별자리를 지칭한다. 

    별자리는 단순히 별과 별을 이어주는 선으로 연결된 것만 지칭하지 않는다. 명확한 별자리 영역(Constellation Boundaries)이 존재한다. 이 영역은 1875년을 원기로 하는 춘분점을 기준으로 만들어졌으며 오늘날에도 사용하고 있다. 1875년 당시의 별자리 경계선은 적경,적위에 따라 아래 그림처럼 네모 반듯한 모습을 가진다. (투영방식은 정적도법을 이용했다.)


    하지만 시간이 지날수록 지구의 운동으로 인해 춘분점이 변해감에 따라 1875년 당시의 별자리 영역은 조금씩 틀어지기 시작했다. 아래 그림은 2000년을 원기로 했을 경우 별자리 경계 영역을 보여주고 있다. 위 그림과 달리 왜곡되어 있는 모습을 쉽게 볼 수 있다.



    그러므로 어떤 특정 별 또는 천체가 어떤 별자리에 속하는지 확인하기 위해서는 그에 상응하는 계산을 해줄 필요가 있다. 즉, 1875년 기준으로 해당 천체의 별자리가 지정된 것이므로 주어진 원기에 대한 천체의 별자리를 찾기 위해서는 별자리 영역을 당시에 지정된 영역으로 왜곡한다.

    이러한 과정을 할 수 있는 소스 및 데이타가 이미 공개되어 있다. 다음 링크를 참고한다.

    Identification of a Constellation From Position (Roman 1987)

    C로 만들어진 코드도 있으므로 참고한다.
    http://astrocomplutense.es/dobles/program.c 

    나는 위에서 소개한 코드를 이용해서 Flash로 원기와 적경,적위를 입력하면 그에 대응하는 별자리 정보를 출력해주는 아주 간단한 애플리케이션을 만들어 보았다.


    이 프로그램은 세차운동만 적용되었으며 또한 보간데이터를 활용했기 때문에 아주 정확하게는 경계선 부근의 천체의 경우 실제 별자리가 안나올 수 있다.

    이 이론은 SNS서비스인 스타플(http://starpl.com)에도 적용되어 있다.


    글쓴이 : 지돌스타(http://blog.jidolstar.com/616)

    율리우스 적일(積日, Julian Date)을 계산하는 방법에 대해서 정리했다.  율리우스 적일은 천문계산의 기본이면서도 매우 중요한 개념이다.

     

    율리우스 적일(Julian Date)은 다음과 같이 정의된다.

     

    장소 : 영국 그리니치(Greenwich, 경도 0도) 기준
    시점 : B.C. 4713년 1월 1월 세계시 12시
    부터 세어진 날의 수

     

    율리우스 적일(이하, JD)는 ‘어느 시점부터 몇 일째 되는 날’과 같이 날짜를 세는 방법이라고 생각하면 된다. 적일에서 ‘적(積)’자는 쌓을 적자이다. 즉 날짜를 쌓아간다는 의미이다. 한가지 더 고려해야할 것은 단순히 날짜만 세는 것이 아니라 소수점까지 포함한 시간까지 확장한다. 그러므로 JD는 날짜와 시간을 하나의 실수값으로 정의가 가능해진다.

     

    JD가 천문학에서 많이 활용되는 이유는 천체의 운동을 기술하기 위해 시간을 편리하게 적용할 수 있기 때문이다. 일상 생활에서 사용하는 년월일,시분초는 인식하기 편하지만 계산을 위해서는 JD로 변환이 필요하게 된다.

     

    JD은 Julian Days, Julian Day Numbers와 동일한 의미를 가지지만 Astronomical Algorithms 저자 Jean Meeus는 Julian Date대신 Julian Day로 사용할 것을 권면하고 있다. 왜냐하면 Date라는 용어는 달력에서 사용하는 년,월,일을 표기해야할 것 같은 느낌이 강하기 때문이라고 한다. 그러나 필자는 그러한 구분은 상관없다고 판단한다.

     

    In many book we read “Julian Date” instead of “Julian Day”. A date consists of a year number, a month, adn a day of the month, in any calendar. For me, a Julian date is a date in the Julian calendar, just as a Gregorian date refers to the Gregorian calendar. The JD has nothing to do with the Julian calendar.

    Astronomical Algorithms 2nd edition Chapter 7 에서 발췌

     

    한가지 더 언급하자면 Jean Meeus도 지적했듯이 JD와 율리우스력(Julian Calendar), 그레고리력(Gregorian calendar)와 다르다는 점을 인식해야한다. JD는 날수(day number)이고 율리우스력이나 그레고리력은 달력이다. 이에 대해서는 다시 언급하겠다.

     

    필자는 JDN(Julian Day Number)는 JD의 정수부분이라고 정의하겠다. 그러므로 1999년 1월 1일 0h UT는 JD로 2451179.5이고 JDN는 2451179이 된다.

     

    시간(Time)

    JD는 세계시(Universal Time, 이하 UT)를 기준으로 한다. JD와 UT와의 관계를 말하기에 앞서 잠깐 시간(Time)에 대해서 언급해 보는 것이 좋을 것 같다. 왜냐하면 시간의 변천 역사와 체계에 대한 이해가 선수되어야 천문 관련 계산에 도움이 되기 때문이다. 하지만 정확히 이해하기에는 쉽지 않다. 그래도 개념정도는 알아야 한다고 생각한다.

     

    진태양시(True Solor Time)

    태양일을 기준으로한 시간. 태양이 자오선상에 도달한 후 다시 도달할 때까지 걸리는 시간을 24시간으로 결정하는 시간체계이다. 지구의 궤도가 타원이고 자전주기가 변하기 때문에 매일매일 다른 시간체계를 가지게 된다. 과거 태양을 기반으로 시계를 만들었을때 사용했으며 오늘날에는 사용하지 않는다.

     

     

    항성시(Sidereal Time)

    별을 기준으로 하는 시간이다. 별이 자오선상에 도달한 후 다시 도달할 때까지 걸리는 시간으로 대략적으로 23시간 56분 4초 정도로 4분 정도 실제하루와 차이가 발생한다. 이렇게 차이가 발생하는 이유는 지구가 자전하면서도 공전하기 때문이다. 일상생활에서는 별보다는 태양이 우선이므로 항성시는 사용하지 않지만 천문계산을 위해서는 꼭 필요한 시간체계이다.

     

     

    평균태양시(Mean Solar Time, 이하 MST)

    1초는 평균태양일(Mean Solar Day)의 1/86400 간격으로 정의되었다. 평균이라는 단어가 생긴것은 실제 태양이 자오선에서 다시 자오선에 오는데 걸리는 시간이 계절에 따라 빠르게는 16분 느리게는 14분까지 주기가 변하기 때문에 실제 태양의 운동으로 재는 시간은 오차를 없애고자 사용한 것이다. 이러한 오차는 지구의 자전축의 기울기와 지구의 공전궤도가 타원형이라는 것에서 기인한다. 이 오차를 균시차(equation of time)이라 불리고 “균시차 = 진태양시 – 평균태양시” 관계를 가진다.


    평균태양일은 지구의 자전속도가 느려지는 것을 보정해주지 못한다.

     

    MST는 1956년 이전까지 사용했던 시간이다.

     

     

    세계시(Universal Time, 이하 UT)

    UT는 전세계적으로 통용될 수 있는 시간의 필요성에 따라 만들어진 시간체계이다. UT는 그리니치(경오 0도)상에서 자오선에 대한 평균태양시(MST)이다.  그리니치 평균태양시(Greenwich Mean Time, 이하 GMT)와 UT는 정확하게 같지 않다. 원래 GMT는 자정이 아닌 정오에 시작하도록 만든 시간이다. 1925년 1월 1일에 GMT를 12시간 앞당겨 자정으로 시작하는 것을 제정했고 1928년 이전 GMT와 새로운 GMT의 용어의 혼란을 피하기 위해 만들어진 것이 바로 UT이다. 오늘날에는 GMT와 UT는 같은 의미로 통용되지만 천문학에서는 사용하지 않는다.

     

    UT는 10분의 수초에 정밀도를 요하는 경우 UT0, UT1, UT2로 세부적으로 구분하여 사용하게 된다.

     

    • UT0 :  가장 기본적인 UT로 별의 자오선 통과를 광학적으로 측정하여 구한 UT. 현대적인 방법으로는 GPS를 이용한다. 이것은 실제 UT로 통용되지는 않는다.
    • UT1 : UT0를 보정한 UT로 지구의 자전축의 운동(극운동) 때문에 생기는 자오선의 변화에 대한 보정을 가한 UT이다. 일반적으로 UT라고 하면 UT1을 의미한다. 오늘날 UT라고 하면 UT1을 의미한다.
    • UT2 : UT1에서 지구의 계절별 자전율 변화에 의해서 일어나는 작은 불규칙성 보정한 UT. UT2는 10-7의 상대오차를 가진다. UT1과 UT2의 관계는 다음과 같다.
      UT2 - UT1 = 0.022 * sin(2*pi*t) - 0.017 * cos(2*pi*t)
      - 0.007 * sin(4*pi*t) + 0.006 * cos(4*pi*t)
      t = 2000.0 + (MJD - 51544.03) / 365.2422
      pi = 3.14159265...여기서 UT1은 초단위이고 t는 Besselian Date값, 그리고 MJD는 Modified Julian Date(Julian Date-2400000.5)이다.

     

    UT와 GMT에 대한 더 자세한 내용은 아래 링크를 참고한다.

     

     

    UT를 다른지역의 시간대로 변경할 수 있다. 가령 한국표준시(Korean Standard Time, 이하 KST)는 UT보다 9h이 빠르다. 그러므로 다음과 같은 관계가 성립한다.

     

    • UT = KST – 9h

     

    표준시(Standard Time)은 일상적으로 사용할 수 있도록 시간대를 형성해주는 반면 지방시(Local Time)는 경도에 따라서 달라진다.

     

     

    동적시(Dynamical Time,이하 DT )

    DT의 역사는 역표시(Ephemeris Time, 이하 ET)로 부터 시작한다.

     

    ET는 1900년 1월 0일 12시 태양년의 1/31556925.9747을 1초로 삼는 시간체계이다. 그러므로 이 ET는 매우 정확한 비율로 계산되는 시간체계가 된다.

     

    MST기반인 UT의 경우 평균값을 이용하기 때문에 달과 태양에 의해 일어나는 조석마찰로 인해 느려지는 지구의 자전주기와 유동성을 갖고 있는 지구 내부 물질의 움직임에 의해 자전의 속도가 달라지는 현상에 의해 지구를 기준으로하는 실제 시간은 느려진다는 것을 발견하게 되었다. 아래는 1973년부터 2008년까지 지구 자전의 주기의 변화를 보여주고 있다.

     

    1956년에 국제도량형위원회(CIPM)은 지구자전대신 지구의 공전을 기초로 하는 ET를 시간의 표준으로 결정하게 된다. 이것은 달, 행성, 우주의 다른 태양계 천체들의 운동에 대해 기술할때 사용된다.

     

    지구 공전으로 기준삼은 ET는 지구 자전으로 기준삼는 UT와 시간차이가 멀어지기 시작했다. 1902년 이후 2000년에 UT와 ET는 63초 이상 차이가 벌어졌다.

     

    ET는 1960년에서 1983년까지 사용했다. 지구공전기반의 ET는 1984년에 원자시계 기반인 지구동적시(Terrestial Dynamic Time:TDT)로 대체되었다. 더불어 태양계의 질량중심과 관련된 Barycentric Dynamical Time(TDB)도 사용되었다. TDB와 TDT의 차이점은 태양계의 질량중심을 기준으로 한다는 것 외에는 같으며 0.0017초 차이 정도난다. TDT는 2001년에 지구시(Terrestial Time,TT)로 용어가 변경된다. 일반적으로 TT(TDT)와 TDB는 거의 차이가 없기 때문에 구분하지 않지만 20 microseconds보다 더 작은 정확도를 가지는 행성의 위치를 계산해야하는 경우 TDB를 사용한다.

     

    참고로 TDT는 TAI(국제원자시)와 아래와 같은 관계가 성립된다.

     

    TDT = TAI + 32.184 = UTC + (윤초수, 2009년까지 34초) + 32.184

     

    TDB는 아래와 같은 공식이 성립한다.

    TDB = TDT + 0.001658 sin( g ) + 0.000014 sin( 2g ) seconds
    g = 357.53 + 0.9856003 ( JD - 2451545.0 ) degrees
    JD는 Julian Date이고, g는 지구의 mean anomaly이다.

     

    만약 짧은 시간의 정확성이 중요하다면 UT와 ET의 차이값을 알아야한다. 이값은 ΔT로 표기되며 다음과 같은 공식을 가진다.

     

    ΔT = ET – UT (1984년 이전), TDT – UT(1984년~2000년), TT - UT(2001년부터)

     

    ΔT는 아래와 같이 변한다.

    • ΔT = +65초 (2000년)
    • ΔT = +69초 (2005년)
    • ΔT = +80초 (2015년)

     

    ΔT는 다음식으로도 유도가 가능하다.

    ΔT = 32.184 + (TAI-UTC) - (UT1-UTC)

     

    TAI-UTC은 해당년도까지 적용된 윤초이다. 이에 대한 자료는 [여기]를 참고한다.


    UT1-UTC는 세계시와 세계협정시 차이값이다. 이들 값에 대해서는 다음에 설명하는 세계협정시(UTC)를 보길 바란다.

     

    ΔT는 지구의 운동으로 인해 아주 정확하게 예측하는 것은 불가능하다. 결국 과거의 자료를 토대로 예측하는 방법을 쓸 수 밖에 없다. 아래 사이트에는 ΔT를 계산하는 c코드가 공개되어 있다. dltat.c 를 참고한다.

     

    ET에 대한 더욱 자세한 내용은 다음 글을 참고한다.

     

     

     

    국제원자시(International Atomic Time, 이하 TAI)

    지구의 운동 기반이 아닌 세슘원자시계를 기반으로한 국제표준이다. TAI에서 1초는 세슘원자가 2개의 초미세구조 사이에서 전이할때 복사 또는 흡수하는 전기에너지 주기의 9,192,631,770배와 동일한 시간으로 정의한다.  TAI의 원점은 1958년 1월 1일 0h UT2로 한다. TAI는 원자시계를 기반으로 하므로 매우 정밀하다. 실생활에는 쓰이는 시간체계는 아니지만 과학적 용도로 쓰기에 적합하다. 실생활에 사용하는 시간은 아래에서 설명하는 세계협정시(UTC)이다.

     

    1987년 12월 31일까지 국제시보국(BIH)에서 TAI, UTC, 지구자전요소 계산 업무를 했고, 1988년 1월 1일부터는 국제도량형국(BIPM)의 Time Section에서 TAI, UTC 결정업무를 맞고 지구자전요소 결정 및 윤초의 결정 통보는 국제지구자전연구부(IERS)에서 담당하게 되었다.

     

     

     

    세계협정시(Coordinated Universal Time, 이하 UTC)

    오늘날에는 일상생활에 UTC을 국제표준으로 삼고 있다. UTC는 TAI기반으로 UT1과 0.9초 내로 차이가 나도록 윤초(leap second) 개념을 도입한 것이다. 즉 TAI는 현재 가장 정확한 시간체계이고 UTC는 그 정확한 시간에 지구자전도 고려한 시간인 것이다.

     

    윤초는 1972년부터 국제시보국(BIH)에서 최초로 도입했고 1988년 1월 1일 부터는 국제지구자전연구부(IERS)에서 지구자전요소의 결정 및 윤초의 결정과 통보업무를 담당하고 있다.

     

    매월 말에 윤초를 넣을 수 있지만 6월 말, 12월 말에 더하거나 빼는 것만으로도 충분하다.

    아래 그림은 UT1과 UTC의 차이를 보여주고 있는 그래프이다. (출처:위키피디아)


    UT1과 UTC가 0.9초 내로 조정되는 것을 확인하자.



    참고로 UT1-UTC는 ΔUT 로 표현한다. 예언되는 ΔUT를 DUT로 쓰여진다.

     

    UT1 = UTC + DUT1

     

    위 식에서 DUT1은 IERS Bulletin A를 참고하여 예상이 가능하다. 2009년 DUT1은 다음과 같이 계산한다.

    DUT1 = UT1-UTC =   0.3597 -  0.00093 (MJD - 54924) - (UT2-UT1)

     

    여기에서 UT2-UT1은 UT설명시 나왔던 값이므로 계산후 그대로 대입하면 되겠다.

    [여기]에 DUT1 예상 결과가 잘 나와 있다.

     

    아래는 TAI와 UTC의 관계식이다.

     

    윤초(leap second) = TAI – UTC

     

    1972년에 윤초를 10초를 더한 것을 시작으로 2009년 까지 양의 윤초만 적용하여 위 공식에 의하면 윤초는 2009년 현재 34초가 된다.

     

     

    위 관계를 표로 나타내는 것은 다음 링크를 보자.

     

    아래 링크를 통해 UTC와 윤초에 대해서 더욱 공부할 수 있겠다.

     

    GPS 시간(GPST)

    GPS는 1980년 6월 1일 UTC가 TAI와 19초 차이나는 시점부터 적용했다. TAI와 같은 원자시계를 기반으로 하며 UTC처럼 윤초를 더하지 않는다.

     

    시간 관계 (Time Relationships)

     

    위 그림은 지금까지 설명한 시간관계를 하나의 그래프로 보여주고 있다.

     

     

    Julian Date(JD)와 Julian Ephemeris Date(JDE)

    JD는 UT를 기반으로 한다고 언급했었다. 하지만 JDE는 ET(TT,TDT)를 기반으로 한다. UT는 지구의 운동에 따라 계산되어 실제로는 명확하지 않지만 일상생활에서는 가장 적합하다. 하지만 ET의 경우 원자시계를 기반으로 한다. 앞서 ΔT = TDT(or ET) – UT 를 언급했다. 실제로 2015년에는 +80초가 된다. 그러므로 JD와 JDE는 구분되어 생각해야한다.

     

    • 1977년 4월 26.4일 UT = JD 2443259.9 = JD 2443259.9 UT
    • 1977년 4월 26.4일 ET = JDE 2443259.9 = JD 2443259.9 ET

     

    위는 다른 값이라는 것을 항상 생각하자.

     

    그레고리력(Gregorian Calendar)과 율리우스력(Julian Calendar)

    율리우스력은 해당 년도가 4로 나누어 떨어지는 경우 365일이 아닌 366일을 1년으로 삼는 달력이다. 이렇게 하루를 포함하는 해를 윤년(Leap Year)이라고 한다. 이런 윤년이 발생하는 이유는 일년이 딱 365일이 아니기 때문이다. 율리우스력에서 1년은 365.25일이다. 그러므로 4년이 흐르면 1일이 차이가 나게 되어 있다. 이것을 보정하기 위해 만든 것이 윤년인 것이다.

     

    가령, 900년 1236년의 경우 4로 나눠어지므로 윤년이고 750년 1429년은 보통해이다.

     

    율리우스력은 1582년 10월 4일까지 사용되어졌다.

     

    그레고리력은 기본적으로 율리우스력과 비슷하게 4년마다 윤년이 있다. 대신 4로 나눠떨어지지만 400으로 나눠떨어지지 않는 해는 윤년이 아닌 보통해로 생각한다. 이 달력은 오늘날 사용하고 있다.

     

    가령, 1700년, 1800년, 1900년은 4로 나눠지지만 400으로 나눠지지 않으므로 보통해이다. 반면 1600년, 2000년, 2400년은 4로 나눠지면서 400으로 나눠 떨어지므로 윤년이 된다.

     

    그레고리력은 율리우스력과 다르게 1년을 365.2425일로 본다.

     

    그레고리력은 1582년 10월 15일부터 사용하기 시작했다. 여기서 율리우스력의 마지막 날과 그레고리력의 시작일에 비어 있다. 1582년 10월 5일에 그레고리력을 사용하기 시작하면서 그 다음날을 1582년 10월 15일로 만들었기 때문이다. 이렇게 된데에는 율리우스력이 역법상 오차가 있었기 때문인데, 당시 춘분점이 3월 21일이어야하는데 율리우스력에 의하면 3월 11일로 무려 10일이나 차이가 났기 때문이다. 율리우스력이 1년을 365.25로 해서 그것이 누적되어 원래 시간보다 더 빨리 계수되는 달력이였기 때문에 이것을 극복하고자 1년을 더 정확한 365.2425일로 수정하고 이에 맞는 그레고리력을 사용하게 된 것이다.

     

    한국의 경우 조선시대에 1895년 을미개혁 때인 양력 1896년 1월 1일(건양 원년)부터 그레고리력을 처음 사용하게 되었다.

     

    날짜로 부터 Julian Date 계산

    JD는 앞서 설명한대로 4713년 B.C.부터 계수한 날 수이다. JD는 또한 경도 0도를 기준으로하는 UT를 기반으로 하기 때문에 천문계산에 시간의 척도로서 적합하다. “언제 목성이 어디에 있었나”를 질문할 때 “언제”가 명확하기 때문이다.

     

    UT에 해당하는 날짜가 주어졌을 때 JD를 계산하는 방법에 대해서 생각해보자.

     

    1. Y는 해당년도, M는 월(1월=1,2월=2), D는 해당 월의 날짜이다. D는 시간값도 포함한 소수값으로 생각하자. 가령 3일 12시 UT라면 D=3.5이다.
    2. M>2인 경우 Y,M은 변경하지 않는다.
      M = 1 또는 2인 경우 Y=Y-1, M=M+12로 계산한다.
    3. 그레고리력(Gregorian Calendar)의 경우 아래처럼 계산한다.
      A = INT(Y/100), B = 2 – A + INT(A/4)
      여기서 INT는 ()안에 들어간 값을 넘지않는 가장 큰 정수이다.
      율리우스력(Julian Calendar)의 경우 B=0이다.
    4. JD는 다음과 같이 계산된다.
      JD = INT(365.25(Y+4716)) + INT(30.6001(M+1)) + D + B – 1524.5
      여기서 30.6001은 정확히는 30.6을 써야한다. 하지만 컴퓨터 계산시 10.6이여 하는데 10.599999999 이런식으로 표현되는 경우가 발생하면 INT(10.6)과 INT(10.5999..)의 결과가 달라진다. 이 문제 대해 대처하기 위해 30.6001을 사용한 것이다. 이러한 에러를 Round-off Error라고 불린다.

     

    계산시 중요한 점은 B.C.(기원전)에 대한 처리이다. 1년 B.C. 다음 해는 1년 A.D.이다. 0년 A.D.가 없기 때문에 이것은 계산하는 사람으로 하여금 혼동을 주게 된다. 그래서 위 계산식에서 Y값을 정할때 B.C.값의 경우 –(B.C.값)+1 로 처리한다. 가령, 585 B.C.는 -584이다. 참고로 –582 B.C. 처럼 B.C.에 –를 사용하지 말자. 잘못된 표기이다.

     

    그러므로 기원전 4713년 1월 1일 12UT부터 JD가 시작하므로 Y=-4712, M=1, D=1.5 를 계산식에 넣으면 값은 0이 떨어지게 되어 있다.

     

    만약 1582년 10월 5일부터 1582년 10월 14일에 해당하는 값을 가지고 계산하려는 경우는 막아야한다. 앞서 설명했지만 율리우스력은 1582년 10월 4일까지이고 그레고리력은 1582년 10월 15일 부터이여서 그 사이 날짜는 실제로 없기 때문이다.

     

    만약 주어진 해의 1월 0.0일(=이전해 12월 31.0일)의 JD를 계산하려면 다음식을 이용한다. 단 그레고리력일때만 된다.

     

    Y = year – 1

    A = INT( Y / 100 )

    JD0 = INT(365.25Y) – A + INT(A/4) + 1721424.5

     

    위 조건에서 1901년부터 2099년까지만 고려한다면 다음식을 사용한다.

    JD0 = 1721409.5 + INT(365.25 x (year-1) )

     

    Julian Date로부터 날짜 계산

    여기서 언급하는 JD가 음수값일때는 적용할 수 없다.

    1. JD + 0.5의 정수부분은 Z, 소수점 이하 부분은 F로 지정한다.
    2. A값 계산
      Z < 2299161이면 A=Z 이다.
      Z >= 2299161 이면 다음식을 적용
      alpha = INT( (Z – 1867216.25)/36524.25)
      A = Z + 1 + alpha – INt( alpha/4 )
    3. B,C,D,E 결정
      B = A + 1524
      C = INT( (B –122.1) / 365.25 )
      D = INT( 365.25 C )
      E = INT( (B – D)/30.6001 )
    4. 일(day) 계산
      day = B – D – INT(30.6001 E ) + F
    5. 월(month) 계산
      E < 14일 경우 month = E – 1
      E = 14 또는 15일 경우 month = E - 13
    6. 년(year) 계산
      month>2일 경우 year = C-4716
      month=1,2일 경우 year = C-4715

     

    위에서 30.6001대신 30.6을 쓰면 컴퓨터 계산이 오류가 있을 수 있다. day의 소수점 이하값은 시간을 뜻한다. 소수점값만 취해서 24를 곱하면 시간이 되겠다.

     

    Julian Date와 날짜와의 관계표

    아래 관계값은 계산시 비교해볼 수 있도록 하기 위해 적는다.

    • 2000년 1월 1.5일 = JD 2451545.0
    • 1999년 1월 1.0일 = JD 2451179.5
    • 1988년 1월 27.0일 = JD 2447187.5
    • 1600년 12월 31.0일 = JD 2305812.5
    • 837년 4월 10.3일 = JD 2026871.8
    • -123년 12월 31.0일 = JD 1676496.5
    • -1001년 8월 17.9일 = JD 1355671.4
    • -4712년 1월 1.5일 = JD 0.0

     

    Modified Julian Date(MJD)

    JD은 너무 큰 숫자이다. 또한 JD는 하루의 시작이 정오이다. 그래서 1858년 11월 17일 0h UT를 기준으로 하는 JD를 따로 지정했는데 MJD이다.

    MJD는 다음과 같이 계산한다.

    MJD = JD – 2400000.5

     

    시간간격 계산

    헬리혜성은 근일점(perihelion)을 1910년 4월 20일에 도달한 후 1986년 2월 9일에 다시 도달했다. 이 날짜동안의 날수를 어떻게 계산할 것인가? JD를 이용하면 아주 쉽게 계산이 가능하다.

     

    1910년 4월 20.0일 =  JD 2418781.5
    1986년 2월 9.0일 = JD 2446470.5
    차이는 27689일이다.

    요일 계산하기

    1954년 6월 30일 무슨 요일일까? 계산이 어려울 것 같지만 JD를 이용하면 매우 쉽게 계산이 가능해진다. JD는 월요일부터 시작한다. 단순하게 아래 계산식대로 하면 요일을 쉽게 계산할 수 있다.

    (JD + 1.5) % 7 (%은 나머지를 계산하는 식이다.)

    결과값이 0이면 일요일, 1이면 월요일 6이면 토요일이된다.

    1954년 6월 30일에 대응하는 JD는 2434923.5이다. 1.5를 더하면 2434925이므로 7로 나누면 3이 나온다. 결과는 수요일이다.

     

    참고글

     

    참고서적

    • Astronomical Algorithms 2nd, Jean Meeus

    오늘날 우리가 일상생활에서 사용하는 시간체계는 UTC(Coordinated Universal Time; 세계협정시)이다. 이는 원자시계를 근간으로 하지만 더불어 지구의 운동까지 고려한 UT(Universal Time;세계시)와 0.9초 차이가 안나도록 윤초(leap year)를 매년 6월 말 및 12월 말에 넣어주는 방식을 택하고 있다. 즉, UTC는 원자시계 + 지구운동을 같이 고려하고 있는 것이다. 원자시계를 기반으로하는 시간체계는 TAI(International Atomic Time, 국제원자시)이다. 이 시간은 2009년 이래로 UTC와 +64초 차이가 나게 되었다. TAI는 매우 정교한 시간을 만들어주기 때문에 느려지거나 빨라지지 않는다. 하지만 UTC는 UT와의 차이를 좁혀주므로 지구의 운동에 민감하게 된다.  UTC와 UT는 거의 구별을 안하지만 엄밀히 말하면 다르다. UT는 지구자전에 의해 연속적으로 변하는 값이지만 UTC는 UT와 0.9초 벌어지지 않기 위해 불연속적으로 변한다.

     

    천문계산을 하는데 있어서 일상에서 사용하는 시간과 과학을 목적으로하는 시간체계는 차이가 있다. 일상생활에 사용하는 UT나 UTC는 과학계산에 적합하지 않다. 왜냐하면 균일한 시간이 아니기 때문이다. TAI를 사용하기 이전에 시간의 균일하지 않은 문제를 해결하기 위해 ET(Ephemeris Time,역표시), TDT(Terrestiral Dynamical Time), DT(Dynamical Time)등을 만들게 되었다.

     

    식(eclipse, 일식/월식등)을 예견하기 위해 태양, 달의 위치는 Terrestiral Dynamical Time(DT)기반으로 계산된다. 왜냐하면 DT는 균일한 시간체계이기 때문이다. 우리가 평소에 쓰는 것은 UTC이고 이것은 UT와 차이없도록 만들어진다. 이는 지구의 운동에 관련된 시간체계이기 때문에 균일한 시간이 아니다. 그래서 일상생활의 시간에 어떤 천문 현상을 예측하기 위해 항상 UT와 DT의 차이값을 알아야만 한다. 이 차이값을 delta-T(ΔT)라고 하며 다음과 같은 관계를 가진다.

     

    ΔT = DT – UT = 32.184 + (TAI-UTC) - (UT1-UTC)

     

    이 식을 보면 알겠지만 ΔT는 DT와 UT의 차이면서 TAI, UTC, UT와 관계가 있다는 것을 알 수 있다. 즉 DT를 몰라도 UT, TAI, UTC만 알면 충분히 계산해 낼 수 있는 시간이다. UT의 경우 지구의 운동을 측정하면 되고 TAI는 원자시계이므로 이미 알고 있는 값이다. 또한 UTC도 윤초를 더한 날이 언제인지 알고 있으므로 충분히 알아낼 수 있는 값이다. 하지만 이런 관계는 현대시간에서만 이런 계산이 가능하다. 일반적으로 ΔT를 계산하는데는 과거, 현재, 미래까지 통용할 수 있는 식을 원한다. 그럼 먼저 과거의 ΔT는 어떻게 구할까?

     

    과거의 ΔT는 역사적 기록으로부터 추론된다. 일찍이 우리나라를 비롯한 유럽, 중동, 중국등의 나라에서는 수십건의 식(eclipse)을 관측하고 기록해왔다. 역사적 기록은 낮은 정확성에도 불구하고 과거 ΔT를 계산하는데 중요한 자료로 사용된다. 1609년부터는 망원경을 이용한 천체관측을 시작하게 되어 달의 별을 가림현상(달의 엄폐)등을 관측하여 전보다 높은 정확도를 가진 관측자료를 만들게 되어 ΔT의 오차를  줄일 수 있게 되었다.

    현대에는 지구 운동과 독립적인 원자시계 및 퀘이사 전파측정으로 거의 완벽한  ΔT를 계산할 수 있게 되었다. 하지만 지구의 운동은  어떻게 변할지 예상하기 힘들다. 1965년부터 1980년까지 ΔT는 평균적으로 1년에 0.99초씩 증가했다. 또 1985년부터 2000년까지 ΔT는 평균적으로 1년에  0.63초씩 증가했다. 2000년부터 2005년까지는 단지 0.18초 증가했다. 이렇게 불규칙하게 변하는 ΔT이기 때문에 미래의 ΔT의 정확한 예측은 이론적으로는 힘들다. 대신 달에 의한 조수차로 지구의 자전 주기가 길어지는 것은 예상이 가능하다. 예측 계산에 따르면 2010년에는 ΔT는 +67초, 2050년에는 +93초, 2100년에는 203초, 그리고 2200년에는 442초가 될 것이라 예상할 수 있다.

     

    ΔT를 계산하는 방법은 매우 다양하다. 본인은 이 ΔT를 계산하기 위해 NASA(미국항공우주국)에서 제공하는 “다항식을 이용한 ΔT 계산”을 이용해서 B.C. 2000년 부터 A.D. 3000년까지 ΔT를 계산해보았다.

     

    다음 프로그램에서 버튼을 누르면 ΔT를 계산해서 출력해준다. 누르고 반응이 없더라도 기다리면 출력된다.

    여기서 사용한 식은 Morrison과 Setphenson[2004]가 연구결과로 만든 것으로 달의 평균운동으로 인해 결정된 조석항(the secular tidal term in the mean motion of the moon)을 -26 arcsec/cy^2로 가정하고 계산한 것이다. 하지만 ELP-2000/82 lunar ephemeris에서 사용하는 달의 식변화는 이 값을 -25.858 arcsec/cy^2((Chapront, Chapront-Touzé, and Francou,2002)으로 계산했다. 그러므로 필요한 경우 최종 계산된 결과값인 ΔT에 아래와 같은 작은 보정값 c를 구해 더해줄 필요가 있다.  참고로 cy는Julian century를 뜻한다.

     

    c = - 0.91072 * (ndot + 26.0 ) * t^2
    t = (year-1955)/100
    ndot=-25.858

     

    위 보정값 c를 아래처럼 ΔT에 더한다.

     

    보정된 ΔT = ΔT + c

     

    위 ndot는 다른 값을 넣을 수 있다. 필요에 따라서 보정값을 조정하면 되겠다.

     

    앞서 설명했지만 ΔT는 정확하게 구할 수 있는 값이 아니다. 연구하는 사람마다 다르게 나오며 시간이 지날 수록 지구의 운동을 측정을 통해 계속 보정하여 다른 식으로 바뀌어질 수 있다. 그때는 이 식을 사용하는 사람이 알아서 기존에 사용하던 식을 대체할 필요가 있을 것이다.

     

    해당 년도에 대해 역사적으로 추론 또는 근래 계산법에 의한 ΔT의 오차범위에 대한 정보는 “Historycal values of DELTA T(ΔT)”를 참고한다.

     

    참고글

     

     글쓴이 : 지돌스타(http://blog.jidolstar.com/486)

    세차운동(歲差運動, Precession)은 일반적으로 강체에 돌림힘(Torque)이 작용할 때, 회전하는 물체의 축이 어떤 부동축의 둘레를 회전하는 현상을 말한다. 천문학에서 말하는 세차운동은 지구의 자전축이 불변인 황도면의 축의 둘레를 2만 5800년 주기로 회전하는 운동을 말한다. 이 현상은 지구에 작용하는 달, 태양의 중력과 지구가 타원체라는 것에서부터 기인한다.

     

    천문 계산을 하는데 있어서 세차를 고려해야 과거,미래의 천체위치를 제대로 예측할 수 있다. 왜냐하면 세차운동으로 인해 지구 자전축이 변한다는 것은 천체 위치의 기준점인 춘분점(Vernal Equinox)의 위치도 변한다는 것을 의미하기 때문이다.

     

    여기서는 적도좌표계(Equatorial Coordinate System)황도좌표계(Ecliptic Coordinate System)에서 세차운동 계산 방법을 학습하는 것을 주 목표로 한다. 세차운동의 공식 유도 및 사용되는 각종 다항식이 어떻게 만들어졌는지 알아내는 과정은 생략한다.

     

    이 글의 참고 서적은 Jean Meeus의 Astronomical Algorithms 2nd임을 밝혀둔다. 하지만 이 책에서 소개한 대로만 하지 않으며 더 효과적으로 계산하는 방법도 소개하겠다.

     

    이 글은 세차운동 계산시 정밀한 방법(Rigorous Method)을 이용한다. 낮은 정밀도를 가지는 방법은 책을 참고하길 바란다.

     

    Julian Century

    1 Julian Century는 100 Julian Year와 같다.  Julian Year는 86000 SI 초를 기반으로하는 365.25일을 1로 측정하는 단위이다. Julian Century는 Julian Year의 100배 이므로 36525일을 1로 측정하는 단위이다.  보통 J2000.0 = JDE 2451545.0 = 2000년 1월 1일 12h DT를 0으로 시작하게 된다. 여기서 JDE는 Julian Ephemeris Date, DT는 Dynamic Time을 의미한다.

     

    그러므로 Julian Date(JD)로부터 Julian Century는 다음과 같이 계산한다.

     

    T = (JD0 – J2000) / 36525

     

    세차운동의 경우 어떤 시작원기(the initial epoch)부터 마지막 원기(the final epoch)까지의 세차운동값을 계산해야한다. 그러므로 시작원기와 마지막원기의 Julian Century차이는 다음과 같다.

     

    t = (JD – JD0) / 36525

    T, t에서 JD0는 시작원기, JD는 마지막 원기를 의미한다.

     

     

    적도좌표계에서 세차운동적용 (일반 공식 이용)

    Meeus의 책에 보면 다음과 같은 적도좌표계에서 세차운동을 계산하기 위한 수치적 표현공식이 적혀있다.

     

    ζ = (2306”.2181 + 1”.39656T – 0”.000139 T2 ) t
          + (0”.30188 – 0”.000344T)t2 + 0”.017998 t3

    z = ζ + (0”.79280+0”.000411*T)t2 + 0”.000205t3

    ϑ =(2004”.3109 – 0”.85330T + 0”.000217T2)t
           - ( 0”.42665+0”.000217T )t2 + 0.041833t3

     

    이 식은 IAU(International Astronomical Union, 1976)에서 지정한 값으로 관측을 통해 얻어지는 데이타로 만들어지는 식이다. 참고로 IAU에서는 IAU2006 세차모델을 사용하도록 권하고 있고 미해군천문대에서는 2009년부터 천문역서에 적용하고 있다.(참고 : IAU2006 세차모델)

     

    시작원기의 적경,적위를 (α0, δ0)라고 하고 세차운동이 적용된 마지막원기의 적경,적위를 (α, δ)로 한다면 위 수치적 표현공식을 이용해 다음과 같이 (α, δ)를 계산할 수 있다. 이 식을 유도하는 과정은 구면천문학에 관련된 책을 참고하기 바란다.

     

    A = cos(δ0)  sin( α0 + ζ )

    B = cos( ϑ ) cos( δ0 ) cos( α0 + ζ ) – sin( ϑ ) sin( δ0 )

    C = sin( ϑ ) cos ( δ0 ) cos( α0 + ζ ) + cos( ϑ ) sin( δ0 )

    tan(  α – z ) = A/B

    sin( δ ) = C

     

    이 식만으로도 정확한 계산을 할 수 있다. 그러나 컴퓨터 프로그램을 이용하여 계산을 한다면 이 식은 매우 비효율적인 식이 된다. 가령, 수천, 수만개의 별이 있다고 하자. 그 별들은 어떤 시작원기를 가지는 각각 다른 α0, δ0값을 가지고 있을 것이다. 이들 α0, δ0을 세차운동이 적용된 새로운 α, δ를 계산하기 위해 일일히 cos, sin을 계산한다. 컴퓨터 프로그램을 한 사람은 알겠지만 cos, sin은 컴퓨터의 많은 자원을 소비하는 급수형태의 계산식이다. cos, sin을 너무 많이 쓰면 계산의 효율이 급격하게 떨어져서 1분이면 도출할 수 있는 계산을 1시간~2시간 이상식 소비할 수도 있게 된다.

     

    컴퓨터 프로그램을 이용한 계산을 하려면 되도록이면 cos, sin과 같이 매우 비싼 자원을 소비하는 함수 사용을 지양하도록 해야한다. 그래야 빠른 계산을 할 수 있기 때문이다.

     

     

    적도좌표계에서 세차운동적용 ( 변환행렬이용 )

     

    앞서 세차운동이 적용된 새로운 α, δ를 계산하는 식은 한개의 천체 위치를 계산할 때마다 α0, δ0이 포함된 cos, sin을 계산해야한다. 그래서 새로운 α0, δ0가 주어져도 cos, sin을 최소한으로 이용하여 계산하는 방법을 여기서 소개한다. 그것은 변환행렬(Transformation Matrix)를 이용하는 방법이다.

     

    변환행렬을 이용하면 다음과 같은 계산이 가능해진다. 세차운동을 적용하는 3x3 변환행렬을 P라고 하자. 그리고 α0, δ0를 직교좌표계로 바꾼 백터(vector)를 r0=[x0,y0,z0]라고 하고 세차운동이 적용된 α, δ를 직교좌표계를 바꾼 백터를 r=[x,y,z]라고 한다. 그럼 다음과 같이 계산하면 되겠다.

     

     

    변환행렬 P는 세차운동이 적용되어 앞서 설명한 공식과 다르게 α0, δ0이 분리가 되었다. 행렬 P만 구하면 cos, sin과 같이 큰 자원을 소비하는 함수를 계산할 때마다 이용할 필요가 없어지며 대신, 단순하게 행렬과 백터 곱으로 수천,수만개의 별을 빠른 시간안에 세차운동을 적용할 수 있게 된다.

     

    그럼 P는 어떻게 구할까? 그것은 회전변환행렬을 이용하면 된다. 앞서 구한 ζ, z, ϑ 값은 모두 세차운동에 의해 계산된 각도이다. 이 각도를 이용해 시작원기때의 적도좌표를 3번 회전변환하여 마지막원기때의 적도좌표를 구하는 것이다.

     

    회전변환행렬에서 X축 회전 행렬을 Rx, Y축 회전 행렬을 Ry, Z축 회전행렬을 Rz라고 하자. 이들 행렬은 모두 3x3 행렬이다.

     

     



     

     

    다른 참고를 보면 행렬안에 sin의 부호가 바뀐것을 볼 수 있는데 회전의 대상을 어떻게 정하느냐에 따라서 다른 결과이다. 천문계산에서 회전행렬은 위 정의대로 하는 것이 좋다.

     

    적도좌표계에서 세차운동을 적용한 변환행렬 P는 다음과 같이 주어진다.

     

     

     

    위 변환행렬은 ζ, z, ϑ 이 적용된 행렬곱이다. 이 행렬곱의 결과는 다음과 같다.

     

     

    컴퓨터 프로그램으로 계산할 때는 이렇게 변환행렬을 만들어 계산하면 되겠다.

     

     

    황도좌표계에서 세차운동적용 ( 변환행렬이용 )

     

    황도좌표계에서도 적도좌표계와 동일한 방식이 적용된다.

     

    Π = 174˚.876383889 + 3289”.4789 + 0”.60622 T2 
          - (869”.8089 + 0”.50491T)t + 0”.03536 t2

    π = (5029”.0966 + 2”.22226T – 0”.000042T2)t
         + (1”.11113 – 0”.000042T)t2 – 0”.000006t3

    η = (47”.0029 – 0”.06603T – 0”.000598T2)t
         + (-0”.03302 + 0”.000598T)t2 + 0.000060t3

     

    시작원기 황경(ecliptic longitude),황위(ecliptic latitude)가 λ0,β0 이고 마지막원기 λ,β이라고 하자. 이때 각각의 직교좌표값을 r0, r이라고 한다면 변환행렬 P는 다음과 같다.

     


     

    결과적으로 P는 다음과 같이 결정된다.

     

     

     

    응용하기

    지금까지 세차운동이 적용된 2가지 변환행렬을 알아보았다. 이 행렬은 필요에 따라서 선택해서 사용한다. 한가지 예를 들어보겠다. 적도좌표계에서 세차운동을 적용한 변환행렬을 Pequ, 황도좌표계에서 세차운동을 적용은 변환행렬을 Pecl이라고 하자. 황도좌표계에서 적도좌표계로 변환하는 행렬을 EclToEqu라고 가정한다. 만약 어떤 행성의 황경과 황위를 계산했다고 하면 다음과 같은 2가지 방법으로 새로운 적경, 적위를 계산할 수 있을 것이다.

     

    r = EclToEqu Pecl  r0

    r = Pequ Ecl2Equ  r0

    여기서 r0는 황경,황위를 담은 직각좌표계에서의 벡터값, r은 적경,적위를 담은 직각좌표계에서의 벡터값

     

    세차운동 계산기(Precession Calculator)

    이 프로그램은 지금까지 설명한 내용을 토대로 만든 프로그램이다.  

     

     

    참고


    글쓴이 : 지돌스타(http://blog.jidolstar.com/487)

    천문학에서 자주 언급되는 상수만 적어봅니다.

    물론 천문프로그램 하는 입장에서만 정리했습니다. 더 많은 상수가 수두룩 하죠~ ^^

     

    수학 상수 Methematical constants

     

     π = 3.14159 26535 89793 23846.....

     e = 2.71828 18284 59045 23536.....

     1 radian = 180/π degrees = 57.295 779 513 082 degrees = 206 264.806 247 arcseconds

     1 degree = π/180 radian = 0.017 453 292 519 943 radian

     log10a = log e a / log e 10 = 0.434 294 481 903 log e a

     

     

    거리 Distances

     

    1 천문단위 (1 astronomical unit, 1 AU)

     = 149 597 870 km

     = 499.0048 light-seconds

     = 8.32 light-minutes

     = 0.005 77 55 183 light-day

     

    1 파섹 ( 1 parsec, 1pc )

     = 30.8568 x 1012 km

     = 3.2616 광년( light-years, ly)

     = 206264.8 AU

     = 지구-태양간의 거리(1AU)에 대한 삼각시차 1"

     

    1 광년 ( 1 light-year )

     = 9.4607 x 1012 km

     = 0.30660 parsec

     = 63241 AU

     = 진공중에서 빛이 1년동안 갈 수 있는 거리

     

    평균 지구-달 거리 ( Mean Distance Earth-Moon )

     = 384400 km

     

    지구의 적도 반지름 ( Earth equatorial radius ) = 6378.14km

     

    지구의 극 반지름 ( Earth polar radius ) = 6356.76 km

     

    태양의 지름 ( Diameter of Sun ) = 1392000km

     

    달의 지름 (Diameter of Moon ) = 3476 km

     

    시간 Time

     

    1 항성일(1 sideral day) = 평균태양시 23시 56분 04.0905초 = 평균태양일 0.9972695663 일

    1 평균태양일(1 mean solar day) = 1.00273790935 항성일

     

    원기 2000.0년에 평균태양일내 년(Year)의 길이

     - Tropical(춘분점-춘분점) 365.242190일

     - Sidereal(고정된별-고정된별) 365.256363일

     - Anomalistic(근일점-근일점) 365.259636일

     - Julian 365.25

     

    평균태양일내 달의 회전 주기 길이

     - Tropical(춘분점-춘분점) 27.321582일

     - Sidereal(고정된별-고정된별) 27.321662일

     - Anomalistic(근일점-근일점) 27.554550일

     - Draconic(승교점-승교점) 27.212221일

     - Synodic(그믐-그믐) 29.530589일

     

    여기서 평균태양일(mean solar days)라느 것은 정확하게는  역학적시간(DT, Dynamical time)을 기반으로 형성된 역표일(日, Ephemeris days)이다. 1역표일은 대략적으로 원기 1900.0년에 1평균태양일과 동일하다.

     

     

    그외 값 Varia

     

    황도 평균 기울기 Mean obliquity of the ecliptic

     - 1900년 : 23도 27' 08"

     - 1950년 : 23도 26' 45"

     - 2000년 : 23도 26' 21"

     - 2050년 : 23도 25' 58"

     

    지구궤도 이심률 Eccentricity of Earth's orbit

     - 1900년 : 0.016751

     - 2000년 : 0.016709

     - 2100년 : 0.016666

     

    일반적인 연간세차 General annual precession

     - 1900년 : 50".269

     - 2000년 : 50".291

     - 2100년 : 50".313

     

    지구의 편평도 Flattening of the Earth = 1/298.257

     

    가우스 중력 상수 Gaussian gravitational constant :

     - k = 0.017 202 098 95

     - 라디안 값은 0.985 607 6686

     

    진공중에 빛의 속력 Speed of light in vacuo

     - 299 792.458 km/seconds

     

    지구-달 질량비 Earth-Moon mass ratio = 81.3007

     

    태양-지구 질량비 Sun-Earh mass ratio - 332946

     

    앞서 나는 천문학에서 사용하는 좌표계에 대해서 소개했었다.(http://blog.jidolstar.com/584) 여기서는 이들 좌표계 변환을 위해 몇 가지 표기법에 대해서 알아보고 좌표변환하는 식에 대해 설명하도록 하겠다.


    α = 적경(right ascension). 이 값은 일반적으로 시(hours), 분(minutes), 초(seconds)로 표현된다. 필요하다면 어떤 공식에 사용하기 위해 degree값이나 radian값으로 변환해서 사용한다. degrees값을 시(hours)값으로 표현하기 위해 15로 나누어서 시, 분, 초로 변환할 수 있겠다.


    δ = 적위(declination), 천구 적도의 북쪽이라면 +, 천구 적도의 남쪽이면 - 값을 가진다.


    α1950 = B1950.0의 평균 분점(춘,추분점)을 기준으로 하는 적경


    δ1950 = B1950.0의 평균 분점(춘,추분점)을 기준으로 하는 적위


    α2000 = J2000.0의 평균 분점(춘,추분점)을 기준으로 하는 적경


    δ2000 = J2000.0의 평균 분점(춘,추분점)을 기준으로 하는 적위


    λ = 황경(ecliptical longitude), 춘분점(vernal equinox)으로부터 황도를 따라 측정한 경도


    β = 황위(ecliptical latitude), 황도의 북쪽이면 +, 남쪽이면 -


    l = 은경(galactic longitude)


    b = 은위(galactic latitude)


    h = 고도(altitude), 지평면 위는 +, 지평면 아래는 -


    A = 방위각(Azimuth), 남점 또는 북점을 기준점으로 시계방향으로 잰 각. 기상학자나 항해자들은 방위각의 기준점을 북점으로 하여 북점(0˚), 동점(90˚), 남점(180˚), 서점(270˚)로 측정한다. 하지만 일부 천문학자들은 이 방법에 동의하지 않는다. 왜냐하면 적어도 북반구에 있는 관측자들이 시간각(hour angles)를 측정하기 위해 남쪽의 자오선을 기준으로 측정하기 때문이다. 내가 볼 때는 그건 별로 중요치 않다고 생각한다. 어느 관점에서 보느냐가 다를 뿐이다. 하지만 기준은 정해야겠지? 어쨌든 만약 남쪽 자오선을 기준으로 한다면 그 위에 올라온 천체는 시간각(H)과 방위각(A)가 모두 0˚가 된다.


    ε = 황도의 기울기(obliquity of ecliptic). 황도와 천구의 적도 사이 각(angle)이다. 국제표준협회(International Astronomical Union, IAU)에서 평균기울기는 은 다음과 같이 정의하고 있다.


            ε0 = 23˚26´21˝.448 - 46˝8150T - 0˝.00059T2 + 0.˝001813T3


    T는 J2000.0을 원기로 하여 100년 단위로 계수하는 시간이다.


    하지만 수차(aberration) 와 장동(nutation)의 영향을 받아 겉보기 적경과 적위를 사용한다면 ε + Δε 를 사용해야 한다. (이에 대한 자세한 내용은 다음에 언급하겠다.) 만약 α와 δ가 J2000.0의 표준 춘분점을 참고한다면 ε2000 = 23˚26´21˝.448 = 23˚.4392911 값을 사용해야 한다. B1950.0의 표준 춘분점을 참고한다면 ε1950 = 23˚.4457889 를 사용하면 되겠다.


    L = 관측자의 경도, 그리니치(Greenwich) 자오선으로부터 적도를 따라 관측자의 위치까지 잰 각으로 앞으로 나오는 식은 서쪽을 +, 동쪽을 -로 한다. 서쪽이 +라고 하는 것은 사람들마다 시각이 다르다.


    φ = 관측자의 위도, 북반구면 +, 남반구면 - 이다.


    H = 지방시간각(the local hour angle), 자오선(meridian)으로부터 천구의 적도를 따라 서쪽방향으로 천체의 발까지 잰 각


    θ = 지방항성시(the local sidereal time), 남중한 별의 시간각 또는 춘분점의 적경

    θ0는 영국 그리니치(Greenwich)에서의 항성시이다.

    시간각과 지방항성시 또는 그리니치 항성시, 관측자의 경도의 관계는 다음과 같다.


    H = θ - α 또는 H = θ0 - L - α


    만약 α가 장동(nutation)에 영향을 받는다면 항성시도 이에 영향을 받는다. 장동에 관련된 부분은 다음에 언급하겠다.


    다음에 나오는 식은 각각의 좌표계에서 다른 좌표계로 변환하는 식이다. 식을 유도하는 과정은 생략하도록 하겠다.

     


    1. 적도좌표계에서 황도좌표계로 변환

     

     

     

     

     

    2. 황도좌표계에서 적도좌표계로 변환

     

     

     

     

     

     

    3. 적도좌표계에서 지평좌표계로 변환

    앞서 설명했던 시간각과 적경간에 변환 공식을 통해 시간각을 계산하여 방위각과 고도를 계산할 수 있다.

     

     



     

     

    만약 남점 대신 북점을 기준으로 하는 방위각을 계산할려면 계산된 방위각에 180˚을 더하면 되겠다.

     


     


    4. 지평좌표계에서 적도좌표계로 변환


     

     

     

     

     

    5. 적도좌표계와 은하좌표계간 변환

     

    은하좌표계는 국제천문협회(IAU)에 1959년에 정의했다. B1950.0의 평균 적도좌표계에서 은하(galactic, Milky Way)의 북극의 좌표는 다음과 같다.

     

    α1950 = 12h49m = 192˚.25,    δ1950 = +27˚.4


    은하좌표계에서 은경의 기준점(궁수자리 서쪽부근)은 B1950.0 적도좌표계의 적도에서 은하좌표계 승교점(ascending node, 독수지자리 서쪽부근)과 약 33˚ 떨어져 있다.


    이 값은 B1950.0 춘분점을 기준으로 정확하게 고정되어 있어 편리하게 사용할 수 있다.


    B1950.0을 기준으로 하는 적도좌표계에서 은하좌표계로 변환하는 식은 다음과 같다.

     

     

     

     

     

     

     

    B1950.0을 기준으로 하는 은하좌표계에서 적도좌표계로 변환하는 식은 다음과 같다.

     

     

     

     


     

    1950.0 기준대신, 2000.0 기준으로 하는 식은 다음에 언급하겠다.


    프로그래밍을 통하여 tan에 대한 계산을 할 때 주의할 점은 atan()가 아닌 atan2()를 사용해야한다. 왜냐하면 atan의 결과값은 -90˚~90˚인데 반해, atan2의 결과는 -180˚~180˚이기 때문이다.

     


    글쓴이 : 지돌스타(http://blog.jidolstar.com/585)

     

     

    천문학에서 천체의 위치를 나타내기 위해서 여러 좌표계(coordinate system)를 사용한다.

    대표적인 좌표계로 다음과 같은 것이 있다.

     

    1. 지평좌표계(Horizontal Coordinate System)

    지금 내가 서있는 지평면이 기준면이 되고 북점(자전축방향) 또는 남점이 기준점이 되는 좌표계이다. 이 좌표계는 관측자 기준으로 별의 위치를 나타내는데 유용하다. Starpl에서 오른쪽 하단에 마우스를 오버했을때 보여주는 방위각,고도가 바로 이 좌표계에서 나타내는 방식이다.

    방위각(azimuth)은 북점 또는 남점에서 시계방향으로 천체의 발까지 잰 각이고

    고도(altitude)는 천체의 발로부터 천체까지 잰 각이다.

     

    2. 적도좌표계(Equatorial Coordinate System)

    지평좌표계의 한계는 지구위에 관측자가 바라보는 천체의 좌표이므로 지구의 공전과 자전, 그리고 관측자가 어디에 있느냐에 따라 그 위치가 계속 변한다는 단점이 있다. 그래서 고정된 천체(여기서는 항성=별을 의미)의 위치를 나타내기 위한 좌표계가 필요하다. 그것이 바로 적도좌표계이다.

    적도좌표계는 지구의 적도를 천구상에 연장한 천구의 적도를 기준면으로 한다. 그리고 춘분점(vernal equinox point)이 기준점이 된다.

    적도좌표계에서는 춘분점에서 천구의 적도를 따라 시계반대방향으로 천체의 발까지 잰 각을 적경(right ascension)이고 천체의 발로 부터 천체까지 지구의 자전축을 연장한 천구의 북극을 +방향으로 잰각을 적위(declination) 이라고 한다.

     

    3. 황도좌표계(Ecliptic Coordinate System)

    지구를 비롯한 행성은 태양을 중심으로 공전한다. 그래서 행성의 회전에 기준이 되는 좌표계가 필요하다. 그래서 만들어진 것이 바로 황도좌표계이다. 황도좌표계의 기준면은 바로 지구공전면(황도면)이며 기준점은 춘분점이다. 적도좌표계와 약 23.5도 기울어져 있으며 지구중심에서볼때 지심황도좌표계, 태양중심에서 볼때 일심황도좌표계로 분류된다. 춘분점을 기준으로 지구공전방향(황도)를 따라 잰각은 황경(celestial longitude), 천체의 발부터 천체까지 북쪽으로 +, 남쪽으로 -로 잰각을 북 황위(celestial latitude)라고 명한다.

     

    4. 은하좌표계(Galatic Coordinate System)

    위 3개의 좌표는 태양계에서 이뤄지는 좌표이다. 그렇기 때문에 은하를 중심으로하는 별들의 위치를 표현하는데는 한계가 있다. 우리 은하면을 기준면으로 하고 은하중심(궁수자리부근)을 기준점으로 하는 은하좌표계는 은하에서의 절대적 위치를 표현하는데 적합하다. 은하의 적도를 따라 시계반대방향으로 은하중심으로부터 천체의 발까지 잰각은 은경(galactic longitude), 천체의 발부터 천체까지 잰각을 은위(galactic latitude) 라고 한다.

    은하좌표계는 1959년 국제천문단체(IAU)에서 정의했다. B1950.0 표준 적도좌표계에서 은하 북극(the galactic North Pole)는 적경 192.25도, 적위 +27.4도 이다.

     

    필요에 따라 위의 4개의 좌표계를 서로 변환할 필요가 있다.

    가령 서울에서 목성의 위치를 알고 싶을 때는 먼저 황도좌표계에서 목성의 위치를 계산한다음 적도좌표계로 변환한다. 그리고 관측지와 관측시간정보를 이용해 지평좌표계로 변환하면 관측지를 기준으로 목성의 위치가 어디에 있는지 확인할 수 있겠다.

     

    이러한 계산을 하기 위해서 사전에 필요한 지식은 좀 많은 편이긴 하다.

    왜냐하면 위 4개의 좌표계를 이해하는 것도 중요하지만 용어에 대한 정확한 이해가 필요하기 때문이다.

     

    조만간 계산에 사용되는 관련 용어와 계산식, 그리고 예제에 대한 글을 올리도록 하겠다.

     

    글쓴이 : 지돌스타( http://blog.jidolstar.com/584 )

    여기서 다루는 문제는 천문 관련 계산할 때 반드시 숙지하고 있어야할 각도 변환에 관련된 것이다. 매우 기초적인 내용이다. 꼭 천문 계산이 아니더라도 수학계산을 위해 이러한 내용은 잘 알고 있어야 한다.

     

    혹시 다음 값을 어떻게 읽는가?

     

    • 2h 44m 11.986s
    • 49°13'42.48"

     

    아마도 대부분 사람들이 다음처럼 읽을 것이다.

     

    • 2시 44분 11.986초
    • 49도 13분 42.48초

     

    2h 44m 11.986s 는 시(hour)이며, 49°13'42.48"는 도(degree)이다.

     

    잘 알고 있는 사실이지만 24시간은 360도에 대응한다. 그리고 1시간은 15°에 대응한다. 또한 시간에서의 1분은 도에서 15분과 대응한다. 문제는 여기서 발생한다. 한국어로 번역할때 시간의 1분과 도의 1분은 명확히 다른 단위라는 것이다. 영문으로는 시간의 분은 minute를 쓰고 도에서의 분은 arcminute를 사용한다.

     

    이러한 시간과 도의 차이를 잘 모르고 용어를 섞어쓰면 나중에 분명히 문제가 발생한다. 그래서 도와 시간의 표현에는 영어를 쓰는 것이 안전하다. 다음처럼 쓰자.

     

    • 2h = 2 hours 또는 2h
    • 44 m = 2 minutes 또는 2m
    • 11.986s = 11.986 seconds 또는 2 s
    • 49° = 49 degrees 또는 49 deg
    • 13' = 13 arcminutes 또는 13 arcmin
    • 42.48" = 42.48 arcseconds 또는 42.48 arcsec

     

    아래값을 보자.

     

    • 1h 21m 23.2s
    • 1°21'23.2"

     

    위 값은 둘다 1.3564 값을 가진다.(둘다 분에는 60을 곱하고 초에는 3600을 곱해서 시나 도에 더하면 된다.) 하지만 단위가 하나는 hours이고 하나는 degrees이다. 1h 21m 23.2s 를 각도로 표시하기 위해서는 15가 곱해져야 한다. 결과적으로 1.3564 h * 15°/h = 20.346°가 된다.

     

    앞서 설명한 도와 시간은 사람이 보기에 편한 단위이다. 누구나 360도와 24시에 대해서 복잡하다는 느낌을 받는 사람은 없을 것이다. 하지만 수학적 계산을 할 때는 이러한 값을 사용할 수 없다. 수학적 계산을 위해서는 각도와 시간은 항상 라디안(radian)값으로 변환해야한다. 지름 1의 원의 둘레값으로 π=3.141592653… 이다. 이 값이 radian이다. 즉 지름과 원의 둘레값의 단위를 동일하게 봄으로써 수학적 계산을 가능하게 한다. 360도와 24시는 2π=6.2831853…와 대응한다.

     

    각도를 표현하는 단위는 지금까지 살펴본 결과 도(degree), 시(hour), radian 이라는 것을 알았다. 천문학에서 이것 외에는 사용하지 않는다. 가령, 적경(Right Asension),적위(Declination)은 각각 시와 도를 사용한다. 앞서 설명했듯이 시와 도는 수학계산에는 적합하지 않으므로 radian으로 변환해야한다. 가령, cos, sin과 같은 수학함수를 이용할 때 도, 시 단위로는 계산할 수 없으므로 반드시 radian으로 변환한 다음에 사용해야한다.

     

    천문 프로그래밍을 한다면 각도 단위 변환을 하기 위해 다음과 같은 방법으로 변환값을 미리 만들어 사용한다.

     

    /**
     * Pi
     */
    public static const PI:Number = 3.141592653589793238462643383279502884197;
    
    /**
     * Pi * 2
     */
    public static const TPI:Number	= 6.2831853071795864769252867665590;
    
    /**
     * Half of PI
     */
    public static const HPI:Number = 1.5707963267948966192313216916398;
    
    /**
     * Math.sqrt(2);
     */
    public static const SQRT2:Number = 1.5707963267948966192313216916395;
    
    /**
     * Radian -> Degree
     */
    public static const R2D:Number = 57.295779513082320876798154814105;
    
    /**
     * Degree -> Radian
     */
    public static const D2R:Number = 0.017453292519943295769236907684886;
    
    /**
     * Arcsecond -> Radian
     */
    public static const S2R:Number = 4.8481368110953599359e-6;
    
    /**
     * Radian -> Arcsecond
     */
    public static const R2S:Number = 206264.80624709635515647335733078; //3600 * 180/PI
    
    /**
     * Arcminute -> Radian
     */
    public static const M2R:Number = 2.9088820866572159615394846141477e-4; // 1/60 * PI /180
    
    /**
     * Radian -> Arcminute
     */
    public static const R2M:Number = 3437.7467707849392526078892888463; //60 * 180/PI
    
    /**
     * Arcminute -> degree
     */
    public static const M2D:Number = 1/60;
    
    /**
     * degree -> Arcminute
     */
    public static const D2M:Number = 60;
    
    /**
     * Radian -> Hours
     */
    public static const R2H:Number = 3.8197186342054880584532103209403;
    
    /**
     * Hours -> Radian
     */
    public static const H2R:Number = 0.26179938779914943653855361527329;
    
    /**
     * Degree -> Hour
     */
    public static const D2H:Number = 1/15;
    
    /**
     * Hour -> Degree
     */
    public static const H2D:Number = 15;

     

     

    만약 시(hour)에서 도(degree)로 변환하려면 14h * H2D = 210 deg 가 된다. 이러한 방법을 이용해여 수학적 계산을 마무리 짓고 나온 결과값이 각도인 경우 그에 맞게 시(hour) 또는 도(degree)로 변경해주어 사람이 보기 편리하도록 만들어주면 되는 것이다.

     

     

    + Recent posts