module integral
  !
  ! 台形公式を用いた数値積分を行うための手続きを提供する
  ! モジュールです. 
  !
  private
  public trapezoid
contains
  function trapezoid(a,b,n) result(s)
    !
    ! 台形公式を用いた数値積分を行います. 
    !
    ! $ f(x) = x^2 - 2x + 2 $ の積分値を台形公式によって求めます.
    !
    ! * 積分区間は $ [a, b] $ とします.
    ! * 実際に計算する式は以下の通りです.
    !   ここで $ h $ は $ h = \frac{b-a}{n} $ です.
    !
    ! \[
    !    \int_{a}^{b} f(x) dx =
    !      \frac{h}{2} \left\{f(a) + f(b)\right\} + h\sum_{i=1}^{n-1} f(a+ih)
    ! \]
    !
    ! このサンプルプログラムは http://www.gfd-dennou.org/library/dcmodel
    ! にて入手できます. 
    !
    real,    intent(in) :: a ! 積分区間の下限
    real,    intent(in) :: b ! 積分区間の上限
    integer, intent(in), optional :: n ! 積分区間の分割数
    real :: s  ! 積分値
    real :: h
    integer :: i, div = 10
    if (present(n)) div = n
    h = (b-a) / div
    s = (f(a)+f(b)) / 2.0
    do i = 1, n-1
      s = s + f(a + i*h)
    end do
    s = h*s
  end function trapezoid

  function f(x) result(res)
    !
    ! $ f(x) = x^2 - 2x + 2 $ の値を返す内部サブルーチンです. 
    !
    real, intent(in) :: x
    real :: res
    res = x**2 - 2*x + 2
  end function f
end module integral
