计算方法与实习上机报告.docx

上传人:b****5 文档编号:4843600 上传时间:2022-12-10 格式:DOCX 页数:20 大小:43.24KB
下载 相关 举报
计算方法与实习上机报告.docx_第1页
第1页 / 共20页
计算方法与实习上机报告.docx_第2页
第2页 / 共20页
计算方法与实习上机报告.docx_第3页
第3页 / 共20页
计算方法与实习上机报告.docx_第4页
第4页 / 共20页
计算方法与实习上机报告.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

计算方法与实习上机报告.docx

《计算方法与实习上机报告.docx》由会员分享,可在线阅读,更多相关《计算方法与实习上机报告.docx(20页珍藏版)》请在冰豆网上搜索。

计算方法与实习上机报告.docx

计算方法与实习上机报告

 

计算方法与实习

——上机报告

 

学院:

电子工程学院

学号:

姓名:

刘波

 

计算方法与实习上机报告

习题一:

1舍入误差及稳定性

一、实验目的

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

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

二、实验内容

1、用两种不同的顺序计算

,分析其误差的变化

2、已知连分数

,利用下面的算法计算

写一程序,读入

计算并打印

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

4、设

,已知其精确值为

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

的程序

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

的程序

(3)按两种顺序分别计算

并指出有效位数

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

1、用两种不同的顺序计算

,分析其误差的变化

(1)实验步骤:

分别从1~10000和从10000~1两种顺序进行计算,应包含的头文件有和

(2)程序设计:

a.顺序计算

#include<>

#include<>

voidmain()

{

doublesum=0;

intn=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<>

voidmain()

{

doublesum=0;

intn=10000;

while(n!

=0)

{

sum=sum+(1/pow(n,2));

if(n%200==0)

printf("sum[%d]=%-10f",n,sum);

if(n<1)

break;

n--;

}

printf("sum[%d]=%f\n",n,sum);

}

(3)实验结果及分析:

程序运行结果:

a.顺序计算

b.逆序计算

结果分析:

两种不同顺序计算结果是一样的,顺序计算误差从一开始就很小,而逆序计算误差最开始十分大,后来结果正确。

2、已知连分数

,计算

(1)实验步骤:

利用

,计算

(2)程序设计

#include<>

#include<>

voidmain()

{

inti=0,n;

floata[100],b[100],c[100];

printf("pleaseinputn=");

scanf("%d",&n);

printf("\npleaseinputa[0]toa[n-1]:

\n");

for(i=1;i

{

printf("a[%d]=",i);

scanf("%f",&a[i]);

}

printf("\npleaseinputb[0]tob[n-1]:

\n");

for(i=0;i

{

printf("b[%d]=",i);

scanf("%f",&b[i]);

}

d[n]=b[n];

for(i=n-1;i>=0;i--)

c[i]=b[i]+a[i+1]/c[i+1];

printf("\nf=%f\n",c[0]);

}

(3)实验结果

程序运行结果:

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

(1)实验步骤

利用C语言编写程序,分别使用数值稳定的和数值不稳定的计算公式所建立的递推公式进行计算。

(2)程序设计

#include<>

#include<>

main()

{

doubley_0=(1/*log(5),y_1;

doubley_2=+/2,y_3;

intn=1,m=10;

printf("有效算法输出结果:

\n");

printf("y[0]=%-20f",y_0);

while

(1)

{

y_1=(4*n)+y_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=*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、设

,已知其精确值为

(1)实验步骤

先编程按从大到小的顺序计算

的程序,再编程按从小到大的顺序计算

的程序,然后按两种顺序分别计算

(2)程序设计

#include<>

main()

{

intN;

doubleSN[30000];

SN[30000]=

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

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

printf("从大到小顺序计算:

\nSN[1000]=%f\nSN[10000]=%f\nSN[30000]=%f\n",SN[1000],SN[10000],SN[30000]);

SN[2]=/;

for(N=3;N<=30000;N++)

SN[N]=SN[N-1]+(N*N-1);

printf("从小到大顺序计算:

\nSN[1000]=%f\nSN[10000]=%f\nSN[30000]=%f\n",SN[1000],SN[10000],SN[30000]);

}

(3)实验结果及分析

程序运行结果:

结果分析:

不同顺序计算所得结果是一样的。

四、总结

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

习题二:

一、实验目的

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

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

二、实验内容

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

(1)

(2)

(3)

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

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

1、牛顿法

(1)实验步骤

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

(2)程序设计

#include<>

#include<>

typedeffloat(*p)(float);

floatff1(floatx)

{

returnx*x-exp(x);

}

floatff2(floatx)

{

returnx*exp(x)-1;

}

floatff3(floatx)

{

returnlog(x)+x-2;

}

floatanswer(float(*p)(float))

{

intk=2;

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

}

if(k%3!

=0)printf("\n");

printf("iterationtimes:

%d,roots:

%.4f\n",k-2,n);

return0;

}

main()

{

printf("x*x-exp(x),\n");

answer(ff1);

printf("x*exp(x)-1,\n");

answer(ff2);

printf("lg(x)+x-2,\n");

answer(ff3);

return0;

}

(3)实验结果及分析

2、割线法

(1)程序设计

#include<>

#include<>

floatgexian(float,float);

floatf(float);

main()

{

inti,j;

floatx1=;

floatx2=2,x3;

scanf("%d",&i);

if(i==1)printf("%f",x1);

elseif(i==2)printf("%f",x2);

else

{

for(j=3;j<=i;j++)

{

x3=gexian(x1,x2);

x1=x2;

x2=x3;

}

printf("%f",gexian(x1,x2));

}

}

floatf(floatx)

{

return(x*x-exp(x));

}

floatgexian(floatx1,floatx2)

{

return(x2-(f(x2)/(f(x2)-f(x1)))*(x2-x1));

}

(3)实验结果及分析

四、总结

了解和学习了二分法和牛顿迭代法的思想以及程序设计的方法,比较了迭代法和牛顿法的特点:

牛顿法收敛速度较快,但对初值选取要求较高;割线法计算量少。

习题三:

3线性方程组数值解法

一、实验目的

(1)熟悉求解线性方程组的有关理论和方法;

(2)会编制列主元消去法,LU分解法,雅可比及高斯-赛德尔迭代法的程序;

(3)通过实际计算,进一步了解各种方法的优缺点,选择合适的数值方法。

二、实验内容

1、用列主元消去法解方程组

2、用LU分解法解方程组

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

1、用列主元消去法解方程组

(1)程序设计

#include<>

#include<>

voidColPivot(float*,int,float[]);

voidColPivot(float*c,intn,floatx[])

{

inti,j,t,k;

floatp;

for(i=0;i<=n-2;i++)

{

k=i;

for(j=i+1;j<=n-1;j++)

if(fabs(*(c+j*(n+1)+i))>(fabs(*(c+k*(n+1)+i))))

k=j;

if(k!

=i)

for(j=i;j<=n;j++)

{

p=*(c+i*(n+1)+j);

*(c+i*(n+1)+j)=*(c+k*(n+1)+j);

*(c+k*(n+1)+j)=p;

}

for(j=i+1;j<=n-1;j++)

{

p=(*(c+j*(n+1)+i))/(*(c+i*(n+1)+i));

for(t=i;t<=n;t++)

*(c+j*(n+1)+t)-=p*(*(c+i*(n+1)+t));

}

}

for(i=n-1;i>=0;i--)

{

for(j=n-1;j>=i+1;j--)

(*(c+i*(n+1)+n))-=x[j]*(*(c+i*(n+1)+j));

x[i]=*(c+i*(n+1)+n)/(*(c+i*(n+1)+i));

}

}

voidmain()

{

inti;

floatx[4];

floatc[4][5]={1,1,0,3,4,2,1,-1,1,1,3,-1,-1,3,-3,-1,2,3,-1,4};

ColPivot(c[0],4,x);

for(i=0;i<=3;i++)

printf("x[%d]=%f\n",i,x[i]);

}

(2)实验结果及分析

(1)题

(2)题

2、用LU分解法解方程组

(1)程序设计

#include<>

voidmain()

{

floatx[4];

inti;

floata[4][5]={48,-24,0,-12,4,

-24,24,12,12,4,

0,6,20,2,-2,

-6,6,2,16,-2

};

voidDirectLU(float*,int,float[]);

DirectLU(a[0],4,x);

for(i=0;i<=3;i++)printf("x[%d]=%f\n",i,x[i]);

}

voidDirectLU(float*u,intn,floatx[])

{

inti,r,k;

for(r=0;r<=n-1;r++)

{

for(i=r;r<=n;i++)

for(k=0;k<=r-1;k++)

*(u+r*(n+1)+i)-=*(u+r*(n+1)+k)*(*(u+k*(n+1)+i));

for(i=r+1;i<=n-1;i++)

{

for(k=0;k<=r-1;k++)

*(u+i*(n+1)+r)-=*(u+i*(n+1)+k)*(*(u+k*(n+1)+r));

*(u+i*(n+1)+r)/=*(u+r*(n+1)+r);

}

}

for(i=n-1;i>=0;i--)

{

for(r=n-1;r>=i+1;r--)

*(u+i*(n+1)+n)-=*(u+i*(n+1)+r)*x[r];

x[i]=*(u+i*(n+1)+n)/(*(u+i*(n+1)+i));

}

}

四、总结

掌握了用列主元消去法和LU分解法求解方程组程序编写的技巧。

习题四:

4插值法

一、实验目的

(1)熟悉拉格朗日插值法多项式和牛顿插值多项式,注意其不同点;

(2)掌握三次样条插值解决一些实际问题。

二、实验内容

1、按所给数据做二次插值,并求给定点的函数值

2、按所给数据做五次插值,并求给定点的函数值

3、牛顿前插公式计算函数值

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

1、二次插值

(1)程序设计

#include<>

floatLagrange(floatx[],floaty[],floatxx,intn)

物线

(1)程序设计:

#include<>

#include<>

voidmain()

{

inti;

floata[3];

floatx[15]={1,,2,,3,,4,,5,,6,,7,,8};

floaty[15]={,,,,,,,,,,,,,,};

voidApprox(float[],float[],int,int,float[]);

Approx(x,y,15,2,a);

for(i=0;i<=2;i++)

printf("a[%d]=%f\n",i,a[i]);

}

voidApprox(floatx[],floaty[],intm,intn,floata[])

{

inti,j,t;

float*c=newfloat[(n+1)*(n+2)];

floatpower(int,float);

voidColPivot(float*,int,float[]);

for(i=0;i<=n;i++)

{

for(j=0;j<=n;j++)

{

*(c+i*(n+2)+j)=0;

for(t=0;t<=m-1;t++)

*(c+i*(n+2)+j)+=power(i+j,x[t]);

}

*(c+i*(n+2)+n+1)=0;

for(j=0;j<=m-1;j++)

*(c+i*(n+2)+n+1)+=y[j]*power(i,x[j]);

}

ColPivot(c,n+1,a);

deletec;

}

voidColPivot(float*c,intn,floatx[])

{

inti,j,t,k;

floatp;

for(i=0;i<=n-2;i++)

{

k=i;

for(j=i+1;j<=n-1;j++)

if(fabs(*(c+j*(n+1)+i))>(fabs(*(c+k*(n+1)+i))))

k=j;

if(k!

=i)

for(j=i;j<=n;j++)

{

p=*(c+i*(n+1)+j);

*(c+i*(n+1)+j)=*(c+k*(n+1)+j);

*(c+k*(n+1)+j)=p;

}

for(j=i+1;j<=n-1;j++)

{

p=(*(c+j*(n+1)+i))/(*(c+i*(n+1)+i));

for(t=i;t<=n;t++)*(c+j*(n+1)+t)-=p*(*(c+i*(n+1)+t));

}

}

for(i=n-1;i>=0;i--)

{

for(j=n-1;j>=i+1;j--)

(*(c+i*(n+1)+n))-=x[j]*(*(c+i*(n+1)+j));

x[i]=*(c+i*(n+1)+n)/(*(c+i*(n+1)+i));

}

}

floatpower(inti,floatv)

{

floata=1;

while(i--)a*=v;

returna;

}

(2)实验结果

2、最小二乘拟合

(1)程序设计

#include<>

#include<>

voidmain()

{

inti,n;

floata[2];

floatx[15]={1,,2,,3,,4,,5,,6,,7,,8},z[15];

floaty[15]={,,,,,,,,,,,,,,};

for(n=0;n<=14;n++)

进欧拉法

(1)程序设计

#include<>

voidModEuler(float(*f)(float,float),floatx0,floaty0,floatxn,intn)

{

inti;

floatyp,yc,x=x0,y=y0,h=(xn-x0)/n;

printf("x[0]=%f\ty[0]=%f\n",x,y);

for(i=1;i<=n;i++)

{

yp=y+h*(*f)(x,y);

x=x0+i*h;

yc=y+h*(*f)(x,yp);

y=(yp+yc)/2;

printf("x[%d]=%f\ty[%d]=%f\n",i,x,i,y);

}

}

floatf(floatx,floaty)

{

阶龙格-库塔公式

(1)程序设计

#include<>

voidRunge_Kutta(float(*f)(floatx,floaty),floata,floatb,floaty0,intN)

{

floatx=a,y=y0,K1,K2,K3,K4;

floath=(b-a)/N;

inti;

printf("x[0]=%f\ty[0]=%f\n",x,y);

for(i=1;i<=N;i++)

{

K1=(*f)(x,y);

K2=(*f)(x+h/2,y+h*K1/2);

K3=(*f)(x+h/2,y+h*K2/2);

K4=(*f)(x+h,y+h*K3);

y=y+h*(K1+2*K2+2*K3+K4)/6;

x=a+i*h;

printf("x[%d]=%f\ty[%d]=%f\n",i,x,i,y);

}

}

floatf(floatx,floaty)

{

算方法典型例题分析.第二版.北京:

科学出版社,2005

【2】孙志忠,袁慰平,计算方法与实习.第二版.南京:

东南大学出版社,2011

【3】谭浩强.C程序设计.第四版.北京:

清华大学出版社,2010

◆《数值计算方法》合肥工业大学数学与信息科学系编合肥工业大学出版社◆《计算方法》邓建中等编,西安交大出版社,1985。

◆《数值计算和C程序集》蒋长锦编着,中国科学技术大学出版社,1998。

◆《计算方法引论》徐萃薇编,高等教育出版社,1999。

◆黄友谦,程诗杰,陈浙鹏,《数值试验》,北京:

高等教育出版社,1989

◆蔡大用,《数值分析与实验学习指导》,北京:

清华大学出版社与施普林格出版社,2001◆肖筱南,《值计算方法与上机实习指导》,北京:

北京大学出版社,2004

◆A.Quarteroni,R.Sacco,F.Saleri,《NumericalMathematics》,NewYork:

Springer-Verlag,2000

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 军事

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1