天体の位置計算用モジュール
回転(2次元)
x : x 座標 y : y 座標 t : 回転角 / CIRCLE returns : [x, y] x : x 座標 y : y 座標
# File when/ephemeris.rb, line 204 204: def _rot(x, y, t) 205: c, s = cosc(t), sinc(t) 206: return [x*c - y*s, x*s + y*c] 207: end
直交座標→極座標(2次元)
x : x 座標 y : y 座標 returns : [ll, rr] ll : 経度 / CIRCLE rr : 距離
# File when/ephemeris.rb, line 188 188: def _to_p2(x, y) 189: return [0.0, 0.0] if x==0 && y==0 190: return [atan2(y,x)/CIRCLE, sqrt(x*x+y*y)] 191: end
直交座標→極座標(3次元)
x : x 座標 y : y 座標 z : z 座標 returns : [x, y, z] ll : 経度 / CIRCLE tb : 緯度 / CIRCLE rr : 距離
# File when/ephemeris.rb, line 172 172: def _to_p3(x, y, z) 173: ll, rr = _to_p2(x, y) 174: tb, rr = _to_p2(rr, z) 175: return [ll, tb, rr] 176: end
極座標→直交座標(3次元)
ll : 経度 / CIRCLE tb : 緯度 / CIRCLE rr : 距離 returns : [x, y, z] x : x 座標 y : y 座標 z : z 座標
# File when/ephemeris.rb, line 155 155: def _to_r3(ll, tb, rr) 156: c, s = cosc(tb), sinc(tb) 157: return [rr*c*cosc(ll), rr*c*sinc(ll), rr*s] 158: end
arc cos / radian
# File when/ephemeris.rb, line 109 109: def acos(x) 110: atan2(sqrt(1-x*x), x) 111: end
arc sin / radian
# File when/ephemeris.rb, line 104 104: def asin(x) 105: atan2(x, sqrt(1-x*x)) 106: end
円周単位のcos
# File when/ephemeris.rb, line 129 129: def cosc(x) 130: cos(x * CIRCLE) 131: end
度のcos
# File when/ephemeris.rb, line 114 114: def cosd(x) 115: cos(x * DEG) 116: end
Δε
c : 2000年からの経過世紀 returns : 緯度の章動 / CIRCLE
# File when/ephemeris.rb, line 233 233: def delta_e(c) 234: trigonometric(c, 235: [[COS , 125.04 , 1934.136 , 0.00256 ], 236: [COS , 200.93 , 72001.539 , 0.00016 ]]) / 360 237: end
Δφ
c : 2000年からの経過世紀 returns : 経度の章動 / CIRCLE
# File when/ephemeris.rb, line 246 246: def delta_p(c) 247: trigonometric(c, 248: [[SIN , 125.04 , 1934.136 , 0.00478 ], 249: [SIN , 200.93 , 72001.539 , 0.00037 ]]) / 360 250: end
2000年元期の dynamical_time / ユリウス世紀
tt : ユリウス日(Terrestrial Time)
# File when/ephemeris.rb, line 223 223: def julian_century_from_2000(tt) 224: return (tt - EPOCH4) / JCENT 225: end
時間の単位の換算
1975年元期の dynamical_time / ユリウス年 tt : ユリウス日(Terrestrial Time)
# File when/ephemeris.rb, line 215 215: def julian_year_from_1975(tt) 216: return (tt - EPOCH3) / JYEAR 217: end
黄道傾角
c : 2000年からの経過世紀 returns : 黄道傾角 / CIRCLE
# File when/ephemeris.rb, line 259 259: def obl(c) 260: return (23.43929 + 0.013004*c + 1.0*delta_e(c)) / 360 261: end
多項式
t : Numeric 独立変数 equ : [Numeric] 係数の Array
# File when/ephemeris.rb, line 70 70: def polynomial(t, equ) 71: equ.reverse.inject(0) {|sum, v| sum * t + v} 72: end
func の逆変換
t0 : 独立変数の初期近似値 y0 : 逆変換される関数値(nil なら極値を求める) func : 逆変換される関数 returns : 逆変換結果
# File when/ephemeris.rb, line 271 271: def root(t0, y0=nil, &func) 272: 273: # 近似値0,1 274: # printf("y0=%20.7f\n",y0) 275: t = [t0, t0+0.1 ] 276: y = [func.call(t[0]), func.call(t[1])] 277: # printf("t=%20.7f,L=%20.7f\n",t[1],y[1]) 278: 279: # 近似値2(1次関数による近似) 280: t << (y0 ? (t[1]-t[0])/(y[1]-y[0])*(y0-y[0])+t[0] : t0-0.1) 281: 282: # 繰り返し 283: i = 10 284: while ((t[2]-t[1]).abs > 1E-6) && (i > 0) 285: # 予備計算 286: y << func.call(t[2]) 287: break if y0 && (y[2]-y0).abs <= 1E-7 288: 289: # printf("t=%20.7f,L=%20.7f\n",t[2],y[2]) 290: t01 = t[0]-t[1] 291: t02,y02 = t[0]-t[2], y[0]-y[2] 292: t12,y12 = t[1]-t[2], y[1]-y[2] 293: 294: # 2次関数の係数 295: a = ( y02 / t02 - y12 / t12) / t01 296: b = (-y02*t12 / t02 + y12*t02 / t12) / t01 297: c = y[2] 298: 299: if y0 300: # 判別式 301: if (d = b*b-4*a*(c-y0)) < 0 302: i = 1 303: break 304: end 305: 306: # 近似値(2次関数による近似) 307: sqrtd = Math.sqrt(d) 308: sqrtd = -sqrtd if b < 0 309: t << (t[2] + 2*(y0-c)/(b+sqrtd)) # <-桁落ち回避 310: else 311: t << (t[2] - b / (2*a)) 312: end 313: 314: t.shift 315: y.shift 316: end 317: $stderr.puts "The result is not reliable" if i<=0 318: return t[2] 319: end
円周単位のsin
# File when/ephemeris.rb, line 134 134: def sinc(x) 135: sin(x * CIRCLE) 136: end
度のsin
# File when/ephemeris.rb, line 119 119: def sind(x) 120: sin(x * DEG) 121: end
円周単位のtan
# File when/ephemeris.rb, line 139 139: def tanc(x) 140: tan(x * CIRCLE) 141: end
度のtan
# File when/ephemeris.rb, line 124 124: def tand(x) 125: tan(x * DEG) 126: end
三角関数の和
t : Numeric 独立変数 equ : [Numeric] 係数の Array dl : Numeric 位相補正値(デフォルト 補正なし) count : Integer 打ち切り項数(デフォルト 打ち切りなし)
# File when/ephemeris.rb, line 86 86: def trigonometric(t, equ, dl=0.0, count=0) 87: t2 = t * t 88: equ[0..(count-1)].inject(0) do |sum, v| 89: op, epoch, freq, amp, sqr = v 90: ds = epoch + t * freq 91: if (op < 0) # 直線 92: ds += t2 * amp 93: else # 三角関数 94: ds += t2 * sqr if sqr 95: ds += dl if (op[2]==1) # delta L is exist 96: ds = amp * ((op[0]==1) ? cosd(ds) : sind(ds)) 97: ds *= t if (op[1]==1) # time proportional 98: end 99: sum += ds 100: end 101: end
Disabled; run with --debug to generate this.
Generated with the Darkfish Rdoc Generator 1.1.6.