Module: When::Ephemeris::ChineseTrueLunation::TangMethods

Included in:
MethodA, MethodC
Defined in:
lib/when_exe/region/chinese.rb

Overview

唐代のアルゴリズム

Instance Method Summary collapse

Instance Method Details

#_initialize_risseiObject

立成の初期化



138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
# File 'lib/when_exe/region/chinese.rb', line 138

def _initialize_rissei

  # 近点月
  @anomalistic_month_length =  @anomalistic_month_length.to_r

  # 計算式 C) のための繰り返し回数
  @repeat_count ||= @method.upcase == 'C' ? 2 : 1
  @repeat_count   = @repeat_count.to_i

  # 太陽の盈縮表の生成
  #   [先後數, 朓朒数, (立成b, 立成c)]
  #      ↓
  #   [区間の始めの冬至からの経過日数, 朓朒数, 立成b, 立成c]
  @s = @s.map {|item| item.dup}
  if @rissei # 立成の計算・比較
    puts "\n  ["+ @denominator.to_s + "]" if @rissei == @rissei.upcase
    (0...@s.size).each do |i|
      bc = send('_rissei_' + @rissei.downcase, i)
      @s[i] += bc if @s[i].size <= 2
      if @rissei == @rissei.upcase
        sq = (bc[0]-@s[i][2])**2 + (bc[1]-@s[i][3])**2
        puts '%9.1f,%5d,%9.4f,%8.4f,%6.2f' %
          (@s[i] + [sq == 0 ? -Float::INFINITY : Math.log(sq)/Math.log(100)])
      end
    end
  end
  (0...@s.size).each do |i|
    @s[i-1][1,0] = @year_length / @s.size + (@s[i][0]-@s[i-1][0]) / @denominator
  end
  (0...@s.size).each do |i|
    @s[i].shift
  end

  # 月の遅速表の生成
  @m  = @m.map {|item| item.dup}
  sum = [0,0]
  (0...@m.size).each do |i|
    @m[i]  = _rissei_m(i, sum)
  end
end

#_rissei_a(k) ⇒ Object

太陽の立成 - 戊寅元暦 1次補間



189
190
191
192
# File 'lib/when_exe/region/chinese.rb', line 189

def _rissei_a(k)
  tv = [0,1].map {|i| _tv_s(k+i)}
  [(tv[1][1]-tv[0][1]) / (tv[1][0]-tv[0][0]), 0.0]
end

#_rissei_b(k) ⇒ Object

太陽の立成 - 儀鳳暦



195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
# File 'lib/when_exe/region/chinese.rb', line 195

def _rissei_b(k)
  v =
    if k % 3 < 2
      t   = [0,1,2].map {|n| @s[(k+n) % @s.size][1]}
      t01 = t[1] - t[0]
      t12 = t[2] - t[1]
      (t01 + t12) / 2.0 + t01 - t12
    else
      t   = [-1,0,1].map {|n| @s[(k+n) % @s.size][1]}
      t01 = t[1] - t[0]
      t12 = t[2] - t[1]
      t02 = t[2] - t[0]
      t02 / 2.0
    end
  r = v < 0 ? 12.0/(17*11) : 12.0/(16*11)
  [v * r, (t12-t01) * r * r]
end

#_rissei_c(k) ⇒ Object

太陽の立成 - 宣明暦 2次補間



214
215
216
217
218
219
220
221
222
223
224
225
226
227
# File 'lib/when_exe/region/chinese.rb', line 214

def _rissei_c(k)
  i = [k, k+1, k+2, k % 6 == 5 ? -1 : 0]
  t0, v0 = _tv_s(i[0]+i[3])
  t1, v1 = _tv_s(i[1]+i[3])
  t2, v2 = _tv_s(i[2]+i[3])
  t01    = t1 - t0
  t02    = t2 - t0
  t12    = t2 - t1
  v01    = v1 - v0
  v02    = v2 - v0
  c      = (v02*t01 - v01*t02) / (t01*t02*t12) * 2
  b      = (v01 - t01*(t01-1)/2*c) / t01
  [b-t01*c*i[3], c]
end

#_rissei_m(i, sum) ⇒ Object

月の立成 - 月の遅速表の生成 一行分

[変日差, 損益率]
   
[変日(区間の終わりの遠/近地点からの経過日数), 区間の終わりの朓朒積, 区間の変日差/, 区間の損益率]


183
184
185
186
# File 'lib/when_exe/region/chinese.rb', line 183

def _rissei_m(i, sum)
  [0,1].each {|k| sum[k] += @m[i][k]}
  [sum[0] / @denominator, sum[1], @m[i][0] / @denominator, @m[i][1]]
end

#_tv_m(t) ⇒ 区間の始めからの経過日数, ...

月行遅速

Parameters:

  • t (Numeric)

    直前の遠/近地点からの経過日数

Returns:

  • (区間の始めからの経過日数, 区間の始めの朓朒積, 区間の変日差/日, 区間の損益率, 次の区間の損益率)


245
246
247
248
249
250
# File 'lib/when_exe/region/chinese.rb', line 245

def _tv_m(t)
  (0...@m.size).each do |i|
    next if t > @m[i][0]
    return [t - (@m[i][0] - @m[i][2]), @m[i][1] - @m[i][3], @m[i][2], @m[i][3], @m[(i+1) % @m.size][3]]
  end
end

#_tv_s(i) ⇒ 区間の始めの冬至からの経過日数, 朓朒数

日行盈縮

Parameters:

  • i (Integer)

    区間の番号

Returns:

  • (区間の始めの冬至からの経過日数, 朓朒数)


235
236
237
# File 'lib/when_exe/region/chinese.rb', line 235

def _tv_s(i)
  [@year_length * i / @s.size + @s[i % @s.size][0] / @denominator, @s[i % @s.size][1]]
end