定积分算法概述
本文主要介绍一下积分算法。定积分可以理解为函数与x轴、指定的左右界围成的有符号的面积代数和。那么最简单的算法求a到b上,f(x)函数的积分,就是把[a,b]区间平均分割为无数多个divx模块,每个模块都看成长度为f(a+divx),宽度为divx的矩形,相乘后的有符号面积进行代数和后求出的即为定积分值,这种算法这里就不予实现了,网络上很多。今天将两种算法,起始还是属于积分中比较浅显的,给需要的同胞们解决一下燃眉之急。
自定义算法
我介绍的这种算法比较简单,是用梯形分割法进行反复迭代计算的。话不多说,po一下代码:
template<class C>
void my_Integral_trapzd(C& f1, const DB begin, const DB end, const int num, const DB eps,DB& result)
/*************************************************
Function: my_Integral_trapzd
Description: 采用梯形迭代法的基本一重积分
Input:
*f1: 需要求积分的原始表达式
*begin: 定积分起点
*end: 定积分终点
*multiple: 对称分割的次数,为2^(num-1)次
*result: 存放积分结果
Output:
Return:
*ret: void
*************************************************/
{
DB x, tnm, sum, del;
const DB EPS{
eps };
static DB s;
DB olds = 0.0;
int it, j;
for (int multiple = 0; multiple < num; multiple++)
{
if (multiple == 1)//仅分割轴向区间1次
{
s = 0.5*(end - begin)*(f1(begin) + f1(end));//赋值静态变量,准备迭代,并且返回值
result = s;
}
else
{
for (it = 1, j = 1; j < multiple -