背景
复合Simpson求积算法是基于Simpson 1/3法则的推广。Simpson 1/3法则是一种数值积分方法,它通过将积分区间划分为多个小区间,并在每个小区间上采用一个二次多项式来逼近原函数,进而求得积分的近似值。复合Simpson求积算法则是将这种方法应用于整个积分区间,即将整个区间划分为多个小区间,并在每个小区间上分别应用Simpson 1/3法则进行积分计算,最后将各小区间的积分结果相加得到整个区间的积分近似值。
优点
- 高精度:复合Simpson求积算法通常具有较高的精度,特别是当被积函数在积分区间内较为平滑时。由于在每个小区间上都采用了二次多项式逼近,因此能够较好地捕捉函数的局部变化特性,从而提高积分的精度。
- 收敛速度快:与梯形法等其他数值积分方法相比,复合Simpson求积算法的收敛速度更快。这意味着在达到相同精度要求的情况下,复合Simpson求积算法所需的小区间数量通常更少,从而减少了计算量。
- 适用范围广:复合Simpson求积算法适用于求解多种类型的定积分,包括连续函数、分段函数以及某些具有不连续点的函数。此外,它还可以与其他数值方法结合使用,以进一步提高计算效率和精度。
缺点
- 计算量较大:虽然复合Simpson求积算法的收敛速度快,但在达到高精度要求时,可能需要将积分区间划分为较多的小区间,从而增加了计算量。特别是对于复杂函数或积分区间较大的情况,计算量可能会显著增加。
- 对函数形态有一定要求:复合Simpson求积算法基于二次多项式逼近,因此对于某些形态较为复杂的函数(如高频振荡函数),其逼近效果可能不佳,从而导致积分精度下降。
- 需要选择合适的分区数:分区数的选择对复合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