1. 用C语言代码求下列各种数值方法估计定积分 ∫_0^π▒〖e^x cos(4x)dx=〗 (e^π-1)/17 (a) 复化梯形公式 (b) 复化 Simpson 公式 (c) (复化)Gauss 公式 比较各种方法的效率和精度。效率可以用计算过程中调用函数值的次数来衡量,精度用误差衡量,这个题目知道精确解,可以直接求误差,但是大部分题目是不知道精确解的。精度也 可以用加密(步长减半)前后误差的比值来衡量,当比值越大,误差下降的速度越快。
时间: 2024-03-02 07:54:08 浏览: 63
以下是用 C 语言实现三种数值积分方法的代码:
(a) 复化梯形公式
```c
#include <stdio.h>
#include <math.h>
double f(double x) {
return exp(x) * cos(4*x);
}
double trapezoidal(double a, double b, int n) {
double h = (b-a)/n;
double sum = 0;
for (int i = 1; i < n; i++) {
sum += f(a+i*h);
}
return h/2*(f(a) + f(b) + 2*sum);
}
int main() {
double a = 0;
double b = M_PI;
double exact = (exp(M_PI)-1)/17;
double approx = trapezoidal(a, b, 2);
double error = fabs(approx - exact);
printf("approximation = %lf\n", approx);
printf("error = %lf\n", error);
return 0;
}
```
(b) 复化 Simpson 公式
```c
#include <stdio.h>
#include <math.h>
double f(double x) {
return exp(x) * cos(4*x);
}
double simpson(double a, double b, int n) {
double h = (b-a)/n;
double sum1 = 0, sum2 = 0;
for (int i = 1; i < n; i += 2) {
sum1 += f(a+i*h);
}
for (int i = 2; i < n; i += 2) {
sum2 += f(a+i*h);
}
return h/3*(f(a) + 4*sum1 + 2*sum2 + f(b));
}
int main() {
double a = 0;
double b = M_PI;
double exact = (exp(M_PI)-1)/17;
double approx = simpson(a, b, 2);
double error = fabs(approx - exact);
printf("approximation = %lf\n", approx);
printf("error = %lf\n", error);
return 0;
}
```
(c) 复化 Gauss 公式
```c
#include <stdio.h>
#include <math.h>
double f(double x) {
return exp(x) * cos(4*x);
}
double gauss(double a, double b, int n) {
double x[3] = {-0.774597, 0, 0.774597};
double w[3] = {0.555556, 0.888889, 0.555556};
double sum = 0;
for (int i = 0; i < n; i++) {
double xi = a + (i+0.5)*(b-a)/n;
for (int j = 0; j < 3; j++) {
double xj = x[j];
double wj = w[j];
sum += wj*f(0.5*(1-xj)*xi + 0.5*(1+xj)*(a+b)/n);
}
}
return 0.5*(b-a)/n*sum;
}
int main() {
double a = 0;
double b = M_PI;
double exact = (exp(M_PI)-1)/17;
double approx = gauss(a, b, 2);
double error = fabs(approx - exact);
printf("approximation = %lf\n", approx);
printf("error = %lf\n", error);
return 0;
}
```
从精度和效率来看,复化 Simpson 公式和复化 Gauss 公式的精度较高,复化梯形公式的精度较低。在效率方面,复化 Gauss 公式的计算过程中需要调用函数的次数最多,而复化梯形公式的计算过程中需要调用函数的次数最少。总体来说,选择哪种方法应该在精度和效率之间做出权衡。
阅读全文