2.10.1 以下のプログラムで共通して用いる関数の定義

nint.h

/*
 * nint.h --- 複合台形則, 複合中点則, 複合 Simpson 則
 */

typedef double rrfunction(double);

double trapezoidal(rrfunction, double, double, int);
double midpoint(rrfunction, double, double, int);
double simpson(rrfunction, double, double, int);

nint.c

/*
 * nint.c --- 複合台形則, 複合中点則, 複合 Simpson 則
 *
 *  コンパイル: gcc -c nint.c
 */

#include <math.h>
#include "nint.h"

/* 関数 f の [a,b] における積分の複合台形則による数値積分 T_m */
double trapezoidal(rrfunction f, double a, double b, int m)
{
  int j;
  double h = (b - a)/ m, T = (f(a) + f(b)) / 2;
  for (j = 1; j < m; j++) T += f(a + j * h);
  T *= h;
  return T;
}

/* 関数 f の [a,b] における積分の複合中点則による数値積分 M_m */
double midpoint(rrfunction f, double a, double b, int m)
{
  int j;
  double h = (b - a) / m, C = 0.0;
  for (j = 1; j <= m; j++) C += f(a + (j - 0.5) * h);
  C *= h;
  return C;
}

/* 関数 f の [a,b] における積分の複合 Simpson 則による数値積分 S_{2m} */
double simpson(rrfunction f, double a, double b, int m)
{
  return (trapezoidal(f, a, b, m) + 2 * midpoint(f, a, b, m)) / 3;
}

nint.c をコンパイルして nint.o を作っておく。
nint.o の作り方
	gcc -O -c nint.c

桂田 祐史
2016-03-13