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

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


/*
 * ex1.c --- 1/x の [1,2] における定積分を複合台形則で計算する
 */

#include <stdio.h>
#include <math.h>

typedef double rrfunction(double);

rrfunction f;
double trapezoidal(rrfunction, double, double, int);

int main()
{
  int N;
  double I, T;

  I = log(2.0);

  printf("台形則\n");
  printf("    N               近似値                   誤差\n");
  for (N = 1; N <= (1 << 16); N *= 2) {
    T = trapezoidal(f, 1.0, 2.0, N);
    printf("%5d\t%25.18f\t%e\n", N, T, I - T);
  }
  return 0;
}

double trapezoidal(rrfunction f, double a, double b, int N)
{
  int j;
  double h, T;
  h = (b - a) / N;
  T = (f(a) + f(b)) / 2;
  for (j = 1; j < N; j++)
    T += f(a + j * h);
  T *= h;
  return T;
}

double f(double x)
{
  return 1 / x;
}



桂田 祐史