我正在编写一个使用梯形规则递归计算积分的函数。对于区间(a,b)上的一些f(x),方法是计算边为(ba)的大梯形的面积,然后与将区间分成n部分后形成的小梯形的总和进行比较。如果差值大于某个给定误差,则对每个小梯形再次调用该函数并将结果求和。如果差值较小,则返回两个值的算术平均值。
该函数有两个参数,一个指向要集成的函数的函数指针和一个对辅助结构的常量引用,该辅助结构包含区间 (a,b)、分区数量等信息:
struct Config{
double min,max;
int partitions;
double precision;
};
当我想在每次迭代中更改分区数量时,问题就出现了,现在让我们说只是增加一个。如果不求助于当前的递归深度,我认为没有办法做到这一点:
integrate(const Config &conf, funptr f){
double a=conf.min,b=conf.max;
int n=conf.partitions;
//calculating the trapezoid areas here
if(std::abs(bigTrapezoid-sumOfSmallTrapezoids) > conf.precision){
double s=0.;
Config configs = new Config[n];
int newpartitions = n+(calls);
for(int i=0; i < n;++i){
configs[i]={ a+i*(b-a)/n , a+(i+1)*(b-a)/n , newpartitions};
s+=integrate(configs[i],f);
}
delete [] configs;
return s; }
else{
return 0.5*(bigTrapezoid+sumOfSmallTrapezoids);}
}
我在这里缺少的部分当然是一种查找(调用)的方法。我试过做类似于这个答案的事情,但它不起作用,事实上它会冻结电脑,直到 makefile 杀死进程。但也许我做错了。我不想向函数添加额外的参数或向结构添加额外的变量。我应该如何进行?