"""
SciPyの積分機能の使用例を示すスクリプト。
このスクリプトは、`scipy.integrate` モジュールを用いて、
様々な数値積分手法をデモンストレーションします。
具体的には、解析的積分(QUADPACK)、ロンバーグ積分、広義積分、
そして離散データの累積積分(`cumulative_trapezoid`)の利用方法を示します。
関連リンク: :doc:`integ_scipy_quad_usage`
"""
import numpy as np
from scipy import integrate
import matplotlib.pyplot as plt
[ドキュメント]
def computePi(x):
"""
円周率計算のための被積分関数を定義します。
この関数は、`integrate.quad` を用いて円周率を計算する際の被積分関数 `4/(1+x^2)` を返します。
0から1まで積分すると円周率(π)になります。
:param x: float: 積分変数の値。
:returns: float: 被積分関数の評価値。
"""
return 4/(1+x**2)
[ドキュメント]
def main():
"""
スクリプトの主要な処理を実行します。
この関数は、`scipy.integrate` モジュールの様々な積分手法をデモンストレーションします。
具体的には、以下の処理を実行します。
1. `integrate.quad` を用いた解析的な積分(QUADPACK)で円周率を計算します。
2. `integrate.romberg` を用いたロンバーグ積分で円周率を計算します。
3. `integrate.quad` を用いた広義積分(0から無限大まで)を実行します。
4. `integrate.cumulative_trapezoid` を用いて離散データの累積積分を行い、
その結果を解析解と比較してグラフ表示します。
:returns: None
"""
# 1. 解析的な積分 (QUADPACK)
res = integrate.quad(computePi, 0.0, 1.0)
print("(res, error)=", res)
# 2. ロンバーグ積分
res = integrate.romberg(computePi, 0, 1)
print("(res, error)=", res)
# 3. 広義積分 (0 to infinity)
res = integrate.quad(lambda x: x**5*np.exp(-x)*np.sin(x), 0, np.inf)
print("(res, error)=", res)
# ---------------------------------------------------------
# 離散データの累積積分
# ---------------------------------------------------------
x = np.linspace(0, 2, num=2**4+1)
y = x**4
# cumtrapz ではなく cumulative_trapezoid を使用
# initial=0 とすることで、入力 x と同じ長さの配列が返ります
y_int = integrate.cumulative_trapezoid(y, x, initial=0)
# グラフ表示
plt.plot(x, y_int, 'ro', label='cumulative_trapezoid')
plt.plot(x, y[0] + 0.2 * x**5, 'b-', label='analytical (x^5 / 5)')
plt.title("Comparison of Cumulative Integration")
plt.legend()
plt.show()
if __name__ == "__main__":
main()