您好,欢迎访问三七文档
计算方法实验报告班级:学号:姓名:成绩:1舍入误差及稳定性一、实验目的(1)通过上机编程,复习巩固以前所学程序设计语言及上机操作指令;(2)通过上机计算,了解舍入误差所引起的数值不稳定性二、实验内容1、用两种不同的顺序计算1000021nn,分析其误差的变化2、已知连分数101223//(.../)nnafbbabaab,利用下面的算法计算f:11,inniiiadbdbd(1,2,...,0)inn0fd写一程序,读入011,,,...,,,...,,nnnbbbaa计算并打印f3、给出一个有效的算法和一个无效的算法计算积分1041nnxydxx(0,1,...,10)n4、设2211NNjSj,已知其精确值为1311221NN(1)编制按从大到小的顺序计算NS的程序(2)编制按从小到大的顺序计算NS的程序(3)按两种顺序分别计算10001000030000,,,SSS并指出有效位数三、实验步骤、程序设计、实验结果及分析1、用两种不同的顺序计算1000021nn,分析其误差的变化(1)实验步骤:分别从1~10000和从10000~1两种顺序进行计算,应包含的头文件有stdio.h和math.h(2)程序设计:#includestdio.h#includemath.hvoidmain(){floatn=0.0;inti;floatm=0.0;intj;for(i=1;i=10000;i++)//顺序计算{n=n+1.0/(i*i);}printf(%-100f,n);printf(\n);for(j=10000;j=1;j--)//逆序计算{m=m+1.0/(j*j);}printf(%-7f,m);printf(\n);}(3)实验结果:程序运行结果:2、已知连分数101223//(.../)nnafbbabaab,计算f:(1)实验步骤:利用11,inniiiadbdbd(1,2,...,0)inn,0fd,计算f(2)程序设计#includestdio.hvoidmain(){floatf,b[100],a[100],d[100];inti,n;printf(n=);scanf(%d,&n);for(i=0;in;i++){printf(b[%d]=,i);scanf(%f,&b[i]);printf(a[%d]=,i);scanf(%f,&a[i]);}for(i=n-1;i=0;i--){d[n]=b[n];d[i]=b[i]+a[i+1]/d[i+1];f=d[0];}printf(%f,f);}(3)实验结果程序运行结果:3、给出一个有效的算法和一个无效的算法计算积分1041nnxydxx(0,1,...,10)n(1)实验步骤利用C语言编写程序,分别使用数值稳定的和数值不稳定的计算公式所建立的递推公式进行计算。(2)程序设计%无效的算法%#includestdio.h#includemath.hvoidmain(){doubley_0=(1/11+1/55)/2,y_1;intn=10;printf(y[10]=%-20f,y_0);while(1){y_1=4/n-16*y_0;printf(y[%d]=%-20f,n-1,y_1);if(n=1)printf(\n);y_0=y_1;n--;if(n%3==0)printf(\n);}}程序运行结果:%有效的算法%#includestdio.h#includemath.hvoidmain(){doubley_0=log(5),y_1;intn=1;printf(y[0]=%-20f,y_0);while(1){y_1=(1/4)*(1/n-(1/4)*y_0);printf(y[%d]=%-20f,n,y_1);if(n=10)break;y_0=y_1;n++;if(n%2==0)printf(\n);}getch();}程序运行结果:4、设2211NNjSj,已知其精确值为1311221NN(1)实验步骤先编程按从大到小的顺序计算NS的程序,再编程按从小到大的顺序计算NS的程序,然后按两种顺序分别计算10001000030000,,SSS。(2)程序设计1.从大到小#includestdio.h#includemath.h#includeiostreamusingnamespacestd;voidmain(){floatn=0.0;inti;intN;coutpleaseinputNendl;cinN;for(i=N;i1;i--){n=n+1.0/(i*i-1);N=N-1;}printf(%-100f,n);printf(\n);}程序运行结果:N=20时N=5时N=1530时2.从小到大#includestdio.h#includemath.h#includeiostreamusingnamespacestd;voidmain(){floatn=0.0;inti;intN;coutpleaseinputNendl;cinN;for(i=2;i=N;i++){n=n+1.0/(i*i-1);}printf(%-100f,n);printf(\n);}程序运行结果:N=20时N=5时N=1530时(3)①用从小到大的C语言算法计算S1000,S10000,S30000,结果如下:N=1000时:N=10000时:N=30000时:②用从大到小顺序的C语言算法分别计算S1000,S10000,S30000,结果如下:N=1000时:N=10000时:N=30000时:四、总结通过这次上机,学习了解了舍入误差在不同算法时对结果的影响不同,稳定的算法才能获得正确的结果。2方程求根一、实验目的(1)通过对二分法与牛顿迭代法做编程练习和上机运算,进一步体会二分法和牛顿法的不同。(2)编写割线迭代法的程序,求非线性方程的解,并与牛顿迭代法作比较。二、实验内容1、用牛顿法求下列方程的根(1)20xxe(2)10xxe(3)lg20xx2、编写割线法程序求解第一问的方程三、实验步骤、程序设计、实验结果及分析1、牛顿法(1)实验步骤通过定义牛顿法求方程的子函数,用main函数调用子函数求根(2)流程图定义N,eps,eta计算f(x0),f1(x0)k=0,intx1,d输入迭代初值x1=x0-f(x0)/f(1x0)开始结束输出迭代发散k=k+1|x1|1?d=x1-x0d=(x1-x0)/x1NNYkN|||f1(x1)|eps?输出x(k)=x0|d|eps?&&|f(x1)|eta?输出方程的根为x1x0=x1YNY(3)程序设计1.#includeiostream#includestdio.h#includecmathusingnamespacestd;#defineN100#defineesp1e-6#defineeta1e-8floatNewton(float(*f)(float),float(*f1)(float),floatx0){floatx1,d;intk=0;do{x1=x0-(*f)(x0)/(*f1)(x0);if(k++N||fabs((*f1)(x1))esp){printf(\nNewton迭代发散);break;}d=fabs(x1)1?x1-x0:(x1-x0)/x1;x0=x1;printf(x(%d)=%f\t,k,x0);}while(fabs(d)esp&&fabs((*f)(x1))eta);returnx1;}floatf(floatx){return(x*x-exp(x));}floatf1(floatx){return(2*x-exp(x));}voidmain(){floatx0,y0;printf(请输入迭代初值x0\n);scanf(%f,&x0);y0=Newton(f,f1,x0);printf(方程的根为:%f\n,y0);}(3)实验结果及分析2.#includestdio.h#includemath.h#defineN100#defineeps1e-6#defineeta1e-8floatNewton(float(*f)(float),float(*f1)(float),floatx0){floatx1,d;intk=0;do{x1=x0-(*f)(x0)/(*f1)(x0);if(k++N||fabs((*f1)(x1))eps){printf(\nNewtom迭代发散);break;}d=fabs(x1)1?x1-x0:(x1-x0)/x1;x0=x1;printf(x(%d)=%f\t,k,x0);}while(fabs(d)eps&&fabs((*f)(x1))eta);returnx1;}floatf(floatx){returnx*exp(x)-1;}floatf1(floatx){returnx*exp(x)+exp(x);}voidmain(){floatx0,y0;printf(请输入迭代初值x0\n);scanf(%f,&x0);printf(x(0)=%f\n,x0);y0=Newton(f,f1,x0);printf(方程的根为%f\n,y0);}3.#includestdio.h#includemath.h#defineN100#defineeps1e-6#defineeta1e-8floatNewton(float(*f)(float),float(*f1)(float),floatx0){floatx1,d;intk=0;do{x1=x0-(*f)(x0)/(*f1)(x0);if(k++N||fabs((*f1)(x1))eps){printf(\nNewtom迭代发散);break;}d=fabs(x1)1?x1-x0:(x1-x0)/x1;x0=x1;printf(x(%d)=%f\t,k,x0);}while(fabs(d)eps&&fabs((*f)(x1))eta);returnx1;}floatf(floatx){returnlog10(x)+x-2;}floatf1(floatx){return1/x+1;}voidmain(){floatx0,y0;printf(请输入迭代初值x0\n);scanf(%f,&x0);printf(x(0)=%f\n,x0);y0=Newton(f,f1,x0);printf(方程的根为%f\n,y0);}2、割线法结束d=x2-x1输出x2=x1开始定义f(x)迭代次数Neps精确度etak=0输入迭代初值x0x1|f’(x2)|epsork++N?abs(x2)1?d=(x2-x1)/x2输出x2=x1fabs(d)eps&&fabs(f(x2))etax2=x1-f’(x)f’(x)=f(x1)*(x1-x0)/(f(x1)-f(x0))迭代发散YNNYYN(1)程序设计#includestdio.h#includemath.hdeiostream#includecstdio#includecmathusingnamespacestd;doubley[1000];doublex[1000];doublefunc(doublex){returnx*x-exp(x);}intmain(){intn=100;x[0]=1;x[1]=2;y[0]=func(x[0]);y[1]=func(x[1]);for(inti=1;in;++i){if(y[i]==y[i-1]){y[n]=y[i];x[n]=x[i];break;}x[i+1]=x[i]-y[i]/(y[
本文标题:计算方法实验报告
链接地址:https://www.777doc.com/doc-2041772 .html