在 C 语言中使用梯形法则近似计算积分

CCBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本实验中,我们将学习如何在C语言中使用梯形法则来近似计算积分。本实验涵盖以下步骤:1)定义函数f(x)和区间[a, b],2)分割区间并应用梯形公式来计算近似积分,以及3)打印最终结果。本实验旨在通过C编程语言提供对数值积分技术的实际理解。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL c(("C")) -.-> c/BasicsGroup(["Basics"]) c(("C")) -.-> c/ControlFlowGroup(["Control Flow"]) c(("C")) -.-> c/FunctionsGroup(["Functions"]) c(("C")) -.-> c/UserInteractionGroup(["User Interaction"]) c/BasicsGroup -.-> c/variables("Variables") c/ControlFlowGroup -.-> c/for_loop("For Loop") c/FunctionsGroup -.-> c/function_declaration("Function Declaration") c/FunctionsGroup -.-> c/math_functions("Math Functions") c/UserInteractionGroup -.-> c/output("Output") subgraph Lab Skills c/variables -.-> lab-435132{{"在 C 语言中使用梯形法则近似计算积分"}} c/for_loop -.-> lab-435132{{"在 C 语言中使用梯形法则近似计算积分"}} c/function_declaration -.-> lab-435132{{"在 C 语言中使用梯形法则近似计算积分"}} c/math_functions -.-> lab-435132{{"在 C 语言中使用梯形法则近似计算积分"}} c/output -.-> lab-435132{{"在 C 语言中使用梯形法则近似计算积分"}} end

定义 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语言中实现一种简单而有效的数值积分技术。