は、
関数
を変数にしている、いわゆる汎関数である。
というわけで、
数値積分公式のプログラミングなどでは、
関数を引数にするのが自然である。
次は台形公式により数値積分を行う、
関数 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;
}
|