|
//Visual C++复化梯形公式法与复化simpson法求曲线f(x)=10/x在区间[1,10]上的长度//
#include <math.h>
#include <stdio.h>
double trapezia(double a,double b,double (*fun)(double),int n)//复化梯形公式法//
{
double Tn=0.0;
double h;
int k;
h=(b-a)/n;
for(k=1;k<n;k++)
Tn+=(*fun)(a+k*h);
Tn=(*fun)(a)+(*fun)(b)+2*Tn;
Tn=h*Tn/2;
return Tn;
}
double simpson(double a, double b, double (*fun)(double), int n)//复化simpson法//
{ double T2n,Tn;
Tn=trapezia(a,b,fun,n);
T2n=trapezia(a,b,fun,2*n);
return (4*T2n-Tn)/3;
}
double fun1(double x)
{
return sqrt(1.0000+100.0000/(x*x*x*x));
}
main()
{
double a=1,b=10,c;
int i,n;
double (* p[2])(double);
p[1]=fun1;
printf("请输入要分的区间数:");
scanf("%d",&n);
{
printf("第%d个函数积分,步长为:%g\n",1,(b-a)/n);
printf("用复化simpson公式积分得: ");
c=simpson(a,b,p[1],n);
printf("%f\n",c);
printf("用复化梯形公式积分得: ");
c=trapezia(a,b,p[1],n);
printf("%f\n",c);
}
}
结果:区间划分为1000000份。
复化梯形公式法:14.608456;
复化simpson法:14.608456。 精度足够。eps<0.00001.
|
|