发布时间 : 星期日 文章昆明理工大学数值分析上机报告4更新完毕开始阅读
double Func(double x) { return(log(1+x)/(1+x*x));
}
double SIMP1(double a1,double b1,int n1) { int i; double h,s; h=(b1-a1)/(2*n1);
s=0.5*(Func(a1)-Func(b1)); for(i=1;i<=n1;i++)
s+=2*Func(a1+(2*i-1)*h)+Func(a1+2*i*h);
return((b1-a1)*s/(3*n1));
}
double FUTX(double a1,double b1,int n1) { int i; double t,h; h=(b1-a1)/n1; t=Func(a1)+Func(b1); for (i=1;i<=n1;i++)
t+=2*Func(a1+i*h);
return((t*h/2));
}
//龙贝格数值积分算法 #include
double ROMBG(double,double,double,double,double,double);
4
double Func(double); void main() { double a,b,eps,al,ma,mi; // int n1; a=0.0; b=1.0; eps=1e-5; al=10; ma=10; mi=3;
printf(\// printf(\// printf(\
}
double Func(double x) { return(log(1+x)/(1+x*x));
}
double ROMBG(double a,double b,double eps,double al,double ma,double mi) { int j,q;
double l,h,r,s,k,l0,m,n; double *t;
t=(double *)calloc(11,sizeof(double)); if(t==NULL)
exit(1);
l=b-a; h=l;
t[0]=(Func(a)+Func(b))*l*0.5;
5
for(q=0;q<=ma-1;q++) { r=h; h*=0.5; k=h; s=Func(a+k); do { k+=r;
if(fabs(k) s+=Func(a+k); }while (fabs(k) for(j=q;j>=0;j--) { l0*=0.25; m=(t[j+1]-t[j])/(1-l0); t[j]+=m; } n=t[0]; if(fabs(n)>=al) m/=n; if(fabs(m) } } 6 r=t[0]; } free(t); return(r); 四、结果讨论和分析 复化梯形计算结果 复化Simpson计算结果 复化梯形计算结果 复化Simpson计算结果 n=10时的计算结果 n=20时的计算结果 Romberg计算结果 以上两个计算结果分别是n=10和n=20时复化梯形和复化Simpson数值积分算法所得到的结果,从以上结果分析可得到以下结论: 1、 两者虽然都需要调用f相同的次数,工作量基本相同,但是精度却差别很大,复化 Simpson明显高于复化梯形算法,故复化Simpson公式是一种精度较高的求积公式; 2、 从n的不同设定值,我们可以看出细分求积分区间可以提高该两类算法的计算精度,由 于Simpson算法在n=10时就有较高的精度,故对其影响并不是很大,复化梯形精度的提高比较明显; 3、 Romberg算法的计算精度明显高于上述两类算法,它的基本方法就是运用在变步长求积 的过程中运用加速公式,将梯形法则的积分值逐步加工成为精度较高的结果,是利用外推法构造出一种计算积分的方法,适用于求积分而很难求出其精确表达式的那些复杂函数。 综上所述,上述三种方法都是数值积分问题行之有效的办法。复化梯形和复化Simpson必须给出合适的步长;步长过大精度难保,步长过小计算量增加。要想事先给出一个合适的步长却是非常困难的。在实际计算中通常采用变步长的求积方案,即在步长逐次折半(步长 7