复合辛普森规则代码不断输出错误?

问题描述 投票:1回答:1

算法:enter image description here

我正在尝试实施此复合Simpson规则,该规则将计算以下积分:1 / sqrt(x),其结果应为:2

但是,我一直得到错误的输出,例如1.61663

#include <cmath>
#include <iostream>
using namespace std;

double f(double n)
{

    return 1/sqrt(n);
}

double simpson(double a, double b, double n)
{

double x0=f(a)+f(b);
double h=(b-a)/(n);
double x1=0,x2=0;
double x=0;
for(int i = 1 ; i <n;i++){
        x=a+(i*h);
        if(i%2==0)
        {
            x2=x2+f(x);
        }
        else
        {
            x1=x1+f(x);
        }
    }
        x1=(h*(x0+2*x2+4*x1))/3;
        return x1;
}

 int main(){

            cout<<"Integral is: "<<" "<<simpson(0.0004,1,20)<<" "<<endl;
    }
c++ algorithm math calculus
1个回答
1
投票

问题不在您的代码中,而是您要集成的功能中。当x变为零时,该函数发散到无穷大。衍生产品也有所不同。

对于[a, 1]小的区间a,误差项以O[1/(N^4 a^4.5)]为界。这就是为什么要计算此间隔内的积分,网格应该非常密集以获得合理的误差范围。

simpson(0.0004, 1, N)产生以下值:

N      Result         Error
--------------------------------
20     2.549041009    0.5890
200    1.986462457    0.0265
2000   1.960181808    1.8181e-4
20000  1.960000049    4.9374e-8 
200000 1.960000000    5.0810e-12

并且的确,对于大的N,我们越来越接近精确值1.96,而误差为O(1/N^4)


-1
投票

如果我得到这个cout<<"Integral is: "<<" "<< int(simpson(0.0004, 1, 20) + 0.5) <<" "<<endl;应该解决它。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.