简介
在本实验中,我们将学习如何在 C 语言中使用梯形法则来近似计算积分。本实验涵盖以下步骤:1)定义函数 f(x) 和区间[a, b],2)分割区间并应用梯形公式来计算近似积分,以及 3)打印最终结果。本实验旨在通过 C 编程语言提供对数值积分技术的实际理解。
定义 f(x) 和区间 [a, b]
在这一步中,我们将定义数学函数 f(x),并使用 C 语言中的梯形法则指定用于数值积分的区间 [a, b]。
首先,让我们创建一个新的 C 源文件来实现我们的积分近似:
cd ~/project
nano integral_approximation.c
现在,让我们编写初始代码来定义我们的函数和区间:
#include <stdio.h>
#include <math.h>
// 定义要积分的函数 f(x)
double f(double x) {
// 示例:f(x) = x^2
return x * x;
}
int main() {
// 定义区间 [a, b]
double a = 0.0; // 下限
double b = 1.0; // 上限
printf("积分近似\n");
printf("函数:f(x) = x^2\n");
printf("区间:[%.2f, %.2f]\n", a, b);
return 0;
}
让我们编译并运行代码进行验证:
gcc -o integral_approximation integral_approximation.c -lm
./integral_approximation
示例输出:
积分近似
函数:f(x) = x^2
区间:[0.00, 1.00]
在这段代码中,我们定义了:
- 一个返回 x^2 的函数
f(x) - 一个从 0 到 1 的区间 [a, b]
- 打印了函数和区间的详细信息
函数 f(x) 可以修改为表示任何你想要积分的数学函数。
分割区间并应用梯形公式
在这一步中,我们将修改之前的代码,通过分割区间并计算近似积分来实现数值积分的梯形法则。
打开之前的源文件并更新代码:
cd ~/project
nano integral_approximation.c
将内容替换为以下实现:
#include <stdio.h>
#include <math.h>
// 定义要积分的函数 f(x)
double f(double x) {
return x * x;
}
// 梯形法则实现
double trapezoidalRule(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 sum * h;
}
int main() {
// 定义区间 [a, b]
double a = 0.0; // 下限
double b = 1.0; // 上限
int n = 100; // 梯形的数量
double approximateIntegral = trapezoidalRule(a, b, n);
printf("积分近似\n");
printf("函数:f(x) = x^2\n");
printf("区间:[%.2f, %.2f]\n", a, b);
printf("梯形数量:%d\n", n);
printf("近似积分:%.6f\n", approximateIntegral);
return 0;
}
编译并运行更新后的代码:
gcc -o integral_approximation integral_approximation.c -lm
./integral_approximation
示例输出:
积分近似
函数:f(x) = x^2
区间:[0.00, 1.00]
梯形数量:100
近似积分:0.333333
此实现中的关键点:
trapezoidalRule()函数计算近似积分h表示每个梯形的宽度n确定用于近似的梯形数量- 增加
n可提高近似精度
打印近似积分
在这一步中,我们将通过添加更详细的输出,并将数值结果与精确积分值进行比较,来增强我们的积分近似程序。
打开之前的源文件并更新代码:
cd ~/project
nano integral_approximation.c
修改代码以包含更全面的输出:
#include <stdio.h>
#include <math.h>
// 定义要积分的函数 f(x)
double f(double x) {
return x * x;
}
// 计算从 0 到 1 的 x^2 的精确积分
double exactIntegral() {
return 1.0 / 3.0;
}
// 梯形法则实现
double trapezoidalRule(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 sum * h;
}
int main() {
// 定义区间 [a, b]
double a = 0.0; // 下限
double b = 1.0; // 上限
int n = 100; // 梯形的数量
double approximateIntegral = trapezoidalRule(a, b, n);
double exact = exactIntegral();
double error = fabs(approximateIntegral - exact);
double percentError = (error / exact) * 100.0;
// 带有详细信息的格式化输出
printf("积分近似结果\n");
printf("------------------------------\n");
printf("函数:f(x) = x^2\n");
printf("区间: [%.2f, %.2f]\n", a, b);
printf("梯形数量: %d\n", n);
printf("\n数值结果:\n");
printf("近似积分: %.6f\n", approximateIntegral);
printf("精确积分: %.6f\n", exact);
printf("\n误差分析:\n");
printf("绝对误差: %.6f\n", error);
printf("百分比误差: %.4f%%\n", percentError);
return 0;
}
编译并运行更新后的代码:
gcc -o integral_approximation integral_approximation.c -lm
./integral_approximation
示例输出:
积分近似结果
------------------------------
函数: f(x) = x^2
区间: [0.00, 1.00]
梯形数量: 100
数值结果:
近似积分: 0.333333
精确积分: 0.333333
误差分析:
绝对误差: 0.000000
百分比误差: 0.0000%
此版本的主要改进:
- 添加了
exactIntegral()函数以比较数值结果 - 计算了绝对误差和百分比误差
- 提供了更详细和格式化的输出
总结
在本实验中,我们学习了如何在 C 语言中使用梯形法则来近似计算积分。首先,我们定义了用于数值积分的数学函数 f(x) 和区间[a, b]。然后,我们通过分割区间并应用公式来实现梯形法则,以计算近似积分。最后,我们打印了积分近似的结果。
本实验的关键步骤包括定义函数和区间、分割区间以及应用梯形公式来计算近似积分。通过遵循这些步骤,我们能够在 C 语言中实现一种简单而有效的数值积分技术。



