问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

C语言实现辛普森法则(附带源码)

创作时间:
作者:
@小白创作中心

C语言实现辛普森法则(附带源码)

引用
CSDN
1.
https://m.blog.csdn.net/m0_61840987/article/details/145023835

辛普森法则(Simpson's Rule)是一种用于数值积分的方法,它比梯形法则更加精确,特别是在积分函数较为平滑的情况下。辛普森法则基于将积分区间划分为偶数个小区间,利用二次插值的方式来近似计算积分。其公式如下:

辛普森法则公式

对于区间 [a,b],分割为 n 个小区间(要求 n 为偶数),辛普森法则的公式为:

其中:

  • h=b−a ,即每个小区间的宽度。
  • xi=a+i⋅h,表示区间中的每个点。
  • f(x)是被积函数。

C语言实现辛普森法则

我们将使用辛普森法则来实现一个数值积分函数,来计算给定区间 [a,b] 上函数 f(x)的积分。假设我们需要计算 f(x) = x^2 在某个区间上的积分。

代码实现

#include <stdio.h>
#include <math.h>

// 定义需要积分的函数 f(x) = x^2
double f(double x) {
    return x * x;
}

// 辛普森法则进行数值积分
double simpsons_rule(double (*func)(double), double a, double b, int n) {
    if (n % 2 != 0) {
        n++;  // n 必须为偶数
    }
    
    double h = (b - a) / n;  // 每个小区间的宽度
    double sum = func(a) + func(b);  // 初始值:两端点的贡献
    
    // 累加奇数索引(权重为 4)
    for (int i = 1; i < n; i += 2) {
        sum += 4 * func(a + i * h);
    }
    
    // 累加偶数索引(权重为 2)
    for (int i = 2; i < n - 1; i += 2) {
        sum += 2 * func(a + i * h);
    }
    
    // 计算最终的积分值
    return sum * h / 3;
}

int main() {
    double a, b;
    int n;
    
    // 输入积分的区间 [a, b] 和分割数 n(要求 n 为偶数)
    printf("请输入积分的下限 a: ");
    scanf("%lf", &a);
    printf("请输入积分的上限 b: ");
    scanf("%lf", &b);
    printf("请输入划分区间的数量 n(必须为偶数): ");
    scanf("%d", &n);
    
    // 调用辛普森法则进行积分
    double result = simpsons_rule(f, a, b, n);
    
    // 输出结果
    printf("积分结果是: %.6f\n", result);
    
    return 0;
}

代码解析

  1. 定义被积函数
  • 我们定义了一个函数 f(double x),它返回 x^2,这是我们需要进行积分的函数。
  1. 辛普森法则函数
  • simpsons_rule 函数用于计算给定区间 [a,b] 上函数的积分。
  • 如果用户输入的 n 不是偶数,程序会将其增加 1 以确保符合辛普森法则的要求。
  • h 是每个小区间的宽度,计算方式为 h=b−a
  • 我们计算两端点的函数值,接着加上奇数索引的项(系数为 4),再加上偶数索引的项(系数为 2),最终根据辛普森法则公式计算积分值。
  1. 输入输出
  • main 函数提示用户输入积分区间的上下限以及分割区间的数量 n(必须为偶数)。然后调用 simpsons_rule 进行积分并输出结果。

运行结果

假设我们要求解 f(x) = x^2 在区间 [0,1] 上的积分,即:

用户输入:

  • a=0
  • b=1
  • n=6(选择偶数的分割数)

程序输出的结果应接近 1/3≈0.333333。

请输入积分的下限 a: 0
请输入积分的上限 b: 1
请输入划分区间的数量 n(必须为偶数): 6
积分结果是: 0.333333

总结

  • 辛普森法则是一种精度较高的数值积分方法,尤其适用于平滑的函数。
  • 我们通过将区间 [a,b] 分成偶数个小区间,利用二次插值的思想,计算给定区间上函数的积分。
  • 辛普森法则的精度通常高于梯形法则,因此对于相同的分割数,辛普森法则提供的结果更为精确。
  • 如果你想提高精度,可以增加分割区间数 n,或者使用其他更高阶的数值积分方法。

这个方法适用于各种需要数值积分的情况,尤其是在无法解析求解积分时,辛普森法则是一种非常有效的工具。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号