内容发布更新时间 : 2024/11/14 12:02:18星期一 下面是文章的全部内容请认真阅读。
进一步改进Gauss-Seidel,并且比Jacobi,Gauss-Seidel方法收敛速度快,改变松弛因子的取值范围来可以得到Jacobi,Gauss-Seidel方法.
课题四 数值积分
一、问题提出
选用复合梯形公式,复合Simpson公式,Romberg算法,计算
14(1) I =
1?0? 4?sin2xdx ?I?1.5343916?f(0)?1, I?0.9460831?
(2) I =
sinxdx?x01ex(3) I = ?dx 204?x(4) I =
二、要求
1、 编制数值积分算法的程序;
2、 分别用两种算法计算同一个积分,并比较其结果;
3、 分别取不同步长h?? b?a ?/n,试比较计算结果(如n = 10, 20等); 4、 给定精度要求?,试用变步长算法,确定最佳步长。 三、目的和意义
1、 深刻认识数值积分法的意义; 2、 明确数值积分精度与步长的关系;
根据定积分的计算方法,可以考虑二重积分的计算问题。 四.程序及流程图: 计算函数
ln?1?x?dx 2?01?x1sinx x
1,复化simpson:
#include
double a=0,b=1;
int n=10; //或 20 double h=(b-a)/n; double f0,f1,f2; f0=1;
f0+=sin(b)/b; f1=0;f2=0;
for(int j=1;j<=n-1;j++) {
double x=a+j*h; if(j/2==(j+1)/2) f2=f2+sin(x)/x; else f1=f1+sin(x)/x; }
double s=h*(f0+2*f2+4*f1)/3; printf(\}
2,Romberg法:
#include
double rombf(double x) {
double y; if(x==0) y=1;
else y=(sin(x)/x); return(y); }
double romb(double a,double b,double eps,double(*f)(double)) {
int m,n,i,k;
double y[10],h,ep,p,x,s, q; h=b-a;
y[0]=h*(f(a)+f(b))/2.0; m=1; n=1;
ep=eps+1.0;
while ((ep>=eps)&&(m<=9)) {
p=0.0;
for (i=0;i<=n-1;i++) {
x=a+(i+0.5)*h;
p=p+f(x); }
p=(y[0]+h*p)/2.0; s=1.0;
for (k=1;k<=m;k++) {
s=4.0*s;
q=(s*p-y[k-1])/(s-1.0); y[k-1]=p; p=q; }
ep=fabs(q-y[m-1]); m=m+1; y[m-1]=q; n=n+n; h=h/2.0; }
return(q); }
void main() {
double a=0.0,b=1.0,esp=0.000001,t,rombf(double); t=romb(a,b,esp,rombf);
printf(\计算法:\\n\ printf(\ printf(\}
五。运行结果:
Simpson n=10
n=20
Romberg
四、程序运行结果讨论和分析
复化求积公式能提高精度,但需要选取合适的步长,步长取得太大难以保证精度,步长小有容易导致计算量大大增加。本题对于Simpson公式法步长为20时较10时精度高,能够满足精度要求。