有名な
, ; , ; , として実行した ( は、 の範囲までと考えて定めた。 のとき、 であり、 もう を加えても値が変わらない)。
/* * example5.c --- 確率積分 * ∞ * I =∫ exp(-x^2)dx = √π * -∞ * は R 上の解析関数の積分だから、台形則 * ∞ * T_h = h Σ f(n h) (ただし f は被積分関数) * n=-∞ * あるいは、その打ち切り * N * T_{h,N} = h Σ f(n h) * n=-N * で非常に精密に計算できるはずである。 * * コンパイル: cc -o example5 example5.c */ #include <stdio.h> #include <math.h> typedef double ddfunction(double); ddfunction f; double trapezoidal2(ddfunction, double, int); /* 被積分関数 */ double f(double x) { return exp(- x * x); } int main(void) { int m, N; double pi, I, h, T; /* 円周率, 確率積分の真値 */ pi = 4.0 * atan(1.0); I = sqrt(pi); printf("確率積分の台形則による数値積分\n"); printf(" N h T I-T\n"); h = 1.0; for (m = 0; m < 3; m++) { /* [-6,6] で打ち切る */ N = rint(6.0 / h); T = trapezoidal2(f, h, N); printf("%2d\t%g\t%20.15f %14e\n", N, h, T, I - T); h /= 2; } return 0; } double trapezoidal2(ddfunction f, double h, int N) { int j; double T = 0.0; for (j = - N; j <= N; j++) T += f(j * h); T *= h; return T; }
$ cc -o example5 example5.c $ ./example5 確率積分の台形則による数値積分 N h T I-T 6 1 1.772637204826652 -1.833539e-04 12 0.5 1.772453850905516 -2.220446e-16 24 0.25 1.772453850905516 -4.440892e-16