2019.06.21

数学

円周率πを計算で求める その1

円周率πを計算で求める方法を紹介します。

ここで紹介するアルゴリズムは、単位円を小さく分割した台形で近似し、それら台形の面積合計円周率πを求めるものです。

円の面積は、

(半径×半径×円周率π)

で求められるので、単位円(半径1の)の面積は、

(1×1×円周率π)=円周率π

となります。

よって、単位円面積の計算をすることで円周率πを求めることができます。

単位円の面積=円周率

ここからは、単位円面積を計算する方法を説明していきます。

単位円の右上1/4を台形(一番上は三角形)に分割します。このとき台形の高さを全て同じにします。

下図の例は、単位円の右上1/4を2つの台形に分割した例です。

オレンジ色で塗りつぶされている部分が台形の範囲です。2つの台形に分割しているので、それぞれの台形の高さは0.5です。

単位円の分割(y方向に2分割)

以下の例は、単位円の右上1/4を4つの台形に分割した例です。

4つの台形に分割しているので、それぞれの台形の高さは1を4で割った0.25になります。

単位円の分割(y方向に4分割)

このオレンジ色で塗られた部分の面積を計算し、それを4倍した値を円周率πとします。

分割する数を増やすとオレンジ色で塗られた部分の形が、単位円に近づいていきます。

そして、それは台形の面積合計値が、単位円の1/4の面積に近づくことを意味しています。

Javaソースコード

以下は、円周率πを計算するJavaソースコードです。

CalcPI1.java

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
public class CalcPI1 {
	// πを計算するメソッド
	public static double getPI_1( int yn )
	{
		double upperbase;	// 台形の上底
		double lowerbase;	// 台形の下底
		double height;		// 台形の高さ
		double lowery;		// 台形の下底の座標
		double area;		// 円の面積
		double aread;		// 台形の面積

		// 台形の高さ(円の半径をynで割る)
		height = 1.0 /  (double)yn;

		// 上底の初期値
		upperbase = 0.0;

		// 下底のy座標の初期値
		lowery = 1.0 - height;

		// 計算開始
		area = 0.0;
		for ( int i = 0; i < yn; ++ i ) {
			// 下底の計算
			lowerbase = Math.sqrt( 1.0 - lowery * lowery );

			// 台形の面積計算
			aread = ( upperbase + lowerbase ) * height / 2.0;

			// 円の面積に台形の面積を足す
			area += aread;

			// 下底を上底に代入
			upperbase = lowerbase;

			// 下底のy座標からheightを引く
			lowery -= height;
		}

		// 1/4円の面積を4倍
		area = area * 4.0;

		// 結果を戻す
		return area;
	}


	public static void main( String[] args ) {
		// yの分割数
		int yn;

		// 1000分割
		yn = 1000;
		System.out.println( "分割数:" + yn+ "     π=" + getPI_1( yn ) );

		// 10000分割
		yn = 10000;
		System.out.println( "分割数:" + yn+ "    π=" + getPI_1( yn ) );

		// 100000分割
		yn = 100000;
		System.out.println( "分割数:" + yn+ "   π=" + getPI_1( yn ) );

		// 1000000分割
		yn = 1000000;
		System.out.println( "分割数:" + yn+ "  π=" + getPI_1( yn ) );

		// 10000000分割
		yn = 10000000;
		System.out.println( "分割数:" + yn+ " π=" + getPI_1( yn ) );
	}
}

コンパイル ソースコードが「ANSI」の場合

C:\talavax\javasample>javac -encoding sjis CalcPI1.java

コンパイル ソースコードが「UTF-8」の場合

C:\talavax\javasample>javac CalcPI1.java

実行

C:\talavax\javasample>java CalcPI1

出力結果

分割数:1000     π=3.1415554669110293
分割数:10000    π=3.1415914776112435
分割数:100000   π=3.141592616398606
分割数:1000000  π=3.1415926524339723
分割数:10000000 π=3.1415926531488605

分割数を大きくするとπの計算値が、実際のπの値に近づいています。

実際の円周率πは、

3.141592653589793238462・・・

です。分割数を1000000にすると小数点以下第9桁まで一致しました。

Javaソースコードの解説

001
public class CalcPI1 {

クラス名を、CalcPI1としています。

002
003
	// πを計算するメソッド
	public static double getPI_1( int yn )

円周率πを計算するメソッドです。int型変数ynは分割数で、計算する台形の個数を表します。

005
006
007
008
009
010
		double upperbase;	// 台形の上底
		double lowerbase;	// 台形の下底
		double height;		// 台形の高さ
		double lowery;		// 台形の下底の座標
		double area;		// 円の面積
		double aread;		// 台形の面積

計算に使用する変数を宣言しています。

012
013
		// 台形の高さ(円の半径をynで割る)
		height = 1.0 /  (double)yn;

半径1.0を変数ynで割って台形の高さを計算し、double型変数heightに代入しています。

015
016
		// 上底の初期値
		upperbase = 0.0;

最初に計算する台形の上底に0.0を代入しています。このプログラムでは、上から下に向けて台形の面積を計算していきます。

018
019
		// 下底のy座標の初期値
		lowery = 1.0 - height;

初期の下底y座標変数loweryに代入しています。上底y座標は1.0なので、下底y座標は1.0から高さheightを引いた値になります。

021
022
023
		// 計算開始
		area = 0.0;
		for ( int i = 0; i < yn; ++ i ) {

ここから台形の面積を、指定した分割数yn回計算していきます。そして、変数areaに台形の面積を足して行きます。変数areaの初期値は0.0です。

024
025
			// 下底の計算
			lowerbase = Math.sqrt( 1.0 - lowery * lowery );

下底y座標loweryから、下底を計算しています。

下底y座標loweryを持つ単位円上のプラスのx座標になるので、12=lowery2+lowerbase2を満たすlowerbase下底となります。

027
028
			// 台形の面積計算
			aread = ( upperbase + lowerbase ) * height / 2.0;

上底下底と高さで台形の面積を計算して変数areadに代入しています。

030
031
			// 円の面積に台形の面積を足す
			area += aread;

変数areaに台形の面積areadを足しています。

033
034
			// 下底を上底に代入
			upperbase = lowerbase;

下底上底に代入しています。計算した台形の下底が、次に計算する台形の上底になるためです。

036
037
			// 下底のy座標からheightを引く
			lowery -= height;

下底y座標loweryから高さheightを引いています。

040
041
		// 1/4円の面積を4倍
		area = area * 4.0;

for文を抜けると、変数areaには単位円の四分の一の面積が格納されています。変数areaに4を掛けて単位円全体の面積を求めます。

043
044
		// 結果を戻す
		return area;

return文で、単位円面積areaを戻します。

048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
	public static void main( String[] args ) {
		// yの分割数
		int yn;

		// 1000分割
		yn = 1000;
		System.out.println( "分割数:" + yn+ "     π=" + getPI_1( yn ) );

		// 10000分割
		yn = 10000;
		System.out.println( "分割数:" + yn+ "    π=" + getPI_1( yn ) );

		// 100000分割
		yn = 100000;
		System.out.println( "分割数:" + yn+ "   π=" + getPI_1( yn ) );

		// 1000000分割
		yn = 1000000;
		System.out.println( "分割数:" + yn+ "  π=" + getPI_1( yn ) );

		// 10000000分割
		yn = 10000000;
		System.out.println( "分割数:" + yn+ " π=" + getPI_1( yn ) );
	}

分割数を変えて、円周率πを計算した結果を表示しています。

以上です。

関連コンテンツ

数学に関係するJavaのメソッドやソースコードなどを紹介しています。

2022.10.25

面積について詳しく解説しています。いろいろな図形の面積計算のリンク付き。

2019.10.7

三角形、台形、円などいろいろな図形の面積を計算するプログラムを紹介しています。詳しくは、記事をご覧ください。

2021.05.18

円の直径と半径について図を使って詳しく解説しています。

2020.03.23

プログラミングで使う変数って何?

2020.03.23

変数やクラスに格納されている値をコンソール出力する方法は?

2020.03.23

台形の面積を計算する方式を使って面積を計算する方法を説明しています。Javaのソースコードと図を使って計算方法をくわしく解説しています。

2020.03.23

処理を繰り返すために使用するfor文について解説しています。

2020.03.23

基本的な計算である足し算(加法)/引き算(減法)/掛け算(乗法)/割り算(除法)を行うプログラム作成。

2020.03.23

Javaの学習に役立つソースコードを多数紹介しています。是非、ご覧ください。

2022.09.10

Javaを使った簡単な応用プログラム(生年月日から年齢を計算プログラムなど)を紹介しています。

2022.07.07

画像フォーマット形式・色・大きさ・傾きなどの変更、特定の図形(文字・記号など)を見つけたり、取り出したりする画像処理について詳しく解説。

2015.11.29

プログラミング、ITに関する用語をまとめています。

2022.10.17

メソッドを抜けるときに使用するreturn文について説明しています。

2020.03.20

プログラムの最初に実行されるメソッドは?

2022.12.13

Javaのプログラムを書いてみませんか?プログラムの書き方をくわしく説明しています。

2020.03.23

「Javaソースコード」から実行可能な「オブジェクトコード」に変換する方法をくわしく説明しています。

2020.03.23

円周率、πってどうゆう意味?

2020.03.23

複数の数値の合計値と平均値を計算するプログラムをJavaのソースコードを使って解説しています。

2020.03.23

単位円の意味をくわしく解説しています。

2020.03.23

円の面積を計算する公式を使って、円の面積を計算する方法を説明しています。記事でくわしく説明しています。興味のある方は、ご覧ください。

2020.03.23

三角形って何?

2022.07.26

プログラミング言語とは?種類や特徴について説明しています。

2022.08.03

Javaプログラムの構成について解説しています。詳しくは、こちらをご覧ください。

2020.03.23

メソッドの定義方法を詳しく解説しています。Javaのサンプルソースコードを使った説明もあります。

2020.03.23

for文で変数名iがよく使われる理由について説明しています。興味のある方は是非。

2022.08.29

平面上の位置を表す座標系の1つXY座標系について詳しく解説。

2020.03.23

広告