昆明理工大学数值分析上机报告4 联系客服

发布时间 : 星期四 文章昆明理工大学数值分析上机报告4更新完毕开始阅读886a77dd81c758f5f61f67f3

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 #include #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)mi) { r=t[0]; free(t); return(r);

}

}

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