ep8_10.cpp
上传用户:wxcui2006
上传日期:2022-07-12
资源大小:1274k
文件大小:4k
源码类别:

书籍源码

开发平台:

Visual C++

  1. /*8.10 矩形法(rectangle)积分近似计算公式为:dx(y0+y1+...+y(n-1));
  2. 梯形法(ladder)积分近似计算公式为:dx(y0+2*(y1+y2+...+y(n-i))+yn)/2 
  3. 辛普生法(simpson)积分近似计算公式(n为偶数)为:dx(y0+yn+4*(y1+y3+...+y(n-1))+2*(y2+y4+...+y(n-2))))
  4.  
  5. 被积函数用派生类引入。
  6. 基类(integer)成员数据包括:积分上下限b和a;分区数n;步长step=(b-a)/n,积分值result。定义积分函数integerate()为虚函数,它只显示提示信息。
  7. 派生的矩形法类(rectangle)重定义integerate(),采用矩形法作积分运算。
  8. 派生的梯形法类(ladder)和辛普生法(simpson)类似。
  9. 请编程,用三种方法对下列被积函数
  10. (1) sin(x),下限为0.0和上限为π/2;
  11. (2) exp(x),下限为0.0和上限为1.0;
  12. (3) 4.0/(1+x*x),下限为0.0和上限为1.0。
  13. 进行定积分计算,并比较积分精度。*/
  14. #include<iostream>
  15. #include<cmath>
  16. using namespace std;
  17. class Base{
  18. protected:
  19. double result,a,b,step;//Intevalue积分值,a积分下限,b积分上限
  20. int n;
  21. public:
  22. virtual double fun(double x)=0;//被积函数声明为纯虚函数
  23. virtual void Integerate(){
  24. cout<<"这里是积分函数"<<endl;
  25. }
  26. Base(double ra=0,double rb=0,int nn=2000){
  27. a=ra;
  28. b=rb;
  29. n=nn;
  30. result=0;
  31. }
  32. void Print(){
  33. cout.precision(15);
  34. cout<<"积分值="<<result<<endl;
  35. }
  36. };
  37. class Rectangle:public Base{
  38. public:
  39. void Integerate(){
  40. int i;
  41. step=(b-a)/n;
  42. for(i=0;i<=n;i++) result+=fun(a+step*i);
  43. result*=step;
  44. }
  45. Rectangle(double ra,double rb,int nn):Base(ra,rb,nn){}
  46. };
  47. class Ladder:public Base{
  48. public:
  49. void Integerate(){
  50. int i;
  51. step=(b-a)/n;
  52. result=fun(a)+fun(b);
  53. for(i=1;i<n;i++) result+=2*fun(a+step*i);
  54. result*=step/2;
  55. }
  56. Ladder(double ra,double rb,int nn):Base(ra,rb,nn){}
  57. };
  58. class Simpson:public Base{
  59. public:
  60. void Integerate(){
  61. int i;
  62. step=(b-a)/n;
  63. result=fun(a)+fun(b);
  64. for(i=1;i<n;i+=2) result+=4*fun(a+step*i);
  65. for(i=2;i<n;i+=2) result+=2*fun(a+step*i);
  66. result*=step/3;
  67. }
  68. Simpson(double ra,double rb,int nn):Base(ra,rb,nn){}
  69. };
  70. class sinR:public Rectangle{//矩形法和梯形法采用并列结构
  71. public:
  72. sinR(double ra,double rb,int nn):Rectangle(ra,rb,nn){}
  73. double fun(double x){return sin(x);}
  74. };
  75. class sinL:public Ladder{
  76. public:
  77. sinL(double ra,double rb,int nn):Ladder(ra,rb,nn){}
  78. double fun(double x){return sin(x);}
  79. };
  80. class expR:public Rectangle{
  81. public:
  82. expR(double ra,double rb,int nn):Rectangle(ra,rb,nn){}
  83. double fun(double x){return exp(x);}
  84. };
  85. class expL:public Ladder{
  86. public:
  87. expL(double ra,double rb,int nn):Ladder(ra,rb,nn){}
  88. double fun(double x){return exp(x);}
  89. };
  90. class otherR:public Rectangle{
  91. public:
  92. otherR(double ra,double rb,int nn):Rectangle(ra,rb,nn){}
  93. double fun(double x){return (4.0/(1+x*x));}
  94. };
  95. class otherL:public Ladder{
  96. public:
  97. otherL(double ra,double rb,int nn):Ladder(ra,rb,nn){}
  98. double fun(double x){return (4.0/(1+x*x));}
  99. };
  100. class sinS:public Simpson{//辛普生法采用层次结构
  101. public:
  102. sinS(double ra,double rb,int nn):Simpson(ra,rb,nn){}
  103. double fun(double x){return sin(x);}
  104. };
  105. class expS:public sinS{
  106. public:
  107. expS(double ra,double rb,int nn):sinS(ra,rb,nn){}
  108. double fun(double x){return exp(x);}
  109. };
  110. class otherS:public expS{
  111. public:
  112. otherS(double ra,double rb,int nn):expS(ra,rb,nn){}
  113. double fun(double x){return (4.0/(1+x*x));}
  114. };
  115. int main(){
  116. Base *bp;
  117. sinR sr(0.0,3.1415926535/2.0,100);
  118. bp=&sr;
  119. bp->Integerate();//动态,可以访问派生类定义的被积函数
  120. bp->Print();
  121. sinL sl(0.0,3.1415926535/2.0,100);
  122. bp=&sl;
  123. bp->Integerate();//动态,可以访问派生类定义的被积函数
  124. bp->Print();
  125. sinS ss(0.0,3.1415926535/2.0,100);
  126. bp=&ss;
  127. bp->Integerate();//动态,在层次中选
  128. bp->Print();
  129. expR er(0.0,1.0,100);
  130. bp=&er;
  131. bp->Integerate();//动态,可以访问派生类定义的被积函数
  132. bp->Print();
  133. expL el(0.0,1.0,100);
  134. bp=&el;
  135. bp->Integerate();//动态,可以访问派生类定义的被积函数
  136. bp->Print();
  137. expS es(0.0,1.0,100);
  138. bp=&es;
  139. bp->Integerate();//动态,在层次中选
  140. bp->Print();
  141. otherR or(0.0,1.0,100);
  142. bp=&or;
  143. bp->Integerate();//动态,可以访问派生类定义的被积函数
  144. bp->Print();
  145. otherL ol(0.0,1.0,100);//增加到100000也达不到辛普生法的精度
  146. bp=&ol;
  147. bp->Integerate();//动态,可以访问派生类定义的被积函数
  148. bp->Print();
  149. otherS os(0.0,1.0,100);
  150. bp=&os;
  151. bp->Integerate();//动态,在层次中选
  152. bp->Print();
  153. return 0;
  154. }