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

立成の初期化



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
178
179
180
181
182
183
184
185
186
187
188
# File 'lib/when_exe/region/chinese.rb', line 149

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次補間



200
201
202
203
# File 'lib/when_exe/region/chinese.rb', line 200

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

太陽の立成 - 儀鳳暦



206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
# File 'lib/when_exe/region/chinese.rb', line 206

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)
 # 初率b, 別差c
  [v * r, (t12-t01) * r * r]
end

#_rissei_c(k) ⇒ Object

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



226
227
228
229
230
231
232
233
234
235
236
237
238
239
# File 'lib/when_exe/region/chinese.rb', line 226

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

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

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


194
195
196
197
# File 'lib/when_exe/region/chinese.rb', line 194

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:

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


257
258
259
260
261
262
# File 'lib/when_exe/region/chinese.rb', line 257

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:

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


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

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