复合Simpson求积算法-C++【可直接复制粘贴/欢迎评论点赞】

背景

复合Simpson求积算法是基于Simpson 1/3法则的推广。Simpson 1/3法则是一种数值积分方法,它通过将积分区间划分为多个小区间,并在每个小区间上采用一个二次多项式来逼近原函数,进而求得积分的近似值。复合Simpson求积算法则是将这种方法应用于整个积分区间,即将整个区间划分为多个小区间,并在每个小区间上分别应用Simpson 1/3法则进行积分计算,最后将各小区间的积分结果相加得到整个区间的积分近似值。

优点

  1. 高精度:复合Simpson求积算法通常具有较高的精度,特别是当被积函数在积分区间内较为平滑时。由于在每个小区间上都采用了二次多项式逼近,因此能够较好地捕捉函数的局部变化特性,从而提高积分的精度。
  2. 收敛速度快:与梯形法等其他数值积分方法相比,复合Simpson求积算法的收敛速度更快。这意味着在达到相同精度要求的情况下,复合Simpson求积算法所需的小区间数量通常更少,从而减少了计算量。
  3. 适用范围广:复合Simpson求积算法适用于求解多种类型的定积分,包括连续函数、分段函数以及某些具有不连续点的函数。此外,它还可以与其他数值方法结合使用,以进一步提高计算效率和精度。

缺点

  1. 计算量较大:虽然复合Simpson求积算法的收敛速度快,但在达到高精度要求时,可能需要将积分区间划分为较多的小区间,从而增加了计算量。特别是对于复杂函数或积分区间较大的情况,计算量可能会显著增加。
  2. 对函数形态有一定要求:复合Simpson求积算法基于二次多项式逼近,因此对于某些形态较为复杂的函数(如高频振荡函数),其逼近效果可能不佳,从而导致积分精度下降。
  3. 需要选择合适的分区数:分区数的选择对复合Simpson求积算法的精度和计算量都有重要影响。分区数过少可能导致积分精度不足,而分区数过多则可能增加不必要的计算量。因此,在实际应用中需要根据具体情况选择合适的分区数。

C++实现

在C++中实现复合Simpson求积算法时,通常需要定义函数来计算被积函数在特定点的值,并编写主函数来执行分区、计算各小区间的积分值以及累加求和等步骤。此外,还需要注意处理边界条件、函数值的计算精度以及循环控制等问题。

simpson.h: 

#ifndef SIMPSON_H_INCLUDED
#define SIMPSON_H_INCLUDED
#include <iostream>
#include <math.h>
#include"fuction.h"//基函数头文件
using namespace std;
double SimpsonIntegral(double a, double b, double eps, int n)
{       //eps为精度,a为下限,b为上限,n为所选函数序号
    
    
    double h = b - a, s, s1, s2;//h为步长
    int p = 1, k;
    s1 = h / 6 * (fuction(a, n) + 4 * fuction((a + b) / 2, n) + fuction(b, n));
    s = 2 * fuction(a + 0.25 * h, n) - fuction(a + 0.25 * h, n) + 2 * fuction(a + 0.75 * h, n);
    s2 = 0.5 * s1 + s * h / 6;//初始化s、s1、s2
    do
    {
        h = 0.5 * h;
        p = 2 * p;
        s1 = s2;
        s = 0;//为方便求和
        for (k = 0; k < p; k++)
        {

            s =s+ 2 * fuction(a + (k+0.25) * h, n) - fuction(a + (k+0.5) * h, n) + 2 * fuction(a + (k+0.75) * h, n);

        }


        //复合simpson公式最后求和 
s2 = 0.5 * s1 + s * h / 6;

    } while (fabs(s2 - s1) > eps);
    return s2;


}

#endif // SIMPSON_H_INCLUDED

fuction.h: 

#ifndef FUCTION_H_INCLUDED
#define FUCTION_H_INCLUDED

#include <iostream>
#include <math.h>

using namespace std;
double fuction(double x,int a)
{
    if (a == 1)
        return sin(x) / x;
    if (a == 2)
        return atan(x) / x;
    if (a == 3)
        return 1 / (sqrt(x) * 2);
    if (a == 4)
        return  0.5e-16 * (exp(x) + exp(-x) + exp(2 * x) + exp(-2 * x) + exp(3 * x) + exp(-3 * x) + exp(4 * x) + exp(-4 * x));
}

#endif // FUCTION_H_INCLUDED 

main.c: 

#include <iostream>
#include <iomanip>
#include"simpson.h"
#include"fuction.h"

using namespace std;

int main()
{
    string l;
    double a, b, eps; int num;
    cin >> l;
    cin >> a >> b;
    cin >> eps;
    cin >> num;
    cout << fixed << setprecision(6) << SimpsonIntegral(a, b, eps, num);
    return 0;
}

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值