高分 数值分析问题

(1) 编制数值积分的复合梯形算法程序。
(2) 编制数值积分的复合辛普森算法程序。
(3) 编制数值积分的龙贝格算法程序。
(4) 分别用上述三种算法计算积分的近似值,使误差小于10-12。考察三种算法的迭代次数和所需要计算被积函数值的个数
需要计算的函数为sin(x)/x积分线为0到1.

这里有我刚刚做好的复合梯形和Simpson算法程序,应该是对的。不知对你是否有用
#include "stdio.h"
#include "math.h"
int main()
{
int i,n,tempn;
double h,a=0,b=0,x[100],fx[100],Tn,Sn,temp1=0,temp2=0;
double tempx[100],tempfx[100];
FILE *f;
f=fopen(".\\shuju.txt","r");
fscanf(f,"%d",&n);
for(i=0;i<n;i++)
{
fscanf(f,"%lf%lf",&x[i],&fx[i]);
}
a=x[0];
b=x[n-1];
h=(b-a)/(n-1.0);
for(i=1;i<(n-1);i++)
temp1=temp1+(2*fx[i]);
Tn=(h/2.0)*(fx[0]+fx[n-1]+temp1);
printf("利用复化梯形公式得到所需时间为:");
printf("%lf\n\n",Tn);
//上面利用复化梯形公式,下面利用复化Simpson公式
if((n%2)==0)
/*分请情况讨论,若数据组总数为偶数,则去删除某一组数据(或第一组,或最后一组)
得出的答案,否则,不用删除*/
{
printf("\n数据组总数是偶数的情况——\n");
tempn=n;
for(i=0;i<n-1;i++)
{
tempx[i]=x[i];
tempfx[i]=fx[i];
}
printf("删除第一组数据的情况如下:\n");
for(i=0;i<n-2;i++)
{
tempx[i]=tempx[i+1];
tempfx[i]=tempfx[i+1];
}
for(i=2;i<n-2;i=i+2)
temp1=temp1+(2*tempfx[i]);
for(i=1;i<n-2;i=i+2)
temp2=temp2+(4*tempfx[i]);
a=tempx[0];
b=tempx[n-2];
h=(b-a)/(n-2.0);
Sn=(h/6.0)*(tempfx[0]+tempfx[n-2]+temp1+temp2);
printf("利用复化Simpson公式得到所需时间为:");
printf("%lf\n\n",Sn);

printf("删除最后一组数据的情况如下:\n");
x[n-1]=0;
fx[n-1]=0;
for(i=2;i<n-2;i=i+2)
temp1=temp1+(2*fx[i]);
for(i=1;i<n-2;i=i+2)
temp2=temp2+(4*fx[i]);
a=x[0];
b=x[n-2];
h=(b-a)/(n-2.0);
Sn=(h/6.0)*(fx[0]+fx[n-2]+temp1+temp2);
printf("利用复化Simpson公式得到所需时间为:");
printf("%lf\n\n",Sn);
}
else
{
printf("\n数据组总数是奇数的情况——\n");
for(i=2;i<n-1;i=i+2)
temp1=temp1+(2*fx[i]);
for(i=1;i<n-1;i=i+2)
temp2=temp2+(4*fx[i]);
Sn=(h/6.0)*(fx[0]+fx[n-1]+temp1+temp2);
printf("利用复化Simpson公式得到所需时间为:");
printf("%lf\n\n",Sn);
}
return 0;
}
温馨提示:答案为网友推荐,仅供参考