计算方法与实习上机题答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实习题1
1用两种不容的顺序计算
644834.11000
1
2
≈∑=-n n
,分析误差的变化
(1)顺序计算 源代码:
#include
结果:
(2)逆序计算 源代码:
#include
if(n%1000==0) printf("sum[%d]=%-30f",n,sum); if(n<=1)break; n --;
} printf("sum[%d]=%f\n",n,sum);
}
结果:
2已知连分数
))//(.../(322101
n n b a a b a b a b f ++++
=
利用下面的方法计算f:
1
1
)0,...,2,1(,d f n n i d a b d b d i i i i n n =--=+==++
写一个程序,读入n,n n b a ,,计算并打印f 源代码:
#include
} printf("\nplease input b[0] to b[n]:\n"); for(i=0;i<=n;i++) { printf("b[%d]=",i); scanf("%f",&b[i]); } d[n]=b[n]; for(i=n -1;i>=0;i --) d[i]=b[i]+a[i+1]/d[i+1]; printf("\nf=%f\n",d[0]); } 结果:
3给出一个有效的算法和一个无效的算法计算积分
⎰=+=10
)10,...1,0(14n dx x x y n n
源代码:
#include
while(1) { y_1=1.0/(4*n)+y_0/(-4.0); printf("y[%d]=%-20f",n,y_1); if(n>=10) break; y_0=y_1; n++; if(n%3==0) printf("\n"); }
printf("\n 无效算法的输出结果:\n"); printf("y[10]=%-20f",y_2); while(1) { y_3=1.0/n -4.0*y_2; printf("y[%d]=%-20f",m -1,y_3); if(m<=1) break; y_2=y_3; m --; if(m%2==0) printf("\n"); }
}
结果:
4设∑
=-=
N
j N j S 2
211
,已知其精确值为
)1
1123(21+--N N (1)编制按从小到大顺序计算N S 的程序 (2)编制按从小达到的顺序计算N S 的程序
(3)按两种顺序分别计算30000100001000,,S S S ,并指出有效位数
源代码:
#include
\nSN[1000]=%f\nSN[10000]=%f\nSN[30000]=%f\n",SN[1000],SN[10000],SN[30000]); SN[2]=(3.0/2-1.0/2.0-1/3.0)/2.0; for(N=3;N<=30000;N++) SN[N]=SN[N -1]+1.0/(N*N -1); printf("从小到大顺序计算:
\nSN[1000]=%f\nSN[10000]=%f\nSN[30000]=%f\n",SN[1000],SN[10000],SN[30000]); } 结果:
实习题2 1.用牛顿法求下列方程的根
2=-x e x
01=-x xe 02lg =-+x x
源代码:
#include
typedef float (*p)(float ); float ff1(float x) { return x*x -exp(x); }
float ff2(float x) { return x*exp(x)-1; }
float ff3(float x) { return log(x)+x -2; }
float answer(float(*p)(float)) { int k=2; float m=1,n=-1,x2,a,b,c; if (p==ff3)n=2; printf("x[0] = %.4f, x[1] = %.4f, ",m,n); while (1) { if (fabs(m -n)<1e -4) break; a=p(n)*(n -m); b=p(n)-p(m); c=a/b; x2=n -c; m = n; n = x2; printf("x[%d] = %.4f, ",k,x2); k++; if (k%3==0) printf("\n"); }