글쓴이: 산이  [PHP] class of solar, 24 절기 계산과 태양의 위치 조회수:913
 http://linuxchannel.net/
 http://ftp.linuxchannel.net/devel/php_solar/
 http://linuxchannel.net/gaggle/solar.php

안녕하세요?
드디어 완성했습니다.
제가 천문학 전공이 아니라서 상당히 고전했습니다.
(다행히 제가 천문학 쪽에 관심이 많아서...^.9)

이 내용은 L-SN 과 phpschool.com 에 동일하게 포스팅합니다.

...

[PHP] class of solar, 24 절기 계산과 태양의 위치

[author]
 - Chilbong Kim, <san2(at)linuxchannel.net>
 - http://linuxchannel.net/

[changes]
 - 2003.09.08 : bug fixed
 - 2003.09.06 : new build

---------------------------------------------------------

0. 배경 및 개요
1. 24 절기 계산의 어려움(FAQ)
2. 어떻게 계산했나(계산방법)
3. PHP 클래스 사용법
4. 후기

---------------------------------------------------------


0. 배경 및 개요

배경은 생략합니다.

[근사식에 대한 신뢰]
 - 표준편차 : 1289.7736 = 21.5 minutes (standard deviation)
 - 평균오차 : 817.57409541246 = 13.6 minutes
 - 최대오차 : +4102.7340(68.4 minutes), -4347.2395(72.5 minutes)

[근사식으로 계산한 24절기 실제 오차] 1902 ~ 2037 년
 - 표준편차 : 1122.1921 = 18.7 분
 - 평균오차 : +686.08382175161 = +11.4 분
 - 최대오차 : +4297.252300024(71.6 분), -4278.048699975(71.3 분)
 - 최소오차 : +0.16999998688698(0초)

[근사식 + 년도 보정으로 계산한 24절기 실제 오차] 1902 ~ 2037 년
 - 표준편차 : 450.8534 = 7.5 분
 - 평균오차 : +305.38638890903 = 5.0 분
 - 최대오차 : +3028.2343000174 = 50.5 분, -1982.9391000271 = 33.1 분
 - 최소오차 : +0.0085000991821289 = 0 초

[valid date]
 - 1902.01.01 00:00:00 <= utime <= 2037.12.31 23:59:59

[download & online source view]
 - http://ftp.linuxchannel.net/devel/php_solar/

[demo]
 - http://linuxchannel.net/gaggle/solar.php

[references]
 - http://cgi.chollian.net/~kohyc/
 - http://user.chollian.net/~kimdbin/
 - http://user.chollian.net/~kimdbin/re/calendar.html
 - http://user.chollian.net/~kimdbin/re/suncoord.html
 - http://user.chollian.net/~kimdbin/qna/al138.html
 - http://ruby.kisti.re.kr/~manse/contents-3.html
 - http://ruby.kisti.re.kr/~anastro/sub_index.htm
 - http://www-ph.postech.ac.kr/~obs/lecture/lec1/elementary/nakedeyb.htm
 - http://ruby.kisti.re.kr/~anastro/calendar/etime/ETime.html
 - http://www.sundu.co.kr/5-information/5-3/5f3-3-5-04earth-1.htm
 - http://www-ph.postech.ac.kr/~obs/lecture/lec1/elementary/nakedeya.htm
 - http://upgradename.com/calm.php
 - http://aa.usno.navy.mil/faq/docs/SunApprox.html
 - http://aa.usno.navy.mil/data/docs/JulianDate.html


1. 24 절기 계산의 어려움(FAQ)

http://linuxchannel.net/board/read.php?table=qna&no=3984

>산이님 홈페이지에 있는 24절기를 붙이려고 하니(태극기 달기),
>매년 따로 배열로 넘기기가 좀 그래서 ...
>
>음력을 구하게 되니 음력에 따른 설날이나 추석도 구해지고,
>양력 국경일은 해당 일에 태극기가 달리면 되더군요.
>
>그런데 동지를 기준으로 매년 24절기를 구할려고 하는데,
>어떤식으로 해야할지 몰라서 질문해 봅니다.
>
>산이님이 php스쿨에 태극기 달기 팁에 몇분께서 동지를 이용해 매년
>24절기를 구하는 방식을 말씀해 주셨는데, 조금 이해가 안가서요.
>
>동지에 15.218425일 을 더하면 절기입기 시각이 구해진다는데,
>기준을 어떻게 잡아야 할지 몰라서 한번 질문해 봅니다.
>
>mysql 에서 동지에 위의 날짜를 더해가니 실제와 차이가 나더라구요.
>정확한 동지의 시작시간까지 알아야 하는 건가요?
>

-- 이하 답변 내용 -------------

24절기는 그렇게 간단하게 계산되질 않습니다. 아주 복잡합니다. 정확하게 계산하려면 천체역학이나 천체물리학을 따로 공부해야할 정도입니다. 아니면 고등학교 지구과학 이상의 수준을 요구합니다. 며칠동안(?) 24절기에 대해서 자료를 찾아보았습니다.

앞에서 동지에 15.218425 일을 더하면 절기입기일이 시작된다고 하는데 이것은 평기법으로 계산한 방법을 말합니다. 1태양년은 즉 1 회귀주기는 365.242190 일입니다. 이것은 태양이 춘분점을 지나서 다음 춘분점이 오기까지의 시간(거리간격)을 의미합니다.

그런데 또 세차운동(지구와 태양의 인력에 의한)에 의해서 춘분점이 서에서 동쪽으로 0.013972도씩 오차가 생긴다고 하네요. (정말 어렵죠...)

현재 달력(양력, '태양태음역'의 준말)은 그레고리역으로 365.2422 일을 기준으로 합니다. 그래도 오차가 있죠.

24절기이므로 24 등분하면, 즉 365.2422 / 24 == 15.218425 일됩니다. 옛날에는 동짓날이 가장 그림자가 길기 때문에 동짓날부터 더해서 계산했다고 하네요.(오차를 줄이기 위해서) 이렇게 계산한 방법을 평기법이라고 합니다. 현재는 평기법이 아닌 정기법을 사용합니다.

평기법과 정기법의 차이는 바로 표준태양일이냐 아니면 진태양일으로 그 기준을 하냐의 차입니다. (이하 '표준태양시', '진태양시') 먼저 표준태양시를 이해하기 앞서서 진태양시부터 이해해야합니다.

진태양시는 지구의 자전에 의해서 태양이 남중(자오선통과)해서 그 다음날 남중까지의 시간(거리)을 말합니다. 이 시간을 진태양시라고 합니다. ('진태양일')

이 시간은 절대적으로 24시간이 아닙니다. 즉 지구가 타원괘도를 그리면서 공전하기 때문에 각각 모두 다릅니다. 또한 공전속도도 일정한 등속이 아닌 제각기 다릅니다. 태양 근일점에서 가장 빠르고, 태양 원일점에서 가장 느립니다. 이 진태양시는 2월달에서 가장 짧고(대약 24시간-14분 정도), 11월 정도에서는 대략 24시간 +16분 정도 됩니다. 이렇게 들쑥날쑥한 태양일을 24시간으로 평균적으로 통일한 것이 바로 평균태양시입니다. 현재 우리가 사용하고 있는 하루나 달력은 모두 이 평균태양시를 기준으로 합니다. 평균태양시와 진태양시와의 차를 '균시차'라고 합니다.

앙부일귀(해시계)는 실제로 시간을 재는 기기가 아닌 시각, 즉 태양의 위치를 재는 기기이기 때문에 균시차를 적용해야 우리가 사용하는 시간이 나옵니다. 그런데 실제 24절기는 이 평균태양일에 기준하지 않습니다. 즉 진태양시에 맞추어 실제 태양의 위치를 설명하기 위한 하나의 방법입니다.

24절기는 1태양년을 24 등분할 때의 각 지점을 말하는데, 이것은 계절의 변화를 알기 위함입니다. (중국 화북(?)지방에서 농사일에 관련된 계절변화) 즉 태양의 위치는 알기위해서 절기를 사용했다는 점에서 양력을 말합니다. 즉 옛날에도 실제로 양력이 보조로 사용했다는 의미가 되죠. 그런데 또 여기에서 주의할 점은 1태양년을 24등분 할 때 그 기준이 무엇이냐  입니다. 천체역학에서는 춘분점에서 황도를 따라 15도씩 나눈다고 합니다.

이 말은 균등하게 360도 각을 15도씩 나눈다는 의미로 해석하면 안됩니다. 지구는 타원괘도를 그리면서 또한 일정지 않는 공전속도로 움직이기 때문에 각 15도씩 이동할 때마다 실제 걸리는 시간을 모두 다릅니다.

24 등분은 케플러의 '면적속도 일정의 법칙'에서 타원 퀘도 상의 동일한 24 면적 등분에 의한 각 기점을 말합니다. 이것 때문에 실제 24절기 계산이 어렵다는 것이죠. 즉 면적을 24등분했을 때 A 기점(절기)에서 B 기점(중기)으로 이동할 때 시간이 모두 다르다는 것입니다.
이해가 되었는지 모르겠네요.

솔직히 지구과학시간이나 천체역학 또는 천체물리학에서 언급하는 천체, 적도면, 위도, 경도, 적도좌표, 황도, 황도면, 황경, 황도좌표, 지평자표계, 고도, 방위도, 남중, 자오선, 케플러의법칙, 12궁도, 태양년, 표준태양시, 진태양시, 항성년, 항성일, 균시차, ??각, 춘분점, 세차운동, ... 지구시, 세계시, 지방시, 표준자오선(?), 지구시, 윤년, 평년, 윤달, 평달,...
등등 정말 상당히 많은 전문용어가 나옵니다...................................................

여기까지가 이론적인 내용이고,
실제로 PHP 로 코딩하려면, 상당히 복잡한 계산식이 나옵니다. 아직 적용해보질 않아서..
다행히 제가 생각하는 편법을 그대로 적용한 계산법이 있더군요, 즉 A 절기에서 B 절기로 가는 시간이 각각 다르므로 A-B 간의 시간을 모두 평균적으로 구해서 24개를 만들어 놓으면 어느 정도 계산이 된다는 알고리즘입니다.

이 방법은 편법이기 때문에 기준일로부터 멀어질수록 오차가 생긴다는 치명적인 단점이 있습니다. 하지만, 근 100년 전후라면 아주 작은 오차 안에서 비교적 정확하게 계산해 낼 수 있습니다.
http://user.chollian.net/~kimdbin/re/ki24_150.html

위의 URL은 24절기를 150년간 계산해놓은 절기표입니다.
시각(시간이 아님)은 KST, GMT 도 아닌 TT 라고 하는 지구시 단위입니다.
즉 위의 URL에 계산이 나옵니다만, 실제 KST 로 바꿀려면 TT - dT + 9h 으로 계산해 봐야합니다. (UT 는 세계시 = TT - dT를 의미하고, 평균태양(진태양이아님)이 그리니치
자오선을 통과(남중)할 때를 세계시 12시로 봄, 이때의 표준지방시인 GMT는 12시로 UT = GMT 임, 참고로 1925년 이전에는 0시로 계산했다고 함)

2003 67
[01]  1  5  18 28 48
[02]  1 20  11 53 39
[03]  2  4   6 06 25
[04]  2 19   2 01 17
[05]  3  6   0 05 57
[06]  3 21   1 00 50

2003년 춘분점에 대한 KST :

<?php
echo date('Y-m-d H:i:s',mktime(1+9,0,50-67,3,21,2003));
// 2003-03-21 09:59:43 KST
?>

실제 각 절기간의 간격은 굳지 +9h 를 더할 필요 없이 지구시의 간격으로 계산하면 됩니다. 어차피 dT(델타T)는 한 해 동안 모두 동일하므로 이것도 필요 없음) 그런데 각 절기간의 간격 평균은 '고영창'님이 미리 계산한 놓은 값을 이용하면 될 것 같네요.

  ('입춘','우수','경칩','춘분','청명','곡우','입하','소만',
   '망종','하지','소서','대서','입추','처서','백로','추분',
   '한로','상강','입동','소설','대설','동지','소한','대한','입춘');
  =
  (0,21355,42843,64498,86335,108366,130578,152958,
   175471,198077,220728,243370,265955,288432,310767,332928,
   354903,376685,398290,419736,441060,462295,483493,504693,525949);

1996년 입춘 일을 기준으로 각 절기간의 간격 누계를 분단위로 표시한 경우라고 하네요....

* 퀴즈1)
1태양년은 365.242190 일,
1항성년은 365.256360 일,
1평균태양일 = 24평균태양시 = 24시 3분 56.6초(항성시),
1항성일 = 23시 56분 4.1초(평균태양시)
이라고 한다면, 실제 지구는 1 태양년 동안 실제 몆 번을 자전할까요?

*퀴즈2)
2월이 짧고, 7월과 8월이 긴 까닭은?

2. 어떻게 계산했나(계산방법)
곧바로 계산이 어려우니깐 다음과 같은 편법을 사용했습니다.
1) 우선 고영창님이 계산한 알고리즘과 동일한 방법을 사용합니다.
   즉 지난 과거 1902 년부터 2000년까지의 절기에 대해서 1년 단위로
   각 절기간의 간격을 계산합니다. 기준점은 춘분점입니다.
   http://user.chollian.net/~kimdbin/re/equinox19002050.html

위의 URL은 김동빈이 계산한 실제(?) 24 절기 자료입니다. 지구시를 dT 까지 보정해서 실제 세계시로 환산하여 계산했습니다. 계산결과는 다음과 같습니다(춘분점 기준으로 1월부터 12월까지)
   $tterms = array
   (
 -6418939, -5146737, -3871136, -2589569, -1299777,        0,
  1310827,  2633103,  3966413,  5309605,  6660762,  8017383,
  9376511, 10735018, 12089855, 13438199, 14777792, 16107008,
 17424841, 18731368, 20027093, 21313452, 22592403, 23866369
    );

   위의 계산은 표준편차까지 적용한 평균값입니다.

2) 1)에서 구한 각 구간별 누계를 2000년 춘분점부터 계산합니다.
   2000년 춘분점은,
   mktime(7+9,36,19-64,3,20,2000), 2000-03-20 16:35:15(KST)
   = 953537715
   1 평균 태양년(tropicalyear) = 31556940 seconds

3) 1)과 2)에 의해서 각 절기 점의 태양의 시황경을 구합니다.
   시황경을 구하는 식은 근사식으로 다음과 같은 실제 오차가 있습니다.
   - 표준편차 : 1289.7736 = 21.5 minutes (standard deviation)
   - 평균오차 : 817.57409541246 = 13.6 minutes
   - 최대오차 : +4102.7340(68.4 minutes), -4347.2395(72.5 minutes)

근사식에 대한 설명은 http://user.chollian.net/~kimdbin/re/suncoord.html에 있습니다.
   (지구시 2000.0년을 기준으로 율리우스 적일을 통해서 계산)

4) 계산한 시황경 각도 보정 근사식에 대한 오차가 그리 크기 않기 때문에 충분한 신뢰가 갑니다. 따라서 계산한 시황경을 15 도 정수 단위의 끊어서 계산한 시황경에 대한 편차를 초단위로 계산합니다.
   예를들어, 계산한 시황경 L = 300.0039682710 이라면,
   1 solar year == 365.242190 days == 31556925.216 seconds
   1 degress == 31556925.216 seconds / 360 degress == 87658.1256 seconds
   이므로, -0.0039682710 * 87658.1256 = -347.8512 seconds 가 됩니다.
   이 편차를 1)의 평균 시간누계에 적용합니다.

   평균 누계시간을 이렇게 각도 보정을 하는 이유는 모두 동일하게 표준편차
   21.5 분 또는 평균오차 13.6 분 안으로 계산하기 위함입니다.

5) 4)까지 계산한 값을 실제 절기간과 비교하면,
   - 표준편차 : 1122.1921 = 18.7 분
   - 평균오차 : +686.08382175161 = +11.4 분
   - 최대오차 : +4297.252300024(71.6 분), -4278.048699975(71.3 분)
   - 최소오차 : +0.16999998688698(0초)
   가 됩니다.

오차 크기 않기 때문에 그대로 사용이 가능하나, 좀 문제가 있습니다. 즉 표준편차나 평균오차 안에 들더라도 이 시간대에서 날짜가 바뀌면 문제가 생깁니다. 따라서 1902 년부터 2037년까지 실제 24절기와 비교해서 표준편차가 큰 것들을 년도보정과 날짜 변경 보정을 해야 합니다. 계산된 양이 많기 때문에 본 class 의 tterms() 함수를 참고하길 바랍니다.

6) 5)번까지 계산한 결과를 실제 절기간과 비교하면,
   - 표준편차 : 450.8534 = 7.5 분
   - 평균오차 : +305.38638890903 = 5.0 분
   - 최대오차 : +3028.2343000174 = 50.5 분, -1982.9391000271 = 33.1 분
   - 최소오차 : +0.0085000991821289 = 0 초
   가 됩니다.

년도 보정과 날짜 보정까지 계산했기 때문에 틀린 날짜로 절기가 나오질 않습니다.

3. PHP 클래스 사용법
본 PHP class 에서 사용가능한 함수는 몇 개 되질 않습니다.
  (1) 특정 시각에 대한 태양의 위치 계산 :
  array solar::sun( int unix_timestamp [, boolean GMT ] )
  (2) 특정 년도-월에 대한 24절기 계산과 자세한 태양의 위치 계산 :
  array solar::terms(int year [, int smoon [, int length [, array &sun]]] )
  (3) 오늘 절기 체크 :
  string solar::today( [ int unix_timestamp [, boolean GMT]] );
  (4) 특정 시각에 대한 절기 체크 :
  string solar::solar( [ int unix_timestamp [, boolean GMT]] );

1) 특정 시각에 태양의 위치를 알아보려면 ?
  usage : array solar::sun( int unix_timestamp [, boolean GMT ] )

  예) 현재시각에 대한 태양의 위치
  $sun = solar::sun(time());
  print_r($sun);

  // 출력 결과
  Array
  (
    [JD] => 2452890.1381597221    <--- 율리우스 적일
    [L] => 164.5961639692         <--- 태양의 시황경
    [e] => 23.4385157503          <--- 태양의 황도 경사각
    [R] => 1.0077322215           <--- 천문단위
    [RA] => 345.8137140525        <--- 태양의 적경
    [d] => 6.0648783930           <--- 태양의 적위
    [stime] => 14428191.2145      <--- 시황경에 대한 1태양년 시간(초)
    [dtime] => 82995.2914         <--- 적경에 대한 1일 시간(초)
    [atime] => 35399.5095         <--- 정수단위 시황경에 대한 치우침 정도(초)
    [utime] => 1062947873         <--- 유닉스 타임스탬프
    [date] => Mon, 08 Sep 2003 00:17:53 KST
    [gmdate] => Sun, 07 Sep 2003 15:17:53 GMT
    [_L] => 164°35′46.1903″    <--- 시황경을 각도로 표시
    [_e] => +23°26′18.6567″    <--- 황도 경사각을 각도로 표시
    [_RA] => 345°48′49.3706″   <--- 적경을 각도로 표시
    [_d] => +6°03′53.5622″     <--- 적위를 각도를 표시
    [_stime] => 166 23 49 51.2145 <--- 시황경을 '일-시-분-초' 로 환산
    [_dtime] => 0 23 03 15.2914   <--- 적경을 '일-시-분-초' 로 환산
    [_atime] => +0 09 49 59.5095  <--- atime 을 '일-시-분-초' 로 환산
  )

  오차는 표준편차 21.5 분입니다.

보현산 천문대 http://www.kao.re.kr/~yukis/solsys0.html 에서 위의 계산된 값과 서로 비교해 보길 바랍니다. (적경 == _dtime, 적위 == _d, 거리(AU) == R)


2) 특정 년도의 24절기를 알아보려면 ?
  usage : array solar::terms(int year [, int smoon [, int length [, array &sun]]] )
  예) 올해의 24 절기
  $terms = solar::terms(date('Y'));
  print_r($terms);

  // 출력 결과(2003년임)
  Array
  (
    [106] => 소한
    [120] => 대한
    [204] => 입춘
    [219] => 우수
    [306] => 경칩
    [321] => 춘분
    [405] => 청명
    [420] => 곡우
    [506] => 입하
    [521] => 소만
    [606] => 망종
    [622] => 하지
    [707] => 소서
    [723] => 대서
    [808] => 입추
    [823] => 처서
    [908] => 백로
    [923] => 추분
    [1009] => 한로
    [1024] => 상강
    [1108] => 입동
    [1123] => 소설
    [1207] => 대설
    [1222] => 동지
  )

  년도별 24 절기는 http://user.chollian.net/~kimdbin/re/equinox19002050.html
  에 있으니 비교해 보길 바랍니다.

3) 현재 달의 절기를 알아보려면(자세한 태양의 위치까지) ?
  예) 현재 년도-월
  $detail = array();
  list($year,$moon) = explode(' ',date('Y n'));
  $terms = solar::terms($year,$moon,0,&$detail);
  print_r($terms);
  print_r($detail);

  // 출력 결과(2003년 9월임)
  Array
  (
    [908] => 백로
    [923] => 추분
  )

  Array
  (
    [16] => Array
        (
            [JD] => 2452890.5580993714
            [L] => 165.0037309275
            [e] => 23.4385155991
            [R] => 1.0076258056
            [RA] => 346.1917636517
            [d] => 5.9075765238
            [stime] => 14463917.7701
            [dtime] => 83086.0233
            [atime] => -327.0461
            [utime] => 1062984155.7857
            [date] => Mon, 08 Sep 2003 10:22:35 KST
            [gmdate] => Mon, 08 Sep 2003 01:22:35 GMT
            [_L] => 165°00′13.4313″
            [_e] => +23°26′18.6562″
            [_RA] => 346°11′30.3491″
            [_d] => +5°54′27.2755″
            [_stime] => 167 09 45 17.7701
            [_dtime] => 0 23 04 46.0233
            [_atime] => -0 00 05 27.0461
            [_avgdate] => Mon, 08 Sep 2003 01:58:47 GMT
            [_name] => 백로
        )

    [17] => Array
        (
            [JD] => 2452905.9491799828
            [L] => 180.0034831097
            [e] => 23.4385100583
            [R] => 1.0034920967
            [RA] => 0.0031957122
            [d] => -0.0013854578
            [stime] => 15778767.9309
            [dtime] => 0.7670
            [atime] => -305.3229
            [utime] => 1064313945.1505
            [date] => Tue, 23 Sep 2003 19:45:45 KST
            [gmdate] => Tue, 23 Sep 2003 10:45:45 GMT
            [_L] => 180°00′12.5392″
            [_e] => +23°26′18.6362″
            [_RA] => 0°00′11.5046″
            [_d] => -0°00′4.9876″
            [_stime] => 182 14 59 27.9309
            [_dtime] => 0 00 00 0.7670
            [_atime] => -0 00 05 5.3229
            [_avgdate] => Tue, 23 Sep 2003 11:12:23 GMT
            [_name] => 추분
        )
    )

4) 오늘이 절기에 해당되는 체크
  usage : string solar::today( [ int unix_timestamp [, boolean GMT]] );

  예)
  $today = solar::today();
  echo $today;

  // 출력 결과
  오늘은 < B >백로 < B >입니다

  오늘이 마침 백로이군요. 해당 요일이 절기에 포함되지 않으면 아무것도
  출력되질 않습니다.

5) 특정 날이 절기에 해당되는지 체크
  usage : string solar::solar( [ int unix_timestamp [, boolean GMT]] );
  (위의 solarr::today() 와 동일한 함수임) 

  예)
  $solar = solar::solar(mktime(0,0,0,3,21,2003));
  echo $solar;

4. 후기
제가 천문학 전공이 아니라서 계산하는데 상당히 어렵더군요. 특히 학부 때 공업수학을 두 번이나 F 받는 기억이... T.T 고등학교 졸업한지 15년 정도 되었는데, 다시는 그런 계산을 하지 않을 거라고 생각했는데, 고차방정식, 미분적분, 삼각함수, 호도법, 라디안, 통계, 오차론(?) 등등 고교수학이 상당히 비중을 차지하더군요.
어쨌든 제가 원하는 계산은 모두 끝냈습니다.

위의 PHP class 를 이용하여, 오늘 절기 체크, 현재시각에 대한 태양의 위치, 올해 절기와 상세한 태양의 위치 등등 계산하는데 약 0.05 초 정도 걸리더군요. (웹호스팅 웹서버에서)
http://linuxchannel.net/gaggle/solar.php
에 실시간 데모가 있습니다.

EOF

 -_- 주기 계산이 간단하게 되던가요??
그리고 주기랑 지구 시간을 맞춰서 정확하게 24절기를 구분해 낼 수 있나요??
실제 만세력과 비교해서 차이가 없나요??
쿨럭.. 질문만 많아서 죄송.. ㅠㅠ 09/07 10:17:29 
  
 산이 간단하게 계산되지 않습니다.
현재 우리가 사용하고 있는 시간이 평균태양시이기 때문이죠.
24절기는 진태양시를 기준으로 하고 있죠.
...

간단하게 계산방법을 소개하면,
1) 24절기 평균값을 편차보정(표준편차 이내에 든 것들에 대한 보정)
2) 1) 에서 구한 시간에 대한 태양의 시황경 계산
3) 2)에서 구한 시황경에 대한 보정(각도 보정)
4) 3)에서 구한 보정값을 1)에 편차 보정

이렇게 구한 값이 위의 [근사식으로 계산한 실제 오차] 입니다.
현재 오차를 더 줄이기 위해서, 특정 년도 보정과 특정 날짜 보정까지 작업중입니다.
비교기준은 보현산천문대에서 계산한 랜덤한 특정날짜와 비교했고, 김동빈 선생님이 계산한 24 절기가 기준입니다. (dT 까지 계산된)

실제 만세력 자료가 없어서 비교해 보질 않았습니다만 24절기에 기준 한다면 평균오차 10분까지 가능하더군요. 물론 1902년부터 약 2030년 까지..
문서가 작성되면 다시 올리지요. 09/07 18:30:45 
  
 -_- 크아..
정말 재미난 작업하시네요.. 기대하고 있겠습니다.. ^^a 09/07 19:35:15 
  
산이 고등학교 지구과학이나 천체물리 또는 천체 역학 쪽에 조금 지식이 필요합니다.
전 고등학교 지구과학 실력으로 .... ^.^ 방금 년도보정으로 1902 년부터 2037년까지 평균오차 5.5분 까지 계산해 냈습니다. 적용만 남았습니다. 09/07 20:25:26 
  
 산이 24절기 1902 ~ 2037 년까지,
- 표준편차 : 450.8534 = 7.5 분
- 평균오차 : +305.38638890903 = 5.0 분
- 최대오차 : +3028.2343000174 = 50.5 분, -1982.9391000271 = 33.1 분
- 최소오차 : +0.0085000991821289 = 0 초
까지 소스 적용 끝냈습니다. 09/07 22:10:56 
  
 배트 항상 최선을 다하시는 모습 정말 멋집니다. 감사합니다. 09/08 14:23:24 
☆~ - 최대오차 : +3028.2343000174 = 50.5 분, -1982.9391000271 = 33.1 분
저 부분 오타요~ ^^;; -33.1 분이죠? @_@a;; 09/08 19:41:46 
  
 ☆~ 흠 소스보니 아직 완전하게 않 만들어진듯하네요^^a 완성판이 기대되는군요 ^^
저도 지구과학에 관한거라면 관심이 많이 있어서 말이죠^^ 재미있게 잘보았습니다 +_+ 09/08 19:59:06 
  
 안지민 뭐.. 뭐.. -_- 뭐라캐쌌노? 09/09 15:36:46 
  
 산이 관심을 가져주어서 감사합니다.
...
To 절기님
천체역학이 아닌 PHP 에서 단순 절기를 구하는 데에 있어서 표준편차 7.5분이면 상당히 양호한 편입니다. 그러나 아주 정확한 정확도를 요구하는 업무에서는 위의 방법을
그대로 사용하면 안 됩니다. 표준편차 7.5분이면 엄청나게 큰 거죠... 따라서 아주 정확하게 계산된 값을 요구하지 않는 분야에 적용해야 합니다. 즉 날짜 보정까지 했으므로 1902년 부터 2037년까지의 절기일에 대한 오류는 없습니다. 그냥 간단하게 '절기일'을 알아보는데 사용하면 충분할겁니다. 09/17 22:22:20 
  
산이 To 절기님
김동빈 선생님 홈페이지에서 자료를 좀더 찾아보았습니다. 위의 '정확도 1분' 이 초단위 시간이라면 상당히 우수한 프로그램인 것 같습니다. 정확한 황경을 계산하기 위해서 40 페이지가 넘은 프로그램을 해야 한다고 하네요. 솔직히 PHP로 구현하기가 너무 벅차죠. 구현 알고리즘도 구하기 힘들고 그에 따른 기본적인 많은 지식이 더 필요하다고 하네요. 만약 위의 '1분이 시간각'이라면 초로 약 4분의 오차를 말합니다. 직접 알고리즘에 의해서 계산된 값이라면 URL을 알고 싶군요. 초단위 30초 또는 1분 이내의 절기를 원한다면 미리 계산된
값을 DB 에 집어넣고 꺼내오는 방법도 있습니다. (혹시 이런 방법이 아닌가 하는 ...)

[만세력 제작에 관한 글 - 절기계산]
http://211.57.134.129/~moon/cgi-bin/ast/CrazyWWWBoardLE.cgi?mode=read&num=81&db=almanac&backdepth=1

글쓴이: 최경민  글쓴날: 2003년 08월 18일 11:32:00 월(오전) 조회: 76
안녕하세요?
항상 사이트를 유용하게 이용하고 있습니다.
이번에 간단한 달력과 일정관리를 만들어보고 있는데, 여러분들의 소스를 보고 조금씩 붙여서 어느 정도 만들어 졌는데, 산이님 홈페이지에 있는 24절기를 붙이려고 하니(태극기 달기), 매년 따로 배열로 넘기기가 좀 그래서 ...

음력을 구하게 되니 음력에 따른 설날이나 추석도 구해지고, 양력 국경일은 해당 일에 태극기가 달리면 되더군요. 그런데 동지를 기준으로 매년 24절기를 구할려고 하는데, 어떤 식으로 해야할 지 몰라서 질문해 봅니다. 산이님이 php스쿨에 태극기 달기 팁에 몇 분께서 동지를 이용해 매년 24절기를 구하는 방식을 말씀해 주셨는데, 조금 이해가 안가서요. 동지에 15.218425일 을 더하면 절기입기 시각이 구해진다는데, 기준을 어떻게 잡아야 할지 몰라서 한번 질문해 봅니다. mysql 에서 동지에 위의 날짜를 더해가니 실제와 차이가 나더라구요. 정확한 동지의 시작시간까지 알아야 하는 건가요? 혹시 도움을 받을 수 있을까 해서 질문해 봅니다.

24절기는 그렇게 간단하게 계산되질 않습니다. 아주 복잡합니다. 정확하게 계산하려면 천체역학이나 천체물리학을 따로 공부해야할 정도입니다. 아니면 고등학교 지구과학 이상의 수준을 요구합니다. 며칠동안(?) 24절기에 대해서 자료를 찾아보았습니다.

앞에서 동지에 15.218425 일을 더하면 절기입기일이 시작된다고 하는데 이것은 평기법으로 계산한 방법을 말합니다. 1태양년은 즉 1 회귀주기는 365.242190 일입니다. 이것은 태양이 춘분점을 지나서 다음 춘분점이 오기까지의 시간(거리간격)을 의미합니다.

그런데 또 세차운동(지구와 태양의 인력에 의한)에 의해서 춘분점이 서에서 동쪽으로 0.013972도씩 오차가 생긴다고 하네요. (정말 어렵죠...)

현재 달력(양력, '태양태음역'의 준말)은 그레고리역으로 365.2422 일을 기준으로 합니다. 그래도 오차가 있죠.

24절기이므로  24 등분하면, 즉 365.2422 / 24 == 15.218425일 됩니다. 옛날에는 동짓날이 가장 그림자가 길기 때문에 동짓날부터 더해서 계산했다고 하네요.(오차를 줄이기 위해서) 이렇게 계산한 방법을 평기법이라고 합니다. 현재는 평기법이 아닌 정기법을 사용합니다.

평기법과 정기법의 차이는 바로 표준태양일이냐 아니면 진태양일으로 그 기준을 하냐의 차입니다. (이하 '표준태양시', '진태양시') 먼저 표준태양시를 이해하기 앞서서 진태양시부터 이해해야합니다.

진태양시는 지구의 자전에 의해서 태양이 남중(자오선통과)해서 그 다음날 남중까지의 시간(거리)을 말합니다. 이시간을 진태양시라고 합니다. ('진태양일') 이 시간은 절대적으로 24시간이 아닙니다. 즉 지구가 타원괘도를 그리면서 공전하기 때문에 각각 모두 다릅니다. 또한 공전속도도 일정한 등속이 아닌 제각기 다릅니다. 태양 근일점에서 가장 빠르고, 태양 원일점에서 가장 느립니다. 이 진태양시는 2월 달에서 가장 짧고(대약 24시간-14분 정도), 11월 정도에서는 대략 24시간 + 16분 정도 됩니다. 이렇게 들쑥날쑥한 태양일을 24시간으로 평균적으로 통일한 것이 바로 평균태양시입니다.

현재우리가 사용하고 있는 하루나 달력은 모두 이 평균태양시를 기준으로 합니다. 평균태양시와 진태양시와의 차를 '균시차'라고 합니다. 앙부일귀(해시계)는 실제로 시간을 재는 기기가 아닌 시각, 즉 태양의 위치를 재는 기기이기 때문에 균시차를 적용해야 우리가 사용하는
시간이 나옵니다.

그런데 실제 24절기는 이 평균태양일에 기준하지 않습니다. 즉 진태양시에 맞추어 실제 태양의 위치를 설명하기 위한 하나의 방법입니다. 24절기는 1태양년을 24 등분할 때의 각지점을 말하는데, 이것은 계절의 변화를 알기 위함입니다 (중국 화북(?)지방에서 농사일에 관련된 계절변화) 즉 태양의 위치는 알기위해서 절기를 사용했다는 점에서 양력을 말합니다. 즉 옛날에도 실제로 양력이 보조로 사용했다는 의미가 되죠.

그런데 또 여기에서 주의할 점은 1태양년을 24등분할 때 그 기준이 무엇이냐 입니다. 천체역학에서는 춘분점에서 황도를 따라 15도씩 나눈다고 합니다. 이 말은 균등하게 360 도각을 15도씩 나눈다는 의미로 해석하면 안 됩니다. 지구는 타원괘도를 그리면서 또한 일정지 않는 공전속도로 움직이기 때문에 각 15도씩 이동할 때마다 실제 걸리는 시간을 모두 다릅니다.

24 등분은 케플러의 '면적속도 일정의 법칙'에서 타원퀘도상의 동일한 24 면적 등분에 의한 각 기점을 말합니다. 이것 때문에 실제 24절기 계산이 어렵다는 것이죠. 즉 면적을 24등분했을 때 A 기점(절기)에서 B 기점(중기)으로 이동할 때 시간이 모두 다르다는 것입니다.
이해가 되었는지 모르겠네요.

솔직히 지구과학시간이나 천체역학 또는 천체물리학에서 언급하는 천체, 적도면, 위도, 경도, 적도좌표, 황도, 황도면, 황경, 황도좌표, 지평자표계, 고도, 방위도, 남중, 자오선, 케플러의법칙, 12궁도, 태양년, 표준태양시, 진태양시, 항성년, 항성일, 균시차, ??각, 춘분점, 세차운동, ... 지구시, 세계시, 지방시, 표준자오선(?), 지구시, 윤년, 평년, 윤달, 평달, 등등 정말 상당히 많은 전문용어가 나옵니다. .................................................

여기까지가 이론적인 내용이고,
실제로 PHP 로 코딩하려면, 상당히 복잡한 계산식이 나옵니다. 아직 적용해보질 않아서..
다행히 제가 생각하는 편법을 그대로 적용한 계산법이 있더군요,

즉 A 절기에서 B 절기로 가는 시간이 각각 다르므로 A-B 간의 시간을 모두 평균적으로 구해서 24개를 만들어 놓으면 어느 정도 계산이 된다는 알고리즘입니다. 이 방법은 편법이기 때문에 기준일로 부터 멀어질수록 오차가 생긴다는 치명적인 단점이 있습니다. 하지만, 근 100년 전후라면 아주 작은 오차 안에서 비교적 정확하게 계산해 낼 수 있습니다.

http://user.chollian.net/~kimdbin/re/ki24_150.html
위의 URL은 24절기를 150년간 계산해놓은 절기표입니다.

시각(시간이 아님)은 KST, GMT도 아닌 TT 라고 하는 지구시 단위입니다.
즉 위의 URL에 계산이 나옵니다만, 실제 KST로 바꿀려면 TT - dT + 9h 으로 계산해 봐야합니다. (UT는 세계시 = TT - dT를 의미하고, 평균태양(진태양이아님)이 그리니치 자오선을 통과(남중)할 때를 세계시 12시로 봄, 이때의 표준지방시인 GMT는 12시로 UT = GMT 임, 참고로 1925년 이전에는 0시로 계산했다고 함)

2003 67
[01]  1  5  18 28 48
[02]  1 20  11 53 39
[03]  2  4   6 06 25
[04]  2 19   2 01 17
[05]  3  6   0 05 57
[06]  3 21   1 00 50

2003년 춘분점에 대한 KST :

<?php
echo date('Y-m-d H:i:s',mktime(1+9,0,50-67,3,21,2003));
// 2003-03-21 09:59:43 KST
?>

실제 각 절기간의 간격은 굳지 +9h 를 더할 필요 없이 지구시의 간격으로 계산하면 됩니다. 어차피 dT(델타T)는 한 해 동안 모두 동일하므로 이것도 필요 없음)

그런데 각 절기간의 간격 평균은 '고영창'님이 미리 계산한 놓은 값을 이용하면 될 것 같네요.
  ('입춘','우수','경칩','춘분','청명','곡우','입하','소만',
   '망종','하지','소서','대서','입추','처서','백로','추분',
   '한로','상강','입동','소설','대설','동지','소한','대한','입춘');
  =
  (0,21355,42843,64498,86335,108366,130578,152958,
   175471,198077,220728,243370,265955,288432,310767,332928,
   354903,376685,398290,419736,441060,462295,483493,504693,525949);

1996년 입춘일을 기준으로 각 절기간의 간격 누계를 분단위로 표시한 경우라고 하네요.
아직 실제 PHP로 코딩해볼 질 않아서 넘겨줄 코드가 없네요.
시간이 되면 직접 코딩해서 알파문서 게시판에 올리도록 하지요...........
상당히 긴 글이네요....


아... 음력->양력, 양력->음력으로 변환하는 코드(함수)좀 볼수 있을 까요?
...........

* 퀴즈1)
1태양년은 365.242190 일,
1항성년은 365.256360 일,
1평균태양일 = 24평균태양시 = 24시 3분 56.6초(항성시),
1항성일 = 23시 56분 4.1초(평균태양시)
이라고 한다면, 실제 지구는 1 태양년 동안 실제 몇 번을 자전할까요?

*퀴즈2)
2월이 짧고, 7월과 8월이 긴 까닭은?

글쓴이: 최경민  글쓴날: 2003년 08월 20일 18:07:08 수(저녁) 조회: 117
정말 정성스런 답변 감사합니다. 이론적인 내용 솔직히 그냥 읽기만 하는데도 머리가 띵~합니다. 감사하단말 먼저 드리고 싶습니다. 솔직히 전 프로그램 짤 줄도 모르고, 남의 소스 배껴다가 얻어 쓰는 놈입니다. 아마 사람들이 제일 싫어하는 부류일겁니다. 그래도 어쩔 수 없이 그렇게 살아가고 있습니다.

먼저 양력->음력 변환 함수는 phpschool에서 검색했는데, 사용하기 편리해서 그 함수를 그대로 쓰고 있습니다. 아래 원본 글 주소입니다.

http://www.phpschool.com/bbs2/inc_view.html?id=7084&code=tnt2&start=0&mode=s
earch&field=body&search_name=&operator=and&period=all&category_id=&s_que=%C8%A3%C3%E2%B9%FD%
3A+soltolun%282002%2C01%2C11%29

그리고, 솔직히 제가 만든 달력은 남의 소스 얻어다가 누더기처럼 끼워 맞춘거라 보여드리기도 쪽 팔려서...ㅡㅡ;; 그런데, 산이님 본문에 있는 고영창이란분 홈페이지 보니 약간은 엽기적이더군요..ㅡㅡ;; 그리고, 링크된 김동빈씨의 홈페이지도 특이하네요 ^^

전 아주 단순(?)하고 좋던데요..
제가 고등학교때까지만 해도 천문학자가 되는게 꿈이었습니다. 결국 전공은 '도시공학'이지만요.. 그래서 아직도 천문, 천체 얘기만 나오면 관심이 많이 갑니다.

>============================================================
>혹시 제대로 읽어보지도 않았다고 하실지도 모르겠네요.
>워낙 무지해서 잘 모르겠더라구요.
>그래도 젤 아래에 적어주신 절기간
 간격 평균으로도 절기가
 구해지더군요.
>감사합니다. 방법은 적어주신 그대로 1996년 입춘일을 기준으로 반복문을 이용했더니
되었습니다.
>그런데,  '고영창'님이 미리 계산한 놓은 절기간의
 간격 평균은 어디에 있는지, 그분 홈에 갔는데, 잘 못찾겠더라구요.
>솔직히 맞게 된건지도 모르겠습니다.
>

http://cgi.chollian.net/~kohyc/calendar/s1221_6.txt

고영창님 홈페이지에 있습니다.
아니면 '진짜 만세력' 프로그램을 받으면 그 안에 PERL 소스로
있습니다.


>사용된 결과물도 보여드려야 하는데, 도저히 얼굴이 빨개져서 못보여드리겠습니다.
>감사합니다. 나중에 정리되면 제가 만든 일정관리 보여드릴께요...
>
>그리고, 퀴즈는...솔직히 잘 모르겠는데,
>문제를 보니 그안에 답이 있는것 같은데 공부도하고,
>윤달에 관해서 알아보라는 뜻이 계신것 같습니다.
>편리함에 길들여져서 인지....검색찬스를 썼습니다. ㅡㅡ;;
>
>* 퀴즈1)
>1태양년은 365.242190 일,
>1항성년은 365.256360 일,
>1평균태양일 = 24평균태양시 = 24시 3분 56.6초(항성시),
>1항성일 = 23시 56분 4.1초(평균태양시)
>이라고 한다면, 실제 지구는 1 태양년 동안 실제 몆번을 자전할까요?
>http://kin.naver.com/browse/db_detail.php?dir_id=110206&docid=96104
>
>맞는지 모르겠습니다. 솔직히 산수도 잘 몰라요.
>지구 자전주기: 23시간 56분 4초 ==>초로 환산 :86164초
>1태양년을 ==>초로 환산 : (365일*86400=31536000초)
 + (86400*0.242190일)=315569252.216초

>
>315569252.216 / 86164=366.24257481082 번( 약366번 인가?)
>모르겠습니다.
>

예, 위의 계산방법이 맞습니다.
실제 지구는 365.5 바뀌가 아닌 366 바뀌 조금 더 돌지요.
(실제 지구 자전속도가 조금씩 느려진다고 하네요..헙)

그런데 위의 계산은 검증(?)에 필요한 계산이고요,
실제로 이렇게 복잡(?)하게 계산하지 않아도 금방 알 수 있습니다.

즉 진태양일은 태양을 기준으로, 바꾸어 말하면 태양에서 지구를 봤을 때 도는 횟수를 말합니다. 우리가 달의 모습을 보는 것과 같은 원리이죠. 반면 항성일은 태양이 기준이 아닌 제3자의 입장에서 볼 때 실제 지구가 도는 횟수를 말합니다.

따라서 지구와 달의 관계를 생각하면 금방 알 수 있지요. 즉 달은 지구 둘레를 한번 공전할때 1번 자전하지요, 우리가 볼 때는(진태양일 기준) 자전하지 않는 것 처럼 보이지만 실제 제3자의 입장(항성일)에서 보면 시간이 지날수록 항상 다른 면을 보게 되지요, 즉 1번 공전할 때 1번 자전합니다. 따라서 365.5 에 +1 하면 실제 지구 자전회수가 됩니다.

달이 실제로 한번도 자전하지 않는다면 우리가 볼 때는 한번 자전하는 것처럼 보입니다. (자전거 패달이나 멧돌이 돌아가는 것을 생각하면됨)


>
>*퀴즈2)
>2월이 짧고, 7월과 8월이 긴 까닭은?
>답해주신 내용중에 있는 것 같네요.
>
>http://kin.naver.com/browse/db_detail.php?dir_id=6&docid=51385
>--------------------------------
>우리가 사용하고 있는 것은 동양에서 사용하던 음력이 아니라 서양에서 사용하던 양력입니다.

>다 아시는 내용이지만, 하루를 24시간으로 정하고,
>1년을 365일로 정했지만, 지구의 자전 속도와 공전 속도는 이렇든 정확하게 맞아 떨어지는 것이 아닙니다.
>동양에서는 1년을 360일로 치고, 각 달을 30일로 해서 사용을 했고,
>이렇게 했을 때 생기는 차이를 없애기 위해서 윤달이란 것이 생겼습니다.
>음력을 보시면 아시겠지만, 몇 년마다 윤 X월이란 것이 있습니다.
>양력에서는 이러한 현상을 없애기 위해서 생긴 것이 바로 2월 29일 입니다.
>
>즉, 일반적인 해에는 2월에 28일까지만 배치를 했다가 그 차이가 누적이 되면 한꺼번에 맞추기 위해서 하루를 더 만든 것입니다.
>
>그리고, 왜 2월 달만 짧은지를 물으셨는데, 반면 7월과 8월은 둘 다 31일씩 존재를 합니다.

>2월을 제외한 다른 달은 번갈아 가면서 30일과 31일이 있는데 유독 7월과 8월만 계속적으로 31일씩 있습니다.
>이는 양력의 기원이 로마에서 생겼기 때문입니다.
>달에 대한 호칭 중 7월과 8월은 로마의 초대 황제와 그 다음 황제의 이름을 따서 지었는데,

>초대 황제는 잘 아시는 율리우스 시저입니다. 그래서 생긴 것이 7월입니다.
>8월은 아우구스티누스의 이름을 따서 만든 것이구요.
>하지만, 원래대로라면 8월은 30일이 되어야 하는데,
>후세의 사람이 아우구스티누스의 업적에 맞지 않는다 생각해서 2월에서 하루를 빼어서 8월로 옮긴 것입니다.
>그런 후에 나머지를 다시 조정을 한 것이죠.
>------------------------------

맞게 찾으셨네요.

http://www-ph.postech.ac.kr/~obs/lecture/lec1/elementary/eqntime.gif
http://www-ph.postech.ac.kr/~obs/lecture/lec1/elementary/nakedeyb.htm

위의 그림을 보면, 2월 달에서 진태양시가 가장 짧습니다.
즉 하루길이가 가장 짧습니다.

실제 그레고리오역(우리가 사용하는 태양태음력)은 평균태양일이지만
진태양일에 어느 정도 맞추다 보니 2월을 짧게 할 수밖에 없습니다.

8월이 아우구스티누스의 생일이 있는 달이라고 하네요.
그래서 30일을 31로...

이런 퀴즈를 내는 이유는 바로 24절기와 관련이 있기 때문입니다. 위의 그림에서, 가로축의 24시간대를 직선으로 동일한 속도로 이동하는 것이 평균태일이고 우리가 사용하는 시간을 말합니다.

반면 진태양일은 곡선을 따라서 불규칙한 속도로 이동하는 것을 말합니다.(술취한 사람이 집을 찾아가는 것과 같은 원리?)

이 곡선에 24개의 점(절기)를 찍어야 하는데, 각지점의 속도가 다르므로 이 곡선에 직접 찍기는 어렵고, 황도곡선(?)을 그려야 합니다.(가능하는지 모르겠지만) 좀 어렵죠?.... 그것도 15도 간격으로 24개를 찍어야 하므로,,,
이것 말고 실제 황도좌표와 위의 그림을 기준으로 설명해야 하는데
제가 좀 실력이 못되어서...

Posted by 무중 이승수 지지닷컴

댓글을 달아 주세요