计算方法与实习上机报告.docx
《计算方法与实习上机报告.docx》由会员分享,可在线阅读,更多相关《计算方法与实习上机报告.docx(20页珍藏版)》请在冰豆网上搜索。
计算方法与实习上机报告
计算方法与实习
——上机报告
学院:
电子工程学院
学号:
姓名:
刘波
习题一:
1舍入误差及稳定性
一、实验目的
(1)通过上机编程,复习巩固以前所学程序设计语言及上机操作指令;
(2)通过上机计算,了解舍入误差所引起的数值不稳定性
二、实验内容
1、用两种不同的顺序计算
,分析其误差的变化
2、已知连分数
,利用下面的算法计算
:
写一程序,读入
计算并打印
3、给出一个有效的算法和一个无效的算法计算积分
4、设
,已知其精确值为
(1)编制按从大到小的顺序计算
的程序
(2)编制按从小到大的顺序计算
(3)按两种顺序分别计算
并指出有效位数
三、实验步骤、程序设计、实验结果及分析
(1)实验步骤:
分别从1~10000和从10000~1两种顺序进行计算,应包含的头文件有和
(2)程序设计:
a.顺序计算
#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.逆序计算
intn=10000;
while(n!
=0)
if(n%200==0)
printf("sum[%d]=%-10f",n,sum);
if(n<1)
n--;
(3)实验结果及分析:
程序运行结果:
结果分析:
两种不同顺序计算结果是一样的,顺序计算误差从一开始就很小,而逆序计算误差最开始十分大,后来结果正确。
,计算
利用
,
(2)程序设计
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
printf("a[%d]=",i);
scanf("%f",&a[i]);
printf("\npleaseinputb[0]tob[n-1]:
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
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)实验结果
(1)实验步骤
利用C语言编写程序,分别使用数值稳定的和数值不稳定的计算公式所建立的递推公式进行计算。
main()
doubley_0=(1/*log(5),y_1;
doubley_2=+/2,y_3;
intn=1,m=10;
printf("有效算法输出结果:
printf("y[0]=%-20f",y_0);
y_1=(4*n)+y_0/;
printf("y[%d]=%-20f",n,y_1);
if(n>=10)
y_0=y_1;
if(n%3==0)printf("\n");
printf("\n无效算法的输出结果:
printf("y[10]=%-20f",y_2);
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)实验结果及分析
无效算法数值不稳定,误差造成的影响特别大
先编程按从大到小的顺序计算
的程序,再编程按从小到大的顺序计算
的程序,然后按两种顺序分别计算
。
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("从小到大顺序计算:
不同顺序计算所得结果是一样的。
四、总结
通过这次上机,学习了解了舍入误差在不同算法时对结果的影响不同,稳定的算法才能获得正确的结果。
习题二:
(1)通过对二分法与牛顿迭代法做编程练习和上机运算,进一步体会二分法和牛顿法的不同。
(2)编写割线迭代法的程序,求非线性方程的解,并与牛顿迭代法作比较。
1、用牛顿法求下列方程的根
(2)
(3)
2、编写割线法程序求解第一问的方程
1、牛顿法
通过定义牛顿法求方程的子函数,用main函数调用子函数求根
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);
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;
printf("x*x-exp(x),\n");
answer(ff1);
printf("x*exp(x)-1,\n");
answer(ff2);
printf("lg(x)+x-2,\n");
answer(ff3);
2、割线法
(1)程序设计
floatgexian(float,float);
floatf(float);
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线性方程组数值解法
(1)熟悉求解线性方程组的有关理论和方法;
(2)会编制列主元消去法,LU分解法,雅可比及高斯-赛德尔迭代法的程序;
(3)通过实际计算,进一步了解各种方法的优缺点,选择合适的数值方法。
1、用列主元消去法解方程组
2、用LU分解法解方程组
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;
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(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));
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)题
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++)
*(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(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、二次插值
floatLagrange(floatx[],floaty[],floatxx,intn)
物线
(1)程序设计:
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);
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;
for(t=i;t<=n;t++)*(c+j*(n+1)+t)-=p*(*(c+i*(n+1)+t));
floatpower(inti,floatv)
floata=1;
while(i--)a*=v;
returna;
(2)实验结果
2、最小二乘拟合
inti,n;
floata[2];
floatx[15]={1,,2,,3,,4,,5,,6,,7,,8},z[15];
for(n=0;n<=14;n++)
进欧拉法
voidModEuler(float(*f)(float,float),floatx0,floaty0,floatxn,intn)
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)
阶龙格-库塔公式
voidRunge_Kutta(float(*f)(floatx,floaty),floata,floatb,floaty0,intN)
floatx=a,y=y0,K1,K2,K3,K4;
floath=(b-a)/N;
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;
算方法典型例题分析.第二版.北京:
科学出版社,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