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
立成の初期化
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) ⇒ 区間の始めからの経過日数, ...
月行遅速
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) ⇒ 区間の始めの冬至からの経過日数, 朓朒数
日行盈縮
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 |