A..1 比較的ありがちな汎関数の定義

$ I(f,a,b):=\dsp\int_a^b f(x)\;\Dx$ は、 関数 $ f$ を変数にしている、いわゆる汎関数である。 というわけで、 数値積分公式のプログラミングなどでは、 関数を引数にするのが自然である。 次は台形公式により数値積分を行う、 関数 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 }

桂田 祐史
2017-09-29