#include "stdio.h"
#include "conio.h"
#include "math.h"
#define EPS 1e-6
main()
{
double s;
double f(double);
double AutoTrap(double(*)(double),double,double,double);
s = AutoTrap(f , 0.0 , 1.0, EPS);
getch();
}
double f(double x) { return 4/(1+x*x);} /* f(x)表达式 */
double AutoTrap(double(*f)(double),double a,double b,double eps)
{ /* a , b 为积分上、下限, eps 为绝对误差限 */
int n=1,k;
double h;
double T1,Tn,sum ;
h= (b-a)/2; /* h为变步长 */
Tn = h*( f(a) + f(b) );
printf("T(\t%d) =\t%f",n,Tn);
do{
T1 = Tn;
sum = 0.0 ;
for( k =1 ; k<= n; k++)
sum = sum + f( ( a+(2*k-1)*h ) ); /*区间【a,b】n等分,记分点为 x = Xk = a + k*h */
Tn = (T1/2)+( h*sum );/* 复合梯形公式的转变 */
n=n*2;
h=h/2;
printf("\nT(\t%d) =\t%f",n,Tn);
} while( fabs(Tn - T1) > eps ); /* 误差不超过 1e-6 时输出,否则不输出 */
return Tn;
}