数値積分(台形則)

/****************************/
/* 台形則                   */
/*      coded by Y.Suganuma */
/****************************/
#include <stdio.h>
#include <math.h>

double snx(double);
double daikei(double, double, int, double(*)(double));

int main()
{
	double y, pi2 = 2.0 * atan(1.0);

	y = daikei(0.0, pi2, 100, snx);

	printf("result %f\n", y);

	return 0;
}

/****************/
/* 関数値の計算 */
/****************/
double snx(double x)
{
	return sin(x);
}

/******************************************************/
/* 数値積分(台形則)                                 */
/*      x1 : 下限                                     */
/*      x2 : 上限                                     */
/*      n : 分割数                                    */
/*      fun : 関数名(f)                             */
/*      return : 積分値                               */
/******************************************************/
double daikei(double x1, double x2, int n, double(*fun)(double))
{
	double s = 0.0;
	double x, h;
	int i1;

	h = (x2 - x1) / n;
	x = x1;

	for (i1 = 0; i1 < n-1; i1++) {
		x += h;
		s += (*fun)(x);
	}

	s = 0.5 * h * ((*fun)(x1) + (*fun)(x2) + 2.0 * s);

	return s;
}