复合辛普森规则无穷大输出

时间:2019-12-08 16:19:39

标签: c++ algorithm math calculus

算法:enter image description here

我有以下代码,使用复合Simpson规则计算不正确的积分,我试图评估exp(-x)/sqrt(1-x)a= 0的积分b = 1,而n=6或步骤= 6。但是,当输出应该为= 4.288

时,我一直保持输出为无穷大
#include <cmath>
#include <iostream>
using namespace std;

    double f(double x)
    {


        return exp(-x)/sqrt(1-x);
    }

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

    double x0=f(a)+f(b);

    double x1=0,x2=0;
    double x=0;
    double h=(b-a)/(n);
    for(int i = 1 ; i <n;i++){

            x=a+(h*i);
            if(i%2==0)
            {
                x2=x2+f(x);
            }
            else
            {
                x1=x1+f(x);
            }


        }
            return (h*(x0+2*x2+4*x1))/3;
;
    }

     int main(){
          cout<<endl;
               cout<<"The improper integral is: "<<simpson(0.00000009,1,6)<<" "<<endl;
               cout<<endl;
        }

1 个答案:

答案 0 :(得分:1)

我认为您的问题是,您正在评估的函数f(double x)未定义为x = 1,因为它等于exp(-1)/sqrt(1 - 1)除以零,但是您正在调用{{1 }}在f(b)的第一行中,当b为1时,您将返回无穷大。您可能希望将b设置为0.9999。如果使用更大的n值进行此处理以更接近实际曲线(例如n = 400),则将非常接近@macroland在Wolfram Alpha上找到的1.076的实际答案。