我一直在尝试编写一个函数来使用复合辛普森规则来近似积分的值。
template <typename func_type>
double simp_rule(double a, double b, int n, func_type f){
int i = 1; double area = 0;
double n2 = n;
double h = (b-a)/(n2-1), x=a;
while(i <= n){
area = area + f(x)*pow(2,i%2 + 1)*h/3;
x+=h;
i++;
}
area -= (f(a) * h/3);
area -= (f(b) * h/3);
return area;
}
我所做的是将函数的每个值乘以 2 或 4(和 h/3)pow(2,i%2 + 1)
并减去边缘,因为这些边缘的权重应该只有 1。
起初,我认为它工作得很好,但是,当我将它与我的梯形方法函数进行比较时,它更加不准确,这不应该是这种情况。
这是我之前写的代码的一个更简单的版本,它有同样的问题,我认为如果我稍微清理一下,问题就会消失,但是唉。从另一篇文章中,我了解到类型和我正在对它们执行的操作会导致精度损失,但我只是没有看到。
编辑:
为了完整起见,我将 e^x 从 1 运行到零
\\function to be approximated
double f(double x){ double a = exp(x); return a; }
int main() {
int n = 11; //this method works best for odd values of n
double e = exp(1);
double exact = e-1; //value of integral of e^x from 0 to 1
cout << simp_rule(0,1,n,f) - exact;