计算方法实验报告
- 格式:doc
- 大小:58.50 KB
- 文档页数:5
计算方法实验报告
实验目的:
1.掌握数值积分的基础知识,并学会badxxf)(近似算法。
2.将算法与理论值做比较,观测它的精确程度
实验方法描述:
1. 算法流程图
(1) Romberg算法的流程图
T1 T2 T4 T8 T16
S1
S2 S4 S8 C1 C2 C4
R1
R2
开始
输入a,b与n
h= (b-a)/n ;
f=exp(x)
x=a+h/2
y=f(x)
S2=S2+y S1=S1+y
子段中点
子段边点
X<
>=
Sn=h/6*(y(a)+4*S2+2*S1+y(b))
输出Sn,结束
(2)复化Simpson 求积公式流程图
2. 输入与输出
(1) 复化求积法(复化Simpson公式)
# include
# include
void main()
{ int n,i;
float a,b,h; double s1,s2,sn;
float x[1000];
double y[1000];
scanf(“%d”,&n); scanf(“%f%f”,&a,&b); s1=0; s2=0;
h=(b-a)/n; x[0]=a; x[2*n]=b; y[0]=exp(a); y[2*n]=exp(b);
for(i=1;i<2*n;i++)
{ x[i]=x[0]+i*h/2;
y[i]=exp(x[i]);
if(i%2==0)
s1=s1+y[i];
else
s2=s2+y[i];
}
sn=(h/6)*(y[0]+4*s2+2*s1+y[2*n]);
printf(“I=sn=%f\n”,sn);
}
(2) Romberg算法的计算流程
# include
# include
void main()
{ float x[9],x0,x1,h; double T1,T2,T4,T8,S1,S2,S4,C1,C2,R1;
double y[9];
int i;
scanf(“%f%f”,&x0,&x1);
h=(x1-x0)/8; x[0]=x0; x[8]=x1; y[8]=sin(x1)/x1;
for(i=0;i<8;i++)
{ x[i]=x[0]+i*h;
y[i]=sin(x[i])/x[i];
}
T1=(x1-x0)/2*(y[0]+y[8]);
T2=T1/2+(x1-x0)*y[4]/2;
T4=T2/2+(x1-x0)*(y[2]+y[6])/4;
T8=T4/2+(x1-x0)*(y[1]+y[3]+y[5]+y[7])/8;
S1=4*T2/3-T1/3;
S2=4*T4/3-T2/3;
S4=4*T8/3-T4/3;
C1=16*S2/15-S1/15;
C2=16*S4/15-S2/15;
R1=64*C2/63-C1/63;
printf(“I=R1=%lf\n”,R1);
}
(3) Rn的通用型程序如下:
# include
# include
void main()
{ double x[1000],y[1000],z[2000],w[4000],a[1000],b[1000],c[2000],d[4000];
int n,i,j; double x0,x1,h,S1,Tn,S2,Tnn,S3,Tnnnn,S4,S5;
double Tnnnnnnnn,Sn,Snn,Snnnn,Cn,Cnn,Rn;
scanf("%d%lf%lf",&n,&x0,&x1);
h=(x1-x0)/n; x[0]=x0; x[n]=x1; a[0]=sin(x0)/x0; a[n]=sin(x1)/x1;
S1=0; S2=0; S3=0; z[0]=0; S4=0; S5=0;
for(i=1;i
a[i]=sin(x[i])/x[i];
S1=S1+a[i];
}
Tn=h/2*(a[0]+2*S1+a[n]);
for(j=1;j
b[j]=sin(y[j])/y[j];
S2=S2+b[j];
}
Tnn=Tn/2+h/2*S2;
for(i=1;i
z[2*i]=(y[i]+x[i])/2;
c[2*i-1]=sin(z[2*i-1])/z[2*i-1];
c[2*i]=sin(z[2*i])/z[2*i];
S3=S3+c[2*i-1]+c[2*i];
}
Tnnnn=Tnn/2+h/4*S3;
for(i=1;i
w[4*i+1]=(z[2*i+1]+x[i])/2;
d[4*i]=sin(w[4*i])/w[4*i];
d[4*i+1]=sin(w[4*i+1])/w[4*i+1];
S4=S4+d[4*i]+d[4*i+1];
}
for(i=1;i
w[4*i-1]=(z[2*i]+y[i])/2;
d[4*i-2]=sin(w[4*i-2])/w[4*i-2];
d[4*i-1]=sin(w[4*i-1])/w[4*i-1];
S5=S5+d[4*i-2]+d[4*i-1];
}
w[1]=(x[0]+z[1])/2; d[1]=sin(w[1])/w[1];
w[4*n]=(x[n]+z[2*n])/2; d[4*n]=sin(w[4*n])/w[4*n];
Tnnnnnnnn=Tnnnn/2+h/8*(d[1]+S5+S4+d[4*n]);
Sn=4*Tnn/3-Tn/3; Snn=4*Tnnnn/3-Tnn/3;
Snnnn=4*Tnnnnnnnn/3-Tnnnn/3;
Cn=16*Snn/15-Sn/15; Cnn=16*Snnnn/15-Snn/15;
Rn=64*Cnn/63-Cn/63;
printf("Rn=%lf\n",Rn);
}
实验数据验证
通过代入数据进行验证,复化Simpson求积公式与Romberg算法与实际积分值
b
a
dxxf)(
近似相等,进而积分值能用这两个公式作近似运算。
实验结论:
(1)复化Simpson公式:
b
a
dxxf)(
=Sn=)]()(2)(4)([6101021bfxfxfafnabniinii
(2)Romberg算法:
b
a
dxxf)(
=
n
R
n
R
=nnCC63163642
nnnSSC15115162
nnnTTS31342