Romberg积分法计算定积分(C语言)

原创 2012年03月30日 18:48:49

/*
-------------Romberg积分法计算定积分-------
参考教材:《数值分析》李乃成,梅立泉,科学出版社
    《计算方法教程》第二版 凌永祥,陈明逵*/

//误差界eps%被积函数为f(x)=(x^3+sin(x))/x;积分区间为[0.3,0.8]

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

int main(void)
{
/* int i,j,n;

 float *d=(float *)malloc(sizeof(float)*N);
 float *x=(float *)malloc(sizeof(float)*N);
 float *y=(float *)malloc(sizeof(float)*N);
 float *u=(float *)malloc(sizeof(float)*N);

 free(a);free(b);free(c);free(d);free(x);free(y);free(l);
 
 return 0;
*/

 double b=0.8;
 double a=0.3;
 double h=0.0; //
 double eps=1.0e-5;//误差界eps
 int kmax=20; //最大递推次数
 double T1=0.0,S1=0.0,C1=0.0,R1=0.0,T2=0.0,S2=0.0,C2=0.0,R2=0.0;
 double sum;
 double *x,*fx;
 int i;
 h=b-a;
 T1=h/2*((pow(a,3)+sin(a))/a+(pow(b,3)+sin(b))/b);
 printf("T1:%13.12f\n",T1);
 for(int k=0;k<kmax;k++)
 {
  h=(b-a)/(pow(2,k+1));
  x=(double *)malloc(sizeof(double)*int(pow(2,k)));
  for(i=0;i<pow(2,k);i++)
  {
   x[i]=a+(2*i+1)*h;
  }
  fx=(double *)malloc(sizeof(double)*int(pow(2,k)));
  sum=0.0;
  for(i=0;i<pow(2,k);i++)
  {
   fx[i]=(pow(x[i],3)+sin(x[i]))/x[i];
   sum+=fx[i];
  }
  T2=T1/2+sum*h;
  printf("T2:%13.12f\n",T2);
  S2=T2+(T2-T1)/3;
  printf("S%d:%13.12f\n",int(pow(2,k)),S2);
  if(k<2)
  {
   if(k==1)
   {
    C2=S2+(S2-S1)/15;
    printf("C1:%13.12f\n",C2);
   }
  }
  else
  {
   C2=S2+(S2-S1)/15;
   printf("C%d:%13.12f\n",int(pow(2,k-1)),C2);
   R2=C2+(C2-C1)/63;
   printf("R%d:%13.12f\n",int(pow(2,k-2)),R2);
   if(fabs(R2-R1)<eps)
    break;
   R1=R2;
  }
 T1=T2;S1=S2;C1=C2;

  free(x);free(fx);
 }
 printf("所求积分I=%13.12f\n",R2);

 return 0;
}

相关文章推荐

Romberg求积分算法

// Integral-romberg方法求积分.cpp : 定义控制台应用程序的入口点。 // /* romberg方法求积分 方法也称为逐次分半加速法。它是在梯形公式,simpson公式和newt...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Romberg(龙贝格)求积公式求解数值积分时的注意事项

《数值分析》第5版(李庆扬编著)的第四章课后习题第8-(2)题中,要求使用Romberg(龙贝格)求积公式求解f(x)=xsinx在区间[0,2pi]上的积分,要求误差小于10^(-5)。 针对此问...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Romberg法求定积分

1 实验题目:2 算法组织:2.1 算法原理:由梯形算法可以推得:,这里h为2n个区间的步长,即h = (b - a) / 2n;如果有2^n个相同的子区间,则上式变为:,这里hn为2^n个区间的步长...

数值作业:龙贝格算法计算积分C语言实现

根据Romberg算法计算定积分,和变步长的Simpson算法的输入都一样.算法基本分析:输入a,b(积分上下限),n为积分区间等分数,eps为计算精度,我这里1e-7,代表0乘以10的负6次方.本题...

第4.4节 换元积分法

4.4 INTEGRATION  BY  CHANGE  OF  VARIABLES    We haveseen that the sum, constant, and power rule...

hdu 1724 Ellipse(Simpson积分法)

Ellipse Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...
  • WEYuLi
  • WEYuLi
  • 2014年08月04日 20:49
  • 495

基于opencv的一种局部自适应快速二值化方法(积分法)

由于用opencv自带的函数adaptiveThreshold()在光照不均匀的图像中进行二值化时,效果不佳,之后看了Derek Bradley和Gerhard Roth于2007年写的《Adapt...

Acdream 1234 Two Cylinders(自适应辛普森积分法)

传送门 Two Cylinders Special Judge Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Romberg积分法计算定积分(C语言)
举报原因:
原因补充:

(最多只允许输入30个字)