在C语言中,"integral"(积分)通常指数值积分(Numerical Integration),即通过计算机算法近似计算定积分的值,以下是几种常见的数值积分方法及其C语言实现:

(图片来源网络,侵删)
矩形法(Rectangle Rule)
将积分区间划分为若干小区间,用矩形面积近似代替曲线下的面积。
#include <stdio.h>
#include <math.h>
double rectangle_rule(double a, double b, int n, double (*func)(double)) {
double h = (b - a) / n;
double sum = 0.0;
for (int i = 0; i < n; i++) {
double x = a + i * h;
sum += func(x);
}
return h * sum;
}
// 示例:计算 ∫₀¹ x² dx 的近似值
double f(double x) {
return x * x;
}
int main() {
double a = 0.0, b = 1.0;
int n = 1000; // 区间数
double result = rectangle_rule(a, b, n, f);
printf("矩形法结果: %.6f\n", result);
return 0;
}
梯形法(Trapezoidal Rule)
用梯形面积近似代替曲线下的面积,精度高于矩形法。
double trapezoidal_rule(double a, double b, int n, double (*func)(double)) {
double h = (b - a) / n;
double sum = (func(a) + func(b)) / 2.0;
for (int i = 1; i < n; i++) {
double x = a + i * h;
sum += func(x);
}
return h * sum;
}
int main() {
double result = trapezoidal_rule(0.0, 1.0, 1000, f);
printf("梯形法结果: %.6f\n", result);
return 0;
}
辛普森法(Simpson's Rule)
通过抛物线近似曲线,精度更高,要求区间数为偶数。
double simpson_rule(double a, double b, int n, double (*func)(double)) {
if (n % 2 != 0) n++; // 确保n为偶数
double h = (b - a) / n;
double sum = func(a) + func(b);
for (int i = 1; i < n; i++) {
double x = a + i * h;
sum += (i % 2 == 0) ? 2 * func(x) : 4 * func(x);
}
return (h / 3.0) * sum;
}
int main() {
double result = simpson_rule(0.0, 1.0, 1000, f);
printf("辛普森法结果: %.6f\n", result);
return 0;
}
高斯积分(Gaussian Quadrature)
通过特殊节点和权重计算积分,精度极高,适合光滑函数。

(图片来源网络,侵删)
// 以2点高斯积分为例(区间[-1,1])
double gauss_quad(double a, double b, double (*func)(double)) {
// 高斯节点和权重(2点)
double nodes[] = {-0.5773502692, 0.5773502692};
double weights[] = {1.0, 1.0};
double sum = 0.0;
for (int i = 0; i < 2; i++) {
double x = (b - a) / 2 * nodes[i] + (a + b) / 2;
sum += weights[i] * func(x);
}
return (b - a) / 2 * sum;
}
int main() {
double result = gauss_quad(0.0, 1.0, f);
printf("高斯积分结果: %.6f\n", result);
return 0;
}
自适应积分(Adaptive Quadrature)
根据误差动态调整区间划分,适用于复杂函数。
// 递归实现自适应辛普森积分
double adaptive_simpson(double a, double b, double (*func)(double), double eps) {
double c = (a + b) / 2;
double h = (b - a) / 6;
double fa = func(a), fb = func(b), fc = func(c);
double sab = h * (fa + 4 * fc + fb);
double d = (a + c) / 2, e = (c + b) / 2;
double fd = func(d), fe = func(e);
double sac = h * (fa + 4 * fd + fc) / 2;
double scb = h * (fc + 4 * fe + fb) / 2;
if (fabs(sab - (sac + scb)) < 15 * eps) {
return sac + scb;
} else {
return adaptive_simpson(a, c, func, eps / 2) + adaptive_simpson(c, b, func, eps / 2);
}
}
int main() {
double result = adaptive_simpson(0.0, 1.0, f, 1e-6);
printf("自适应积分结果: %.6f\n", result);
return 0;
}
关键点总结
-
方法选择:
- 矩形法:简单,精度低。
- 梯形法:平衡简单性和精度。
- 辛普森法:高精度,适合平滑函数。
- 高斯积分:最高精度,但需预计算节点和权重。
- 自适应积分:处理复杂函数,计算量较大。
-
函数指针:通过
double (*func)(double)传递被积函数,提高代码复用性。 -
误差控制:自适应方法通过
eps参数控制精度。
(图片来源网络,侵删) -
性能优化:对于大规模计算,可结合并行化(如OpenMP)。
根据实际需求选择合适的方法,调整区间数n或误差阈值eps以平衡精度和计算效率。
