计算方法上机实习题大作业(实验报告).
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算方法实验报告
班级: 学号: 姓名: 成绩:
1 舍入误差及稳定性
一、实验目的
(1)通过上机编程,复习巩固以前所学程序设计语言及上机操作指令;
(2)通过上机计算,了解舍入误差所引起的数值不稳定性
二、实验内容
1、用两种不同的顺序计算10000
21n n -=∑,分析其误差的变化 2、已知连分数()
101223//(.../)n n a f b b a b a a b =++++,利用下面的算法计算f : 11
,i n n i i i a d b d b d ++==+ (1,2,...,0)i n n =-- 0f d = 写一程序,读入011,,,...,,,...,,n n n b b b a a 计算并打印f
3、给出一个有效的算法和一个无效的算法计算积分
1
041n
n x y dx x =+⎰ (0,1,...,10)n = 4、设2211N N j S j ==-∑,已知其精确值为1311221N N ⎛⎫-- ⎪+⎝⎭
(1)编制按从大到小的顺序计算N S 的程序
(2)编制按从小到大的顺序计算N S 的程序
(3)按两种顺序分别计算10001000030000,,,S S S 并指出有效位数
三、实验步骤、程序设计、实验结果及分析
1、用两种不同的顺序计算100002
1n n -=∑,分析其误差的变化 (1)实验步骤:
分别从1~10000和从10000~1两种顺序进行计算,应包含的头文件有stdio.h 和math.h
(2)程序设计:
a.顺序计算
#include
#include
void main()
{
double sum=0;
int n=1;
while(1)
{
sum=sum+(1/pow(n,2));
if(n%1000==0)printf("sun[%d]=%-30f",n,sum);
if(n>=10000)break;
n++;
}
printf("sum[%d]=%f\n",n,sum);
}
b.逆序计算
#include
#include
void main()
{
double sum=0;
int n=10000;
while(1)
{
sum=sum+(1/pow(n,2));
if(n%1000==0)
printf("sum[%d]=%-30f",n,sum);
if(n<=1)break;
n--;
}
printf("sum[%d]=%f\n",n,sum);
}
(3)实验结果及分析:
程序运行结果:
a.顺序计算
b.逆序计算
结果分析:两种不同顺序计算结果是一样的,顺序计算误差从一开始就很小,而逆序计算误差最开始十分大,后来结果正确。
2、已知连分数()101223//(.../)n n a f b b a b a a b =+
+++,计算f : (1)实验步骤:
利用 11
,i n n i i i a d b d b d ++==+ (1,2,...,0)i n n =--,0f d =,计算f (2)程序设计
#include
#include
void main()
{
int i=0,n;
float a[1024],b[1024],d[1024];
printf("please input n,n=");
scanf("%d",&n);
printf("\nplease input a[1] to a[n]:\n");
for(i=1;i<=n;i++)
{
printf("a[%d]=",i);
scanf("%f",&a[i]);
}
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)实验结果
程序运行结果:
3、给出一个有效的算法和一个无效的算法计算积分
1
041n
n x y dx x =+⎰ (0,1,...,10)n = (1)实验步骤
利用C 语言编写程序,分别使用数值稳定的和数值不稳定的计算公式所建立的递推公式进行计算。
(2)程序设计
#include
#include
main()
{
double y_0=(1/4.0)*log(5),y_1;
double y_2=(1.0/55.0+1.0/11.0)/2,y_3;
int n=1,m=10;
printf("有效算法输出结果:\n");
printf("y[0]=%-20f",y_0);
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;