/* trapezoidal.c */ /* 複合台形公式*/ #include #include #define NMAX 1024 double func(double x); int main(void) { int j,n;// nはパネル数 double a,b,h,x,s = 0.0, s0, I = exp(2.0) - 1.0;//真値Iがわかっているとき、誤差を出力するため a = 0.0; /* 積分区間の下限*/ b = 2.0; /* 積分区間の上限*/ h = b - a; s = 0.5 * h * (func(a) + func(b)); n = 1; s0 = s; printf("%4s %6s %20s %10s\n","n","h","T_n ", "err"); printf("%4d %9.5f %20.15f %9.3e\n",n,h,s,s-I); for (n = 2; n <= NMAX; n*=2){ h *= 0.5; x = a + h; s = 0; for (j = 1;j <= n / 2; j++){ s += func(x); x += 2 * h; } s = 0.5 * s0 + h * s; printf("%4d %9.5f %20.15f %9.3e\n",n,h,s,s-I); /* 真値がわかっているときに用いる */ // printf("%4d %9.5f %20.15f\n",n,h,s); /* 真値が不明のときに用いる */ s0 = s; } return 0; } double func(double x) /* 被積分関数 */ { return exp(x); }