二進数コードで弾き語り

情報系大学生の徒然技術ブログ。

【小ネタ】区分求積法でπの近似値を求めるアルゴリズム

 どうも、drumathです。今回はちょっとしたチップスとして、πの近似値を求めたいと思います。使用する言語はC++です。

数Ⅲ生の十八番

数Ⅲで積分をしていると、置換積分やらなんやらのおかげで一見関係なさそうなところで \piが出てきます。
今回はそんな積分の中から、受験生の十八番ともいえるやつを使います。


 \displaystyle
\begin{align}
\int_{0}^{1} \frac{1}{x^{2}+1} dx
\end{align}
について、 x=\tan \thetaと置くと

 \displaystyle
\begin{align}
x \to 0のとき、\theta \to 0、\\\
x \to 1のとき、\theta \to \frac{\pi}{4}
\end{align}
また、

 \displaystyle
\begin{align}
dx = \frac{1}{\cos^2 \theta}d\theta
\end{align}
となるので、

 \displaystyle
\begin{align}
\int_{0}^{1} \frac {1} {x^{2}+1} dx &=\int_{0}^{\frac {\pi} {4} } \frac{1}{\tan^{2} \theta + 1} \cdot \frac{1}{ \cos^{2} \theta} d\theta\\\
&= \int_{0}^{\frac {\pi} {4} } \frac{\cos^2 \theta}{\cos^2 \theta}d\theta\\\
&= \int_{0}^{ \frac {\pi} {4} } d \theta \\\
&= [ \theta ]_{0}^{\frac{\pi}{4}}\\\
&= \frac{\pi}{4}
\end{align}
となります。つまり、

 \displaystyle
\begin{align}
\pi = 4\int_{0}^{1} \frac{1}{x^2+1}dx
\end{align}
ということがわかりました。

区分求積法で近似する

ここで、区分求積法を用いると、


 \displaystyle
\begin{align}
4\int_{0}^{1} \frac{1}{x^2+1}dx=4\lim_{n \to \infty} \frac{1}{n} \sum_{k=1}^{n} \frac{1}{(\frac{k}{n})^2+1}
\end{align}
となることから、 nをだんだん大きくしていけば、 \piの近似値が求まるみたいです。

コードを書く

では先ほどの結果をもとにコードを書いてみました。

#include <stdio.h>
#include <math.h>

double pi_calc(double);

int main(void)
{
  for (int i = 1; i < 1000000; i++)
    printf("\r%d: %f", i, pi_calc((double)i));
  return 0;
}
// 区分求積法を用いたアルゴリズム
double pi_calc(double n)
{
  double res = 0;
  for (int k = 1; k <= n; k++)
    res += 1.0 / (1.0 + pow(((double)k / n), 2.0));
  return 4.0 * res / n;
}

 nを100万まで動かします。
コードでところどころdoubleを使っているのは、floatを使ってしまうと誤差補正のせいで値がぶれてしまうことを防ぐためです。

今回は以上になります。最後まで読んでいただき、ありがとうございました。