2.3.1 公式の位数

このことを確かめてみよう。


/*
 * example1.c -- 多項式の積分
 */

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "nc.c"

int degree = 0; // 0 or 1 or 2 or 3 or 4

// sum_{k=0}^m (k+1)x^k
double f(double x)
{
  switch (degree) {
    case 0: return 1;
    case 1: return 1 + 2 * x;
    case 2: return 1 + 2 * x + 3 * x * x;
    case 3: return 1 + 2 * x + 3 * x * x + 4 * x * x * x;
    case 4: return 1 + 2 * x + 3 * x * x + 4 * x * x * x + 5 * x * x * x * x;
    default:
      return 1;
    }
}

int main(void)
{
  int N;
  double a, b, I[5] = {1.0, 2.0, 3.0, 4.0, 5.0};
  double  M, T, S;
  a = 0.0; b = 1.0;
  printf("Simpson 公式は次数3以下の多項式に対して正しい値を与える。\n");
  printf("中点公式、台形公式は次数1以下の多項式に対して正しい値を与える。\n");
  printf("確かめるためには N=2 で十分\n");
  printf("次数(≦4)="); scanf("%d", &degree);
  if (degree > 4)
    exit(1);
  printf("N="); scanf("%d", &N);
  M = midpoint(f, a, b, N);
  T = trapezoidal(f, a, b, N);
  S = simpson(f, a, b, N);
  printf("中点公式    M=%20.15f, 誤差=%e\n", M, I[degree] - M);
  printf("台形公式    T=%20.15f, 誤差=%e\n", T, I[degree] - T);
  printf("Simpson公式 S=%20.15f, 誤差=%e\n", S, I[degree] - S);
  return 0;
}
$ cc -o example1 example1.c
$ ./example1
次数=2
N=10
中点公式    M=   2.997500000000000, 誤差=2.500000e-03
台形公式    T=   3.005000000000001, 誤差=-5.000000e-03
Simpson公式 S=   3.000000000000000, 誤差=0.000000e+00
$

桂田 祐史
2018-08-13