数値積分(シンプソン則)

#***************************/
# シンプソン則             */
#      coded by Y.Suganuma */
#***************************/

#***************/
# 関数値の計算 */
#***************/
snx = Proc.new { |x|
	Math.sin(x)
}

#******************************************************/
# 数値積分(シンプソン則)                            */
#      x1 : 下限                                      */
#      x2 : 上限                                      */
#      n : 分割数                                     */
#      fun : 関数名(f)                              */
#      return : 積分値                                */
#******************************************************/
def simpson(x1, x2, n, &fun)

	s1 = 0.0
	s2 = 0.0
	h  = (x2 - x1) / n
	h2 = 2.0 * h

	x = x1 + h
	while x < x2
		s1 += fun.call(x)
		x  += h2
	end

	x = x1 + h2
	while x < x2-h
		s2 += fun.call(x)
		x  += h2
	end

	s = h * (fun.call(x1) + fun.call(x2) + 4.0 * s1 + 2.0 * s2) / 3.0

	return s
end

pi2 = 2.0 * Math.atan(1.0)
y   = simpson(0.0, pi2, 100, &snx)
printf("result %f\n", y)