1.自动选取步长梯形法算法:

 1 /************************************************************************/
 2 /* 自动选取步长梯形法算法
 3 /* 课本P83页
 4 /* 可以通过freopen方法从文本读入数据
 5 /************************************************************************/
 6 #include<iostream>
 7 #include<cmath>
 8 #include<string>
 9 using namespace std;
10 //积分函数
11 double f(double x)
12 {
13     //要求积分的函数,返回在x出的函数值
14     return 2/(1+x*x);
15 }
16 //自动选取步长梯形法算法:返回积分近似值,积分区间为[a,b],精度为e
17 double autoStepTrapezoidalMethod(double a,double b,double e)
18 {
19     double h=(b-a)/2;
20     double T0=0,T1=0,S=0;//T0表示前次积分近似值,T1表示后次积分近似值
21     int n=1;  //把积分区间[a,b]n等分
22     T1=(f(a)+f(b))*h;
23     int k=0;
24     do
25     {
26         T0=T1;
27         S=0;
28         for (k=1;k<=n;k++)
29          {
30              S=S+f(a+(2*k-1)*(h/n));
31          }
32         T1=T0/2+S*h/n;
33         n=2*n;
34     }while(T1-T0>=3*e);
35     return T1;
36 }
37 
38 int main()
39 {
40     //freopen("in.txt","r",stdin);
41     cout<<autoStepTrapezoidalMethod(0,1,0.00001)<<endl;
42     system("pause");
43 
44 }
View Code