首页 > 编程语言 >复合Simpson求积算法-C++【可直接复制粘贴/欢迎评论点赞】

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

时间:2024-09-13 12:21:37浏览次数:11  
标签:fuction 积分 求积 C++ 复制粘贴 区间 include Simpson

背景

复合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;
}

标签:fuction,积分,求积,C++,复制粘贴,区间,include,Simpson
From: https://blog.csdn.net/ws13563798156/article/details/142207727

相关文章

  • Gauss列主元素消去法-C++【可直接复制粘贴/欢迎评论点赞】
    Gauss列主元素消去法(也称为列主元Gauss消去法)是Gauss消去法的一种改进版本,主要用于求解线性方程组。在C++中实现时,它具有一些显著的优点和缺点,并且有着深厚的数学和计算背景。优点提高数值稳定性:列主元Gauss消去法通过在每一列中选择绝对值最大的元素作为主元,从而避免了在消......
  • 牛顿插值法-C++【可直接复制粘贴/欢迎评论点赞】
    牛顿插值法是一种基于给定数据点集构造插值多项式的方法,用于近似未知函数的值。该方法通过构造差商表并利用该表逐步构建插值多项式。相较于拉格朗日插值法,牛顿插值法的一个显著优势是,当需要增加插值点时,只需重附上一项即可,无需重新计算所有插值点的值。基本概念牛顿插值法的......
  • 基于matlab的黄金搜索法【开源/可直接复制粘贴】
    黄金搜索法是一种无须函数导数的数值优化方法。它基于黄金分割比例来选择新的搜索区间,以逐步缩小搜索范围并逼近极值点。在每次迭代中,算法会根据当前搜索区间的长度和黄金分割比例来计算两个新的点,并在这两个点处评估函数值。然后,根据这两个点的函数值比较结果,选择包含更优解(......
  • 【C++基础概念理解——std::invoke()函数基础知识】
    std::invoke定义std::invoke是C++17引入的一个标准库函数,用于通用地调用可调用对象(如函数指针、成员函数指针、函数对象、lambda表达式等)。它提供了一种统一的方式来调用这些可调用对象,而不需要关心它们的具体类型。功能std::invoke可以调用以下类型的可调用对象:......
  • C++17新特性探索:拥抱std::optional,让代码更优雅、更安全
    std::optional背景在编程时,我们经常会遇到可能会返回/传递/使用一个确定类型对象的场景。也就是说,这个对象可能有一个确定类型的值也可能没有任何值。因此,我们需要一种方法来模拟类似指针的语义:指针可以通过nullptr来表示没有值。解决方法是定义该对象的同时再定义一个附加的......
  • 分享一些程序员常用的C++知识点
    以下是一些C++中的常用知识点:一、基础语法数据类型基本数据类型:整型(int):用于表示整数,通常占用4个字节(32位系统)。例如:intnum=10;浮点型(float、double):用于表示小数,float精度较低,double精度较高。如floatf=3.14f;(注意f后缀表示float类型),doubled=3.1415926......
  • C++入门基础
    个人主页:Jason_from_China-CSDN博客所属栏目:C++系统性学习_Jason_from_China的博客-CSDN博客前言 这一篇章算是C++栏目的语法的第一篇章,主要是为类和对象打下基础,介绍一些C++基本的语法结构这里提醒一下,要是看不懂第一步创建文件的,其实更建议先学习一下C语言,因为C++的......
  • Qt C++设计模式->建造者模式
    建造者模式简介建造者模式(BuilderPattern)是一种创建型设计模式,它通过使用多个简单的对象一步步构建一个复杂对象。建造者模式允许你分步骤创建复杂对象,并且你可以控制每个步骤如何执行。该模式常用于对象的创建过程非常复杂且需要有多个可选参数的场景。建造者模式的应用场......
  • VSCode配置C++环境
    前言VSCode作为一款“宇宙级”的编辑软件,为用户提供了丰富的插件。本文是一片保姆级关于VSCode配置C++环境教程;步骤一:MinGW安装MinGW(MinimalistGNUforWindows)是一款在Windows平台使用的开发工具集,提供了C/C++编译工具。MinGW下载地址:WinLibs-适用于Windows的GCC+Mi......
  • C++创建与调用dll动态链接库
    C++创建与调用dll动态链接库(MinGW64Dev-C++)本文使用的是dev-c++,如果涉及到VC++中不一样的操作,也会适当进行区分。项目一:创建DLL1、创建一个DLL类型的项目,当前命名为dlltest,并选择合适的路径进行保存。 2、在生成的预设置代码中,加入如下代码//这是头文件dll.h#ifndef_D......