integ_gauss_legendre.py テクニカルドキュメント
プログラムの動作
integ_gauss_legendre.py は、ガウス・ルジャンドル求積法を用いて数値積分を実行するPythonプログラムです。このプログラムの主な目的は、指定された関数を特定の区間で数値的に積分し、その結果を解析解と比較することです。
具体的な機能は以下の通りです。
被積分関数の定義:
func(x)関数により、積分する関数が定義されています。デフォルトでは指数関数 \(f(x) = e^x\) が設定されていますが、コメントアウトされている他の関数(例:\(f(x) = \sqrt{1 - x^2}\))に切り替えることも可能です。解析解の定義:
F(x)関数により、func(x)の解析的積分が定義されています。これにより、数値積分の結果がどれだけ正確であるかを評価できます。積分区間: 積分区間は
xminとxmax変数で定義されており、デフォルトでは \([-1.0, 1.0]\) となっています。ガウス点と重み: 2点、3点、4点、5点のガウス・ルジャンドル求積法に対応するガウス点(
xfrac)と重み(weight)がプログラム内にハードコードされています。数値積分実行:
integ_GL関数がガウス・ルジャンドル求積法の計算を実行します。結果の表示:
main関数では、解析解の値と、3点、4点、5点のガウス・ルジャンドル法による数値積分結果を標準出力に表示し、比較を可能にします。
原理
このプログラムは、数値積分手法の一つであるガウス・ルジャンドル求積法(Gauss-Legendre quadrature)に基づいています。ガウス・ルジャンドル求積法は、特定の点(ガウス点)で関数を評価し、対応する重みを掛けて合計することで、積分値を近似する手法です。これにより、低い次数の多項式でも高い精度の積分結果が得られます。
一般的な積分区間 \([a, b]\) における関数 \(f(x)\) の積分は、以下のように近似されます。
ここで、
\(n\) は求積点の数(このプログラムでは3, 4, 5点)。
\(x_i\) はルジャンドル多項式 \(P_n(x)\) の根であり、正規化された区間 \([-1, 1]\) におけるガウス点です。
\(w_i\) は対応する重みです。
プログラム内の xfrac と weight リストには、各点数 \(n\) に対応する \(x_i\) と \(w_i\) の値が格納されています。integ_GL 関数では、与えられた積分区間 \([xmin, xmax]\) を \([-1, 1]\) に線形変換し、ガウス点での関数評価と重み付け和を行っています。
コードの冒頭には、このプログラムが「ガウス・ルジャンドル法による数値積分」を実行することを説明する3重引用符で囲まれたドキュメント文字列が含まれています。
必要な非標準ライブラリとインストール方法
このプログラムは、Pythonの標準ライブラリである math モジュールのみを使用しており、numpy をインポートしていますが、実際にはその機能は使用していません。したがって、追加でインストールする必要がある非標準ライブラリはありません。
必要な入力ファイル
このプログラムは、外部の入力ファイルを必要としません。
被積分関数 func(x)、その解析解 F(x)、および積分区間 xmin, xmax はすべてプログラムのソースコード内に直接定義されています。積分対象の関数や区間を変更する場合は、プログラムを直接編集する必要があります。
生成される出力ファイル
このプログラムは、いかなるファイルも生成しません。 すべての計算結果は、実行時に標準出力(コンソール)に表示されます。 出力される情報には以下のものが含まれます。
解析解の被積分関数値 (
f(xmin))解析解による定積分値 (
integ(f)[xmin, xmax])各点数(3点、4点、5点)のガウス・ルジャンドル求積法におけるガウス点 (
x)各点数における対応する重み (
w)各点数で計算された数値積分の結果 (
S)
コマンドラインでの使用例 (Usage)
integ_gauss_legendre.py プログラムは、コマンドライン引数を必要としません。
Pythonインタープリタを使用して直接実行します。
python integ_gauss_legendre.py
コマンドラインでの具体的な使用例
上記の使用例コマンドを実行すると、以下の出力が標準出力に表示されます。
python integ_gauss_legendre.py
Numerical integration using by Gauss-Legendre method
Analytical values:
f(-1.0)=0.36787944117144233
integ(f)[-1.0, 1.0]=2.350402387287603
3-point formulat
x= [-0.5484807469337704, 0.0, 0.5484807469337704]
w= [0.5555555555555556, 0.8888888888888888, 0.5555555555555556]
S=2.350402387287593
4-point formulat
x= [-0.769903914562085, -0.3, 0.3, 0.769903914562085]
w= [0.347854845137453, 0.652145154862546, 0.652145154862546, 0.347854845137453]
S=2.350402387287603
5-point formulat
x= [-0.861136311594052, -0.48496464522437654, 0.0, 0.48496464522437654, 0.861136311594052]
w= [0.23692688505618908, 0.47862867049936647, 0.5688888888888889, 0.47862867049936647, 0.23692688505618908]
S=2.350402387287603