📄 jifen.c
字号:
#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)
{
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(4-sin(x)*sin(x));
}
double fun2(double x)
{
if (x==0)
return 1;
else
return sin(x)/x;
}
double fun3(double x)
{
return exp(x)/(4+x*x);
}
double fun4(double x)
{
return log(1+x)/(1+x*x);
}
main()
{
double a=0,b=1,c,c2,precision;
int i,n;
double (* p[5])(double);
p[1]=fun1;
p[2]=fun2;
p[3]=fun3;
p[4]=fun4;
printf("请输入要分的区间数:");
scanf("%d",&n);
for(i=1;i<=4;i++)
{
printf(" 第%d个函数积分,步长为:%g\n",i,(b-a)/n);
printf("用复化simpson公式积分得: ");
c=simpson(a,b,p[i],n);
printf("%f\n",c);
printf("用复化梯形公式积分得: ");
c=trapezia(a,b,p[i],n);
printf("%f\n",c);
}
printf("*****************给定精度的情况********************\n",i);
printf("请输入精度要求");
scanf("%lf",&precision);
for(i=1;i<=4;i++)
{
printf(" 第%d个函数:\n",i);
n=1;
printf("用复化simpson公式积分得:");
while(1)
{
c=simpson(a,b,p[i],n);
c2=simpson(a,b,p[i],2*n);
if(fabs(c-c2)<precision)
break;
n=2*n;
}
printf("%f 步长为:%f\n",c2,(b-a)/(2*n));
n=1;
printf("用复化梯形公式积分得:");
while(1)
{
c=trapezia(a,b,p[i],n);
c2=trapezia(a,b,p[i],2*n);
if(fabs(c-c2)<precision)
break;
else
n=2*n;
}
printf("%f 步长为:%f\n",c2,(b-a)/(2*n));
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -