利用复化梯形积分和龙贝格积分法计算积分

本文提供了一种使用C++实现的数值积分方法,包括辛普森积分法(fuhuat函数)及龙贝格积分法(romberg函数),用于计算指定区间内的积分值。通过不断细化区间并迭代计算,最终获得高精度的积分结果。

 

#define EPS 0.0000001

#define maxd 20

 

double f(double x)

{

         if(x==0)

                   return 1.0;

         else

                   return sin(x)/x;

}

 

void fuhuat(double a,double b)//a,b积分区间

{

         int n=1,i;

         double t_2n,t_n,h=1.0,xnew,fnew,e=1.0+EPS;

         t_n=(f(a)+f(b))/2.0;

         cout<<"k="<<n<<""t"<<t_n<<endl;

         while (e>3*EPS)

         {

                   fnew=0.0;

                   for(i=1;i<=pow(2,n-1);i++)

                   {

                            xnew=a+(i-0.5)*h;

                            fnew=fnew+f(xnew);

                   }

                   t_2n=(t_n+h*fnew)/2.0;

 

                   cout<<"k="<<n<<""t"<<t_2n<<endl;

                  

                   e=fabs(t_2n-t_n);

                   t_n=t_2n;

                   n=n+1;

                   h=h/2.0;

         }

         cout<<"Total nodes="<<pow(2,n)+1<<endl;

}

 

void romberg(double a,double b)//a,b积分区间

{

         double t[maxd][4]={0},h=1.0,e=1+EPS;

         double fnew;

         int i,j,k=1,m;

         t[0][0]=h*(f(a)+f(b))/2.0;

         while((k<maxd)&&(e>EPS))

         {

                   fnew=0;

                   for(i=1;i<=pow(2,k-1);i++)

                            fnew=fnew+f(a+(i-0.5)*h);

                   t[k][0]=(t[k-1][0]+h*fnew)/2.0;

                   for(m=1;m<=k;m++)

                   {

                            if(m>3)

                                     break;

                            t[k][m]=(pow(4,m)*t[k][m-1]-t[k-1][m-1])/(pow(4,m)-1);

                   }

                   if(k>=4)

                            e=fabs(t[k][3]-t[k-1][3]);

                   k++;

                   h=h/2.0;

         }

         if(k>maxd)

                   cout<<"失败!"<<endl;

         else

         {

                   cout<<""tT"<<""t"t"<<"S"<<""t"t"<<"C"<<""t"t"<<"R"<<endl;

                   for(i=0;i<k;i++)

                   {

                            cout<<"k="<<i<<""t";

                            for(j=0;j<4;j++)

                                     if(i>=j)

                                               cout<<t[i][j]<<""t";

                            cout<<endl;

                   }

         }

                  

}

转载于:https://www.cnblogs.com/rosion/archive/2008/10/30/1323305.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值