C++でシンプソンの3/8則を実装する方法|数値積分プログラムの解説
シンプソンの3/8則とは
シンプソンの3/8則(Simpson's 3/8 rule)は、数値積分を行うための手法の一つです。最も一般的な用途は定積分の数値近似であり、積分区間を3の倍数に等分割し、各区間を三次曲線(三次多項式)で近似することで積分値を求めます。
この手法では、隣接する3つの小区間ごとに4つの点を通る三次曲線を用いて近似を行うため、区間の分割数は必ず3の倍数である必要があります。
計算式
シンプソンの3/8則の公式は次の通りです。
∫ab f(x)dx ≒ (3h/8) × [f(a) + 3f(a+h) + 3f(a+2h) + 2f(a+3h) + … + 3f(b−h) + f(b)]
ここで、h = (b − a) / n は区間幅、n は3の倍数の分割数です。内部の点のうち、3の倍数番目の点には係数2が、それ以外の点には係数3が掛けられます。
サンプルコード
#include<iostream>
using namespace std;
//被積分関数の定義
float func_inte( float x){
return (1 / ( 1 + x * x ));
}
//近似値を計算する関数
float func_calculate(float lower_limit, float upper_limit, int interval_limit ){
float value;
float interval_size = (upper_limit - lower_limit) / interval_limit;
float sum = func_inte(lower_limit) + func_inte(upper_limit);
for (int i = 1 ; i < interval_limit ; i++) {
if (i % 3 == 0)
sum = sum + 2 * func_inte(lower_limit + i * interval_size);
else
sum = sum + 3 * func_inte(lower_limit + i * interval_size);
}
return ( 3 * interval_size / 8 ) * sum ;
}
int main(){
int interval_limit = 8;
float lower_limit = 1;
float upper_limit = 8;
float integral_res = func_calculate(lower_limit, upper_limit, interval_limit);
cout << integral_res << endl;
return 0;
}コードの解説
- func_inte:被積分関数 f(x) = 1/(1 + x²) を定義しています。
- func_calculate:区間幅 h を求め、両端点の関数値を合計に加えた後、内部の点をループで処理します。インデックス i が3の倍数のときは係数2、それ以外は係数3を乗じて加算し、最後に (3h/8) を掛けて積分の近似値を返します。
- main:積分区間 [1, 8]、分割数 8 を指定して計算を実行し、結果を標準出力します。
出力結果
0.663129
まとめ
このプログラムでは、f(x) = 1/(1 + x²) を区間 [1, 8] で8分割して数値積分し、約 0.663129 という結果を得ました。シンプソンの3/8則は、分割数を増やすことで近似精度を向上させることができますが、分割数は必ず3の倍数にする必要がある点に注意してください。
-
C++でAVL木(AVLツリー)を実装する方法:回転操作とサンプルコードを徹底解説
AVL木とは AVL木(AVL Tree)は、自己平衡型二分探索木(Self-balancing Binary Search Tree)の一種です。すべてのノードにおいて、左部分木と右部分木の高さの差が「1以下」に保たれるという性質を持っています。この平衡条件により、木が片側に偏って成長することを防ぎ、検索・挿入・削除といった操作を常に効率的(O(log n))に行うことができます。 木の回転(Tree Rotation)とは 木の回転とは、要素の順序(ソート順)を崩すことなく木の構造を変更する操作のことです。あるノードを一段上へ移動させ、別のノードを一段下へ移動させることで実現されます。 回
-
【C++】STLのset_symmetric_differenceで集合の対称差を実装するプログラム
本記事では、C++の標準テンプレートライブラリ(STL)に含まれる set_symmetric_difference 関数を使って、2つの集合の「対称差」を求めるプログラムを紹介します。 対称差とは、2つの集合のうち「どちらか一方にだけ存在し、両方には存在しない」要素から構成される集合のことです。 主な集合演算の種類 和集合(Union):どちらか一方に含まれるすべての要素 積集合(Intersection):両方に共通して含まれる要素 対称差(Symmetric Difference / 排他的論理和 XOR):片方にのみ含まれる要素 差集合(Difference / 減算):一方から他方