/****************************/ /* シンプソン則 */ /* coded by Y.Suganuma */ /****************************/ #include <stdio.h> #include <math.h> double snx(double); double simpson(double, double, int, double(*)(double)); int main() { double y, pi2 = 2.0 * atan(1.0); y = simpson(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 simpson(double x1, double x2, int n, double(*fun)(double)) { double s1 = 0.0; double s2 = 0.0; double s, x, h, h2; h = (x2 - x1) / n; h2 = 2.0 * h; for (x = x1+h; x < x2; x += h2) s1 += (*fun)(x); for (x = x1+h2; x < x2-h; x += h2) s2 += (*fun)(x); s = h * ((*fun)(x1) + (*fun)(x2) + 4.0 * s1 + 2.0 * s2) / 3.0; return s; }