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 + x
2 )
無限等比級数の和( 1 + z + z
2 + z
3 + ・・・ = 1 / ( 1 - z ) に z = -x
2 を代入して得られる式 )から
d(arctan(x)) / dx = 1 - x
2 + x
4 - x
6 + ・・・
x = 0 を代入
d(arctan(x)) / dx = 1
上を繰り返しxで微分し,x = 0 を代入すると
d
2(arctan(x)) / dx
2 = -2x + 4x
3 - 6x
5 +
・・・
d
3(arctan(x)) / dx
3 = -2 +12x
2 - 30x
4 + ・・・
d
4(arctan(x)) / dx
4 = 24x - 90x
3 + ・・・
d
5(arctan(x)) / dx
5 = 24 - 270x
2 + ・・・
よって,
arctan(x) = x - 2x
3 / 3! + 24x
4 / 5! - ・・・
arctan(x) = x - x
3 / 3 + x
4 / 5 - ・・・
この式に x = 1 を代入する事により下式が得られる.
arctan(1) = π/4 = 1 - 1
/ 3 + 1
/ 5 - ・・・( (-1)
n / ( 2n + 1 ) )x
2n+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
因みにこの式は,なかなか収束しない.10
6回計算してやっと小数点以下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)! / ( 2
4n+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兆桁なんてどうやったんだろ?(´・ω・`)
並列演算にもいつか挑戦してみよう.
PR