龙贝格算法.cpp
Upload User: hks123456
Upload Date: 2014-01-27
Package Size: 18k
Code Size: 1k
Category:

Algorithm

Development Platform:

Visual C++

  1. #include<iostream.h>
  2. #include<math.h>
  3. float f(float x)
  4. {
  5. return 1/(1+x*x);
  6. }
  7. float Romberg(float a,float b,float (*f)(float),float epsilon)
  8. {
  9. int n=1,k;
  10. float h=b-a,x,temp;
  11. float T1,T2,S1,S2,C1,C2,R1,R2;
  12. T1=(b-a)/2*((*f)(a)+(*f)(b));
  13. while(1)
  14. {
  15. temp=0;
  16. for(k=0;k<=n-1;k++)
  17. {
  18. x=a+k*h+h/2;
  19. temp+=(*f)(x);
  20. }
  21. T2=(T1+temp*h)/2;
  22. if(fabs(T2-T1)<epsilon)
  23. return T2;
  24. S2=T2+(T2-T1)/3.0;
  25. if(n==1)
  26. {
  27. T1=T2;
  28. S1=S2;
  29. h/=2;
  30. n*=2;
  31. continue;
  32. }
  33. C2=S2+(S2-S1)/15;
  34. if(n==2)
  35. {
  36. C1=C2;
  37. T1=T2;
  38. S1=S2;
  39. h/=2;
  40. n*=2;
  41. continue;
  42. }
  43. R2=C2+(C2-C1)/63;
  44. if(n==4)
  45. {
  46. R1=R2;
  47. C1=C2;
  48. T1=T2;
  49. S1=S2;
  50. h/=2;
  51. n*=2;
  52. continue;
  53. }
  54. if(fabs(R2-R1)<epsilon)
  55. return R2;
  56. R1=R2;
  57. C1=C2;
  58. T1=T2;
  59. S1=S2;
  60. h/=2;
  61. n*=2;
  62. }
  63. }
  64. void main()
  65. {
  66. float epsilon=5e-6;
  67. cout<<"R="<<Romberg(0,1,f,epsilon)<<endl;
  68. }