Module: When::Ephemeris::ChineseTrueLunation::TangMethods
Overview
唐代のアルゴリズム
Instance Method Summary collapse
-
#_initialize_rissei ⇒ Object
立成の初期化.
-
#_rissei_a(k) ⇒ Object
太陽の立成 - 戊寅元暦 1次補間.
-
#_rissei_b(k) ⇒ Object
太陽の立成 - 儀鳳暦.
-
#_rissei_c(k) ⇒ Object
太陽の立成 - 宣明暦 2次補間.
-
#_rissei_m(i, sum) ⇒ Object
月の立成 - 月の遅速表の生成 一行分 [変日差, 損益率] ↓ [変日(区間の終わりの遠/近地点からの経過日数), 区間の終わりの朓朒積, 区間の変日差/日, 区間の損益率].
-
#_tv_m(t) ⇒ 区間の始めからの経過日数, ...
月行遅速.
-
#_tv_s(i) ⇒ 区間の始めの冬至からの経過日数, 朓朒数
日行盈縮.
Instance Method Details
#_initialize_rissei ⇒ Object
立成の初期化
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) ⇒ 区間の始めからの経過日数, ...
月行遅速
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) ⇒ 区間の始めの冬至からの経過日数, 朓朒数
日行盈縮
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 |