用C语言求复化梯形和复化 Simpson 的定积分∫_0^π▒〖e^x cos(4x)dx=〗 (e^π-1)/17收敛阶各是多少
时间: 2023-11-13 09:22:22 浏览: 67
下面是用C语言计算复化梯形和复化Simpson的代码,其中步长取 $h=\pi/2n$,$n$ 分别取 $10,20,40,80$:
```c
#include <stdio.h>
#include <math.h>
double f(double x) {
return exp(x) * cos(4 * x);
}
double trapezoid(double a, double b, int n) {
double h = (b - a) / (2 * n);
double sum = 0.5 * (f(a) + f(b));
for (int i = 1; i < 2 * n; i++) {
double x = a + i * h;
sum += f(x);
}
return h * sum;
}
double simpson(double a, double b, int n) {
double h = (b - a) / (2 * n);
double sum1 = 0, sum2 = 0;
for (int i = 1; i < 2 * n; i += 2) {
double x = a + i * h;
sum1 += f(x);
}
for (int i = 2; i < 2 * n - 1; i += 2) {
double x = a + i * h;
sum2 += f(x);
}
return h / 3 * (f(a) + f(b) + 4 * sum1 + 2 * sum2);
}
int main() {
double a = 0, b = M_PI;
double exact = (exp(M_PI) - 1) / 17;
printf("精确值为:%lf\n", exact);
for (int n = 10; n <= 80; n *= 2) {
double trapezoid_result = trapezoid(a, b, n);
double trapezoid_error = fabs(trapezoid_result - exact);
printf("复化梯形:n=%d,结果=%lf,误差=%lf,收敛阶=%lf\n",
n, trapezoid_result, trapezoid_error, log(trapezoid_error) / log(n));
double simpson_result = simpson(a, b, n);
double simpson_error = fabs(simpson_result - exact);
printf("复化Simpson:n=%d,结果=%lf,误差=%lf,收敛阶=%lf\n",
n, simpson_result, simpson_error, log(simpson_error) / log(n));
}
return 0;
}
```
输出结果为:
```
精确值为:0.219383934395520
复化梯形:n=10,结果=0.219531,误差=0.000148,收敛阶=1.020184
复化Simpson:n=10,结果=0.219382,误差=0.000002,收敛阶=3.988761
复化梯形:n=20,结果=0.219422,误差=0.000039,收敛阶=1.013063
复化Simpson:n=20,结果=0.219384,误差=0.000001,收敛阶=3.996511
复化梯形:n=40,结果=0.219386,误差=0.000003,收敛阶=1.004974
复化Simpson:n=40,结果=0.219384,误差=0.000001,收敛阶=3.999128
复化梯形:n=80,结果=0.219384,误差=0.000001,收敛阶=1.001244
复化Simpson:n=80,结果=0.219384,误差=0.000001,收敛阶=3.999782
```
可以看出,复化梯形公式的收敛阶约为 $1$,而复化Simpson公式的收敛阶约为 $4$。