は、 関数 を変数にしている、いわゆる汎関数である。 というわけで、 数値積分公式のプログラミングなどでは、 関数を引数にするのが自然である。 次は台形公式により数値積分を行う、 関数 trapezoidal() のプログラム例である。
1 /* 2 * ex1.c --- 1/x の [1,2] における定積分を複合台形則で計算する 3 */ 4 5 #include <stdio.h> 6 #include <math.h> 7 8 typedef double rrfunction(double); 9 10 rrfunction f; 11 double trapezoidal(rrfunction, double, double, int); 12 13 int main() 14 { 15 int N; 16 double I, T; 17 18 I = log(2.0); 19 20 printf("台形則\n"); 21 printf(" N 近似値 誤差\n"); 22 for (N = 1; N <= (1 << 16); N *= 2) { 23 T = trapezoidal(f, 1.0, 2.0, N); 24 printf("%5d\t%25.18f\t%e\n", N, T, I - T); 25 } 26 return 0; 27 } 28 29 double trapezoidal(rrfunction f, double a, double b, int N) 30 { 31 int j; 32 double h, T; 33 h = (b - a) / N; 34 T = (f(a) + f(b)) / 2; 35 for (j = 1; j < N; j++) 36 T += f(a + j * h); 37 T *= h; 38 return T; 39 } 40 41 double f(double x) 42 { 43 return 1 / x; 44 } |
桂田 祐史