読者です 読者をやめる 読者になる 読者になる

Rubyでお遊び

 Rubyで少し遊んでみる.

あまり複雑な事はしたくないため,無難に円周率を求めてみた.

試したのは,arctan(x)をテイラー展開したのとarcsin(x)をテイラー展開した数式を使ってみた.

 arctan(x)=tとおく.xで微分すると,
d(arctan(x)) / dx = dt / dx
 = 1 / (dx / dt)
tan(t) = xであるため,
d(arctan(x)) / dx = 1 / ( 1 + tan(t)2)
= 1 / ( 1 + x2 )

無限等比級数の和( 1 + z + z2 + z3 + ・・・ = 1 / ( 1 - z  ) に z = -x2 を代入して得られる式 )から
d(arctan(x)) / dx = 1 - x2 + x4 - x6 + ・・・

x = 0 を代入
d(arctan(x)) / dx = 1

上を繰り返しxで微分し,x = 0 を代入すると
d2(arctan(x)) / dx2 = -2x + 4x3 - 6x5 + ・・・
d3(arctan(x)) / dx3 = -2 +12x2 - 30x4 + ・・・
d4(arctan(x)) / dx4 = 24x - 90x3 + ・・・
d5(arctan(x)) / dx5 = 24 - 270x2 + ・・・

よって,

arctan(x) = x - 2x/ 3! + 24x/ 5! - ・・・
arctan(x) = x - x/ 3 + x/ 5 - ・・・

この式に x = 1 を代入する事により下式が得られる.
arctan(1) = π/4 = 1 - 1 / 3 + 1 / 5 - ・・・( (-1)n / ( 2n + 1 ) )x2n+1・・・

この式をRubyで書いてみた.

num = 0
pai = 0
 
while num <= 10**6 do
pai += ( -1 ) ** num / ( 2.0 * num + 1 ) * 4
print( pai, "\n" )
num += 1
end

因みにこの式は,なかなか収束しない.106回計算してやっと小数点以下6桁まで求める事ができる.

Luaでも書いてみた.

num, pai = 0, 0.0
 
while (num <= 10^6 ) do
pai = ( -1 )^num / ( 2 * num + 1 ) * 4 + pai
print( pai )
num = num + 1
end


 
次はarcsin(x)のテイラー展開
これは,下式が得られる.

π / 6 = Σn=0 (2n)! / ( 24n+1(n!)2(2n+1) )

同じようにRubyで書くと

class Calc
def initialize()
@num = 1
end
 
def factorial( pow )
@num = 1
while 0 < pow do
@num *= pow
pow -= 1
end
 
return @num
end
end
 
calc = Calc.new()
num = 0
pai = 0
 
while num <= 10
fac_1 = calc.factorial( 2 * num )
fac_2 = calc.factorial( num )**2
pai += ( fac_1 / ( 2**( 4 * num + 1 ) * fac_2 * ( 2.0 * num + 1 ) ) ) * 6
print( pai, "\n" )
num += 1
end

この式は上の arctan(x) の式と比べ,収束が速い.このプログラムは10回までしか計算していないが,小数点以下6桁を求める事ができる.
計算回数を増やすともっと精度の良い円周率を求めることができるだろうが,100回ぐらい計算するとNaNが出力される.
 
・・・円周率5兆桁なんてどうやったんだろ?(´・ω・`)
  並列演算にもいつか挑戦してみよう.