simp.c
上传用户:bjtelijie
上传日期:2010-01-01
资源大小:87k
文件大小:1k
源码类别:

数学计算

开发平台:

Visual C++

  1. #include <stdio.h>
  2. #include <math.h>
  3. double Function(double);
  4. double SIMP1(double,double,int);
  5. double SIMP2(double,double,double);
  6. void main()
  7. {
  8. double a1,b1,eps;
  9. int n1;
  10. double Result1;
  11. double Result2;
  12. a1 = 0.0;
  13. b1 = 0.8;
  14. n1 = 4;
  15. eps = 5e-7;
  16. Result1 = SIMP1(a1,b1,n1);
  17. Result2 = SIMP2(a1,b1,eps);
  18. printf("利用定步长辛普生积分结果为:n");
  19. printf("I1 = %.10fn",Result1);
  20. printf("利用变步长辛普生积分结果为:n");
  21. printf("I2 = %en",Result2);
  22. }
  23. double SIMP1(a,b,n)
  24. double a;
  25. double b;
  26. int n;
  27. {
  28. int i;
  29. double h,s;
  30. h=(a-b)/(2*n);
  31. s=0.5*(Function(a)-Function(b));
  32. for(i=1;i<=n;i++)
  33. s+=2*Function(a+(2*i-1)*h)+Function(a+2*i*h);
  34. return((b-a)*s/(3*n));
  35. }
  36. double SIMP2(a,b,eps)
  37. double a;
  38. double b;
  39. double eps;
  40. {
  41. int k,n;
  42. double h,t1,t2,s1,s2,p,x;
  43. n=1;
  44. h=b-a;
  45. t1=h*(Function(a)+Function(b))/2;
  46. s1 = t1;
  47. while(1)
  48. {
  49. p = 0;
  50. for(k=0;k<=n;k++)
  51. {
  52. x = a+(k+0.5)*h;
  53. p+=Function(x);
  54. }
  55. t2=(t1+h*p)/2;
  56. s2=(4*t2-t1)/3;
  57. if(fabs(s2-s1)>=eps)
  58. {
  59. t1=t2;
  60. n=n+n;
  61. h=h/2;
  62. s1=s2;
  63. continue;
  64. }
  65. break;
  66. }
  67. return(s2);
  68. }
  69. double Function(double x)
  70. {
  71. return(cos(x));
  72. }