计算方法上机实习题大作业(实验报告)

  • 格式:doc
  • 大小:2.01 MB
  • 文档页数:48

.专业整理.

.学习帮手. 计算方法实验报告

班级: 学号: 姓名: 成绩:

1 舍入误差及稳定性

一、实验目的

(1)通过上机编程,复习巩固以前所学程序设计语言及上机操作指令;

(2)通过上机计算,了解舍入误差所引起的数值不稳定性

二、实验内容

1、用两种不同的顺序计算1000021nn,分析其误差的变化

2、已知连分数101223//(.../)nnafbbabaab,利用下面的算法计算f:

11,inniiiadbdbd (1,2,...,0)inn 0fd

写一程序,读入011,,,...,,,...,,nnnbbbaa计算并打印f

3、给出一个有效的算法和一个无效的算法计算积分

1041nnxydxx (0,1,...,10)n

4、设2211NNjSj,已知其精确值为1311221NN

(1)编制按从大到小的顺序计算NS的程序

(2)编制按从小到大的顺序计算NS的程序

(3)按两种顺序分别计算10001000030000,,,SSS并指出有效位数 .专业整理.

.学习帮手. 三、实验步骤、程序设计、实验结果及分析

1、用两种不同的顺序计算1000021nn,分析其误差的变化

(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//(.../)nnafbbabaab,计算f:

(1)实验步骤:

利用 11,inniiiadbdbd (1,2,...,0)inn,0fd,计算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、给出一个有效的算法和一个无效的算法计算积分

1041nnxydxx (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;

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");

}

}

(3)实验结果及分析

程序运行结果:

.专业整理.

.学习帮手. 结果分析:无效算法数值不稳定,误差造成的影响特别大

4、设2211NNjSj,已知其精确值为1311221NN

(1)实验步骤

先编程按从大到小的顺序计算NS的程序,再编程按从小到大的顺序计算NS的程序,然后按两种顺序分别计算10001000030000,,SSS。

(2)程序设计

#include

main()

{

int N;

double SN[30000];

SN[30000]=(3.0/2.0-1.0/30000.0-1/30001.0)/2.0;

for(N=30000;N>=2;N--)

SN[N-1]=SN[N]-1.0/(N*N-1);

printf("从大到小顺序计算:\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]);

}

(3)实验结果及分析

程序运行结果:

.专业整理.

.学习帮手. 结果分析:不同顺序计算所得结果是一样的。

四、总结

通过这次上机,学习了解了舍入误差在不同算法时对结果的影响不同,稳定的算法才能获得正确的结果。

2 方程求根

一、实验目的

(1)通过对二分法与牛顿迭代法做编程练习和上机运算,进一步体会二分法和牛顿法的不同。

(2)编写割线迭代法的程序,求非线性方程的解,并与牛顿迭代法作比较。

二、实验内容

1、用牛顿法求下列方程的根

(1)20xxe

(2)10xxe

(3)lg20xx

2、编写割线法程序求解第一问的方程

三、实验步骤、程序设计、实验结果及分析

1、牛顿法

(1)实验步骤

通过定义牛顿法求方程的子函数,用main函数调用子函数求根

(2)程序设计

#include .专业整理.

.学习帮手. #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)