このことを確かめてみよう。
/* * 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", °ree); 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 $ |