Other

春分の計算・秋分の計算

※「係数」「コーディング」について更新し、「履歴」を追加したが、「計算式」「解説」「適合性」「考察」「余談」については更新していないので、内容の食い違っている箇所がある。

計算式

y = ax - { int( x / 4 ) - int( x / 100 ) + int( x / 400 ) } + b
x :   西暦年を指定する正の整数
y :   春分または秋分 (JCST; +0900)
int( ) :   数値の整数部

係数

春分     a =
b =

秋分     a =
b =

※時刻は日本の中央標準時(JCST; Japanese Central Standard Time)なので、9時間=0.375日マイナスすると世界協定時(UTC)相当になる。

コーディング

(エクセル;セルA1に西暦年が入力されているとして)

春分

=INT((*A1)-(INT(A1/4)-INT(A1/100)+INT(A1/400))+)

秋分

=INT((*A1)-(INT(A1/4)-INT(A1/100)+INT(A1/400))+)

(C#)

int GetEquinox(double a, double b, int x)
{
  return (int)((a * x) - ((x / 4) - (x / 100) + (x / 400)) + b);
}

// 春分の計算; xは西暦年, 有効範囲は 1796~2351
int GetVernalEquinox(int x)
{
  return GetEquinox(, , x);
}

// 秋分の計算; xは西暦年, 有効範囲は 1856~2230
int GetAutumnalEquinox(int x)
{
  return GetEquinox(, , x);
}

解説

祝日のマスタを作ってカレンダーに反映させるようなことを考えていたが、春分の日・秋分の日については、前々から考えあぐねていた。結局、2月の官報で公表されるまで翌年の祝日が確定しないことはわかっているが、2年先、3年先のイベントのスケジュールを立てることがあったりして、予想であっても祝日がわからないと困るようだ。

fig.1
fig.1: 西暦1年の春分は0年の春分より a 後ろにずれる。2年、3年も同様。そして4年も後ろに a ずれるのだが、閏年は閏日によって3月以降の暦が1日後ろへずれるため、日付としては1日前になる。

計算式のモデルについて、a は1年で何日ずれるかを表わしていて、a に365を足すと1周あたりの日数になる。これは春分回帰年、秋分回帰年に相当する。

b は西暦0年=紀元前1年の春分または秋分の日時を意味する。

int( x / 4 ) - int( x / 100 ) + int( x / 400 ) 」の部分は、西暦1年から x 年までの閏日(うるうび)の日数で、幸いにして2月29日の閏日は3月20日頃の春分よりも前にあるので、春分の場合でも秋分の場合でも、その年の閏日を含むことができる。

政府の暦(こよみ)のページに、1955年からの二十四節季(にじゅうしせっき)の日時が載っているので、反復回帰で係数 ab を調べようとした。それで求められると思ったが、やってみるとうまくいかない。もしかしたら極小となるところがいくつかあるのではないかと思い、適当な範囲で状況を調べた。

fig.2
fig.2: 春分におけるデータ。値は S = ∑ ( y' - y )2 。色付けはExcelの「条件付き書式」を利用。 b を系列に見立て、3D折れ線グラフにした。

何となく小さくなる部分が斜めに走っている様子がわかる。それで今度はそれぞれの b に対して S が最小となるときの a を調べた。

fig.3
fig.3: 春分におけるデータ。b に対して S が最小となるときの aS 。グラフは bS との関係を表したもの。

何となく形が想像できる。全体は急峻な谷状になっていて、谷底はゆるやかな放物線状だと思う。闇雲に反復回帰しても、谷底を伝って下りてゆくのは難しかったようだ。放物線をモデルにして谷底の係数を求めた。

S = 0.00528124202481405 ( b - 20.920503261227 )2 + 0.00120151557304802

この式によれば、b = 20.920503261227 のとき、S が最小となる。そして、この b に対して S が最小となるときの a を調べた。a = 0.242382779227904

適合性

1955年から2017年までの63年間については、概ね15分以内の差異はあるものの、日付は官報のデータと一致する。

Wikipediaに載っている1600年から2399年までのデータとは、春分については1796年から2351年の範囲で、秋分については1856年から2292年の範囲で一致する。

考察

“何となく”でやってしまったが、全体的にはだいたい合っていると思う。ただ、細かく見れば極小部がいくつかあるかもしれないし、そもそも計算式のモデルがどれくらい正しいのか、どうすればわかるのだろう。グラフがすり鉢状ではなく谷状になっていることからして、どこかがおかしいような気もする。係数 a の箇所について、もう少し工夫する余地があるかもしれない。a を係数と考えたが、年ごとに変化しているかもしれない。結果は参考にとどめておくことにしよう。

グレゴリオ暦は、400年間に97の閏日を設けているので、計算では1年あたり365.2425日になる。a の値が近似していると思う。

官報に記載された二十四節季のデータは翌年のデータなので、実測ではなく1~2年先の予測となっていることに注意する。

春分を計算するときの係数 a = 0.242382779227904 と、秋分を計算するときの係数 a = 0.242015488922582 に僅差があることは、興味深い。この60年余りの傾向として、春分から次の春分までの長さ=春分回帰年より、秋分から次の秋分までの長さ=秋分回帰年のほうが、ほんの少し短かったことになる。地球が公転軌道を1周すると1年で、どこから測ったって1周は1周、1年は1年だろうにと思うのだが、きっと何かわけのわからないことがあるのだろう。

fig.4
fig.4: 春分・秋分が一定の角速度で少しずつずれてゆくような状況なら、春分回帰年と秋分回帰年の僅差も理解できるような気がする。想像でしかない。

余談

昭和64年と平成1年は同じ年。日本人ならきっと、紀元前1年と西暦1年も同じ年と思うだろうが、問屋さんはそのようには卸さない。キリスト様がご生誕あそばした年を元年とする紀元=西暦が復活祭暦表の記載に採用されたのは、西暦532年のことであったそうな。1年は1月1日から始まるので、たとえまだキリスト様が生まれていなくても、その年の1月1日から西暦1年ということらしい。

西洋でグレゴリオ暦が採用されたのは1582年。日本でグレゴリオ暦が採用されたのは1872年(明治5年)。西暦1年からグレゴリオ暦であったかのように錯覚していたが、案外歴史は浅かった。グレゴリオ暦は400年周期の暦で、採用されてから400年余り経っている。やっとひと回りしたところだ。あと1000年ぐらいはもってほしいと思う。

履歴

計算日 = 2016/02/25, データ範囲 = [1955:2017], n = 63

春分 係数: a = 0.242382779227904, b = 20.920503261227
   官報との比較: 日付はすべて一致, 概ね15分以内の誤差あり
   Wikipediaとの比較: 1796-2351で一致
   有効範囲: 1796-2351

秋分 係数: a = 0.242015488922582, b = 24.0622874902296
   官報との比較: 日付はすべて一致, 概ね15分以内の誤差あり
   Wikipediaとの比較: 1856-2292で一致
   有効範囲: 1856-2292
計算日 = 2017/04/26, データ範囲 = [1955:2018], n = 64

春分 係数: a = 0.242387295944576, b = 20.9115797338431
   官報との比較: 日付はすべて一致, 概ね15分以内の誤差あり
   Wikipediaとの比較: 1796-2351で一致
   有効範囲: 1796-2351

秋分 係数: a = 0.242022156035078, b = 24.0491154953035
   官報との比較: 日付はすべて一致, 概ね15分以内の誤差あり
   Wikipediaとの比較: 1856-2230で一致
   有効範囲: 1856-2230
(2016/02/26 初稿)
(2016/03/04 更新)
(2017/03/11 更新)
(2017/04/28 更新)