技術ドキュメント: integ_order.py

プログラムの動作

integ_order.py は、Pythonで記述された数値積分手法の比較プログラムです。特定の関数 \(f(x) = e^x\) に対して、解析的な定積分値と、複数の異なる数値積分公式(リーマン積分、台形公式、シンプソンの公式、シンプソン3/8公式、ボーデの公式)による近似値を計算し、それらを比較します。

主な機能:

  1. 対象関数 \(f(x) = e^x\) とその解析的な積分 \(F(x) = e^x\) を定義します。

  2. 定義された関数に対し、指定された区間 \([x, x+h]\) における解析的積分値を計算します。

  3. 同じ区間に対し、5種類の数値積分公式を用いて積分値を計算します。

  4. 計算されたすべての値を標準出力に表形式で表示します。

  5. 計算結果を integ_order.csv というCSVファイルに保存します。

このプログラムは、異なる数値積分手法の精度や特性を比較検討するための基礎データを提供することを目的としています。

原理

このプログラムでは、関数 \(f(x) = e^x\) を区間 \([x, x+h]\) で積分します。 対象となる関数 \(f(x)\) とその解析的な積分 \(F(x)\) は以下の通りです。

\[f(x) = e^x\]
\[F(x) = e^x\]

したがって、解析的な定積分値は以下のようになります。

\[\int_x^{x+h} f(t) dt = F(x+h) - F(x) = e^{x+h} - e^x\]

プログラムでは、この解析的積分値と、以下の5種類の数値積分公式による近似値を比較します。

  1. リーマン積分 (短形公式) 区間 \([x, x+h]\) の左端の関数値を用いて長方形の面積を近似します。 $\(\int_x^{x+h} f(t) dt \approx f(x) \cdot h\)$

  2. 台形公式 区間 \([x, x+h]\) の両端の関数値を用いて台形の面積を近似します。 $\(\int_x^{x+h} f(t) dt \approx \frac{f(x) + f(x+h)}{2} \cdot h\)$

  3. シンプソンの公式 (1/3 公式) 区間 \([x, x+h]\) を3点(両端と中央)で近似します。 $\(\int_x^{x+h} f(t) dt \approx \frac{f(x) + 4f(x+h/2) + f(x+h)}{6} \cdot h\)$

  4. シンプソン3/8公式 区間 \([x, x+h]\) を4点(両端と2つの内挿点)で近似します。 $\(\int_x^{x+h} f(t) dt \approx \frac{1}{8} (f(x) + 3f(x+h/3) + 3f(x+2h/3) + f(x+h)) \cdot h\)$

  5. ボーデの公式 区間 \([x, x+h]\) を5点(両端と3つの内挿点)で近似します。これはニュートン・コーツの積分公式の一つで、シンプソンの公式よりも高精度です。 $\(\int_x^{x+h} f(t) dt \approx \frac{1}{90} (7f(x) + 32f(x+h/4) + 12f(x+h/2) + 32f(x+3h/4) + 7f(x+h)) \cdot h\)$

プログラムはこれらの公式を $x0$ から $x0 + (nx-1)h$ までの範囲で、\(h\) 間隔で繰り返し適用し、各区間での結果を比較します。

必要な非標準ライブラリとインストール方法

このプログラムは標準ライブラリの他に numpy を使用していますが、実際には数値計算自体にはほとんど使用しておらず、将来的な拡張のためのものと思われます。csvmath はPythonの標準ライブラリです。

必要なライブラリ:

  • numpy

インストール方法:

numpy がインストールされていない場合は、以下の pip コマンドでインストールできます。

pip install numpy

必要な入力ファイル

このプログラムは、外部からの入力ファイルを必要としません。 積分対象の関数、解析的積分、積分区間の開始点 (x0)、ステップ数 (nx)、ステップ幅 (h) などのすべてのパラメータは、プログラムのソースコード内に直接定義されています。

生成される出力ファイル

プログラムを実行すると、以下のCSVファイルがカレントディレクトリに生成されます。

  • integ_order.csv

ファイル内容:

integ_order.csv は、各積分区間における解析的積分値と各数値積分手法による近似値を格納したカンマ区切り(CSV)形式のファイルです。 ファイルの1行目はヘッダー行で、以下のカラム名が含まれます。

カラム名

説明

x

積分区間の開始点(x から x+h までを積分)

f

開始点 x における関数値 \(f(x)\)

integ(f)[x,x+h]

区間 [x, x+h] における解析的積分値 \(\int_x^{x+h} f(t) dt\)

Riemtan

リーマン積分(短形公式)による近似値

Trapezoid

台形公式による近似値

Simpson

シンプソンの公式(1/3 公式)による近似値

Simpson 3/8

シンプソン3/8公式による近似値

Bode

ボーデの公式による近似値

各データ行は、これらのカラムに対応する数値を含みます。

コマンドラインでの使用例 (Usage)

integ_order.py はコマンドライン引数を必要としません。 以下の基本的なコマンドで実行できます。

python integ_order.py

コマンドラインでの具体的な使用例

以下のコマンドを実行します。

python integ_order.py

実行結果の説明:

プログラムを実行すると、まず標準出力に数値積分の開始メッセージと、結果が書き込まれるファイル名が表示されます。 その後、計算された各積分区間における \(x\) の値、関数値 \(f(x)\)、解析的積分値、および各数値積分手法による近似値が表形式で出力されます。

標準出力の例:

Numerical integration using different approximations
Write to [integ_order.csv]

 x :   f         integ(f)[x,x+h]      Riemtan       Trapezoid       Simpson      Simpson 3/8        Bode    
 0.0:  1.0000       0.8244            0.500000      0.824361       0.824361     0.824361       0.824361
 0.5:  1.6487       1.3591            0.824361      1.359141       1.359141     1.359141       1.359141
 1.0:  2.7183       2.2386            1.359141      2.238612       2.238612     2.238612       2.238612
 1.5:  4.4817       3.6908            2.238612      3.690835       3.690835     3.690835       3.690835
 2.0:  7.3891       6.0886            3.690835      6.088600       6.088600     6.088600       6.088600
 2.5: 12.1825      10.0428            6.088600     10.042849      10.042849    10.042849      10.042849
 3.0: 20.0855      16.5562           10.042849     16.556214      16.556214    16.556214      16.556214
 3.5: 33.1155      27.2917           16.556214     27.291736      27.291736    27.291736      27.291736
 4.0: 54.5982      44.9750           27.291736     44.975017      44.975017    44.975017      44.975017
 4.5: 90.0171      74.1956           44.975017     74.195591      74.195591    74.195591      74.195591

同時に、カレントディレクトリに integ_order.csv というファイルが生成され、上記のデータがCSV形式で保存されます。 integ_order.csv の内容は、上記の標準出力の表と同じ形式でデータが記述されます。 x=0.0 の行は以下のようになります(ただし、CSVなのでタブではなくカンマ区切りです)。

x,f,integ(f)[x,x+h],Riemtan,Trapezoid,Simpson,Simpson 3/8,Bode
0.0,1.0,0.8243606353500643,0.5,0.8243606353500643,0.8243606353500643,0.8243606353500643,0.8243606353500643
# ... 以下同様に続く