C++ :梯形法求积分的公式
已知用梯形法求积分的公式为:
T
n
=
h
(
f
(
a
)
+
f
(
b
)
)
2
+
h
∑
i
=
1
n
−
1
f
(
a
+
i
h
)
T_{n}= \frac {h(f(a)+f(b))}{2}+h \sum \limits _{i=1}^{n-1}f(a+ih)
Tn=2h(f(a)+f(b))+hi=1∑n−1f(a+ih)
其中,
h
=
b
−
a
n
h=\frac{b-a}{n}
h=nb−a, n 为积分区间的等分数,编程求如下积分的值。要求:
1.把求积分公式编写成一个函数,并使用函数指针作为形式参数。
2.调用该函数时,给出不同的被积函数作为实际参数求不同的积分。
[
∫
0
1
4
1
+
x
2
d
x
]
[
∫
1
2
1
+
x
2
d
x
]
[
∫
0
π
2
sin
x
d
x
]
[ \int _{0}^{1} \frac {4}{1+x^{2}}dx ] [ \int _{1}^{2} \sqrt {1+x^{2}}dx ] [ \int _{0}^{ \frac { \pi }{2}} \sin xdx ]
[∫011+x24dx][∫121+x2dx][∫02πsinxdx]
思路
总体思路:
定义三个被积函数 function1、function2 和 function3,然后在 main 函数中调用 trapezoidal_integration 函数来计算这些函数在指定区间上的积分值。
实现:
- 首先可以把公式中的公因数h提出来,所以公式函数的返回值就可以表达成一个h*k(k为一个表达式)的形式,第一部分就是h,第二部分就是f(a+ih),至于求和,可以用for循环来解决。函数设置的大概思路就是,引用函数指针用来引用所选择的积分表达式,再传入double型形式参数作为积分的上限和下限,以及等分数n
- 设置三个函数用来表达积分式子,返回相应类型。
- 主函数就可以直接调用trapezoidal_integration,继而调用三个被积函数 function1、function2 和 function3,输出即可。
程序如下
#include <iostream>
#include <cmath>
using namespace std;
double trapezoidal_integration(double (*f)(double), double a, double b, int n) {
double h = (b - a) / n;
double sum = 0.5 * (f(a) + f(b));
for (int i = 1; i < n; i++) {
double x = a + i * h;
sum += f(x);
}
return h * sum;
}
double function1(double x) {
return 4.0 / (1 + x * x);
}
double function2(double x) {
return sqrt( 1 + x * x);
}
double function3(double x) {
return sin(x);
}
int main() {
double result1 = trapezoidal_integration(function1, 0, 1, 1000);
double result2 = trapezoidal_integration(function2, 1, 2, 1000);
double result3 = trapezoidal_integration(function3, 0,M_PI/2, 1000);
// 输出结果
cout << "第一种积分结果为: " << result1 << endl;
cout << "第二种积分结果为: " << result2 << endl;
cout << "第三种积分结果为:" << result3 << endl;
return 0;
}