Up 1日の長さを求める計算 作成: 2020-11-01
更新: 2020-11-05


    問題: 公転角度 \( \tau_0 \) で,緯度aの地点Pが正午であったとする。
       Pがつぎの正午になるまでの時間は?

    公転角度 \( \tau_0 \) での Pの経度を \( b_0 \) とする。
    これは正午の経度であるから, \[ (b_0)_c = \frac{ a_s \ n_s \ (\tau_0)_s \ \tau_c + n_c (\tau_0)_s \sqrt{(a_c)^2 - (n_s)^2 ((\tau_0)_s)^2}}{ a_c \ (1 - (n_s)^2 ((\tau_0)_s)^2) } \]   ( 正午の座標 )

    Pがつぎの正午になるまでの時間──「1日の長さ」──をdとする。

    自転角速度を \( \omega_d \),公転角速度を \( \omega_y \),とすると,
    d後のPの経度bは, \[ b = b_0 + ( \omega_d \times d - 2 \pi ) \ \ ( mod \ 2 \pi ) \] そしてd後の公転角度 \( \tau \) は, \[ \tau = \tau_0 + \omega_y \times d \ \ ( mod \ 2 \pi ) \] また,bは正午の経度であるから, \[ b_c = \frac{ a_s \ n_s \ \tau_s \ \tau_c + n_c \tau_s \sqrt{(a_c)^2 - (n_s)^2 (\tau_s)^2}}{ a_c \ (1 - (n_s)^2 (\tau_s)^2) } \\ \ \\ \] dは,以上の式を方程式とする解である。
    しかしこのdは,式変形によって求めることはできない。
    コンピュータ計算で適正値を絞り込んでいく,というやり方でいくほかない。
    即ち,以下のように:


    地球の自転角速度と公転角速度は:
      自転角速度 = 7.272 × 10−5 rad/s = 0.2618 rad/h
      公転角速度 = 1.991 × 10−7 rad/s = 7.168 × 10−4 rad/h

    Pは,つぎの正午まで,自転軸の周りを1回転と少し回転する:
    1回転したとき,Pの経度は \( b_0 \)。
    1回転にかかった時間は,
        3.1416 × 2 ÷ 0.2618 = 24.0 h

    24.0 h から 0.001 h ずつ増やして,
      Pの経度 ≒ 正午の経度
    となる 0.001 × n を求める。

    ( 0.001 × n ) h 経過したときの Pの経度 \( b_1 \) は, \[ b_1 = b_0 + 0.2618 \times ( 0.001 \times n ) \\ \] そして,( 0.001 × n ) h 経過したときの正午の経度bは, \[ b_c = \frac{ a_s \ n_s \ \tau_s \ \tau_c + n_c \tau_s \sqrt{(a_c)^2 - (n_s)^2 (\tau_s)^2}} { a_c \ (1 - (n_s)^2 (\tau_s)^2) } \\ \ \\ \tau = \tau_0 + ( 7.168 \times 10^{-4} ) \times ( 24.0 + ( 0.001 \times n ) ) \\ \] そこでつぎが, 「Pの経度(b1) ≒ 正午の経度(b)」を求めるプログラムになる (言語は PHP):
      $n_deg = 23.4; $n = deg2rad( $n_deg ); $n_s = sin( $n ); $n_c = cos( $n ); $a_deg = (入力); $a = deg2rad( $a_deg ); $a_s = sin( $a ); $a_c = cos( $a ); $t_0_deg = (入力); $t_0 = deg2rad( $t_0_deg ); $t_0_s = sin( $t_0 ); $t_0_c = cos( $t_0 ); $b_0_c = ( $a_s * $n_s * $t_0_s * $t_0_c + $n_c * $t_0_s * sqrt( pow( $a_c, 2 ) - pow( $n_s, 2 ) * pow( $t_0_s, 2 ) ) ) / ( $a_c * (1 - pow( $n_s, 2 ) * pow( $t_0_s, 2 ) ) ); $b_0 = acos( $b_0_c ); $w = 1; for( $i = 1; $i < 100; $i++ ) { $b_1 = $b_0 + 0.2618 * ( 0.001 * $i ); $t = $t_0 + ( 7.168 * pow(10, -4) ) * ( 24.0 + ( 0.001 * $i ) ); $t_s = sin( $t ); $t_c = cos( $t ); $b_c = ( $a_s * $n_s * $t_s * $t_c + $n_c * $t_s * sqrt( pow( $a_c, 2 ) - pow( $n_s, 2 ) * pow( $t_s, 2 ) ) / ( $a_c * (1 - pow( $n_s, 2 ) * pow( $t_s, 2 ) ) ); $b = acos( $b_c ); /* 場合によっては,さらに $b = 2 * pi() - $b; */ $w1 = abs( $b_1 - $b ); if( $w1 < $w ){ $n = $i; $w = $w1; } elseif( $w1 > $w ){ break; } } print " n = ".$n;


    例1
    緯度50度の地点Pが,夏至に正午であったとする。
    Pがつぎの正午になるまでの時間は?

      n = 92 が得られる。
      よって,24.0 + 0.001 × 92 = 24.092 (h)

    例2
    緯度50度の地点Qが,秋分に正午であったとする。
    Qがつぎの正午になるまでの時間は?

      n = 71 が得られる。
      よって,24.0 + 0.001 × 71 = 24.071 (h)