シンプソンの公式による数値積分(Ruby)

Rubyによる情報科学入門

Rubyによる情報科学入門


f(x) = x^2 を [1, 10] の区間で数値積分してみます。ここでは区間を100分割します。ちなみに、正しい答えは 333 です。

def integral(fn, a, b, n)
  dx = (b - a) / n.to_f
  s = 0.0
  n.times do |i|
    x = a + i * dx
    y0 = fn.call(x)
    y1 = fn.call(x + dx * 0.5)
    y2 = fn.call(x + dx)
    s += (y0 + 4 * y1 + y2) * dx / 6.0
  end
  s
end

f = ->(x) {x ** 2}
puts integral(f, 1, 10, 100)    #=>332.99999999999983

シンプソンの公式とは、分割された区間を2次曲線で補完する方法です。