分割数を一つずつ変更して結果と誤差を得ることができるプログラムは作れた
その処理を関数化して、複数回呼び出してあげれば良いかと思います。
■ 処理のイメージ
■ コード例
C
1#include <stdio.h>
2#include <math.h>
3
4#define f(x)(exp(x) * cos(x))
5
6void calcTrapezoidalRule(int m);
7
8int main() {
9 int i;
10 int m;
11 // 表のヘッダ部
12 printf("分割数 数値積分値 誤 差\n\n");
13 for (i = 0; i < 10; i++) {
14 m = (int)pow(2, i+1);
15 calcTrapezoidalRule(m);
16 }
17
18 return 0;
19}
20
21void calcTrapezoidalRule(int m) {
22 int i;
23 double a = 0.0, b = 1.0;
24 double h, S;
25 double x = 0.0, sum = 0.0;
26 double y0, ym;
27 double cor, err;
28
29 y0 = f(a);
30 ym = f(b);
31 h = (b - a) / m;
32 for (i = 1; i < m; i++){
33 x = a + i * h;
34 sum += f(x);
35 }
36
37 S = (y0 + ym + 2.0 * sum) * h / 2.0;
38
39 cor = exp(b)*(sin(b) + cos(b)) / 2.0 - exp(a) * (sin(a) + cos(a)) / 2.0;
40 err = fabs(S - cor) / cor * 100.0;
41
42 // 表のデータ部
43 printf("%5d %1.15f %1.15f\n", m, S, err);
44}
■ 実行結果
分割数 数値積分値 誤 差
2 1.340618003271056 2.714509589202056
4 1.368582382531060 0.685200461840610
8 1.375658434900208 0.171708010429835
16 1.377432718220980 0.042952449511029
32 1.377876617809296 0.010739702078779
64 1.377987613243850 0.002685024864576
128 1.378015363385925 0.000671262425028
256 1.378022301001658 0.000167815994236
512 1.378024035410606 0.000041954022616
1024 1.378024469013152 0.000010488507298
ちなみに想定結果と誤差の値が違っているようでした。課題のようですので、原因について調べてみて下さい。
それと、「前の誤差との比」も出力していません。
戻り値を void
にしているか箇所を計算結果を返すようにして、次回実行時にその結果を引き継ぐようにすれば、出力できるかと思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/12/13 07:15
2021/12/13 16:12