Machinの公式を使ってπを近似する
どうも、drumathです。前回の記事からだいぶ日が経ってしまいましたね。
というのも、大学生活が始まり、なかなか執筆に時間がさけなかったのが原因です。
今日は気分で少し書いてみようと思ったのですが、テーマがまたπの近似という結果になってしまいました…(許して)
Machinの公式でπを求める!
冒頭で、大学生活が始まったと述べましたが、約1か月前の解析学の授業をきっかけにこのテーマを書こうと思いまして、
実はその授業の先生がπの近似値の世界記録を持ってるらしく(詳しい話はよく知りませんが...)、そんな経緯からなのでしょうか、逆三角関数の話をしているときにMachinの公式を教えてくださいました。
そもそも、逆三角関数は(辺の比)→(角度)という写像なので、πが絡む公式はいくつかあるらしく、下記のようなものが授業では紹介されました。
実は、一番最後の「239!?」ってなるやつがMachinの公式です。
Machinの公式を示してみる
今からこの公式を使うわけですが、本当にこうなるのかとりあえず示します。
これには、
まず、Machinの公式の両辺の正接をとります。すると
πを計算するには
さて、証明ができたので、さっそく使っていきましょう
この公式を使ってどうやってπを求めるかというと、、、
積分だ!
待ってたぜぃって感じですが、どちらかというと積分は最後にちょこっとするだけで(というか積分ほぼやらないか…)、メインはマクローリン展開です。
まず、下の式を与えておきます。
これらがわかると下の式が導けますね。
おぉ、アークタンジェントがシグマで表せました!
ここで、
プログラム書いてみた
さて、本記事も終盤です。実際にプログラミングで近似します。
その前に、プログラムのイメージがしやすいように(?)上でやったf(x)をちょっと改変したg(x,n)を以下のように定義します。
gを使ってπを表すと、以下のようになります。
以下、私が書いたRubyのコードです。
def maclaurin(x, n) sum = 0.0 0.upto(n) do |k| sum += (-1.0)**k * x**(2.0 * k + 1.0) / (2.0 * k + 1.0) end sum end def machin(n) 4 * maclaurin(1.0 / 5.0, n) - maclaurin(1.0 / 239.0, n) end gets.chomp.to_i.times do |i| puts "#{i}: #{4 * machin(i)}" end
ちなみに、rubocopからは「引数名が短い!」って怒られてますw
破壊力ぅ...
どうしてMachinの公式がπの近似に使われるか。
それはこの公式の破壊力がすさまじいからです(語彙力)
なんとサンプル数(ここでいうn)を10にすると、もうRubyではこれ以上の近似はできません!
収束がめっちゃ早い。
0: 3.18326359832636 1: 3.1405970293260603 2: 3.1416210293250346 3: 3.1415917721821773 4: 3.1415926824043994 5: 3.1415926526153086 6: 3.141592653623555 7: 3.1415926535886025 8: 3.141592653589836 9: 3.1415926535897922 10: 3.141592653589794 11: 3.141592653589794 12: 3.141592653589794 13: 3.141592653589794 14: 3.141592653589794 15: 3.141592653589794
終わりに
今回、英語の宿題を残して爆速で記事を書きましたが、久しぶりに楽しかったです。
またヒマになったら記事を上げていこうともうので、よかったらご覧になってください。
最後まで読んでいただき、ありがとうございました~。