本科生实验报告实验课程数值计算与方法学院名称专业名称学生姓名学生学号指导教师实验地点实验成绩二〇一六年四月二〇一六年五月1目录实验一:舍入误差与数值稳定...............................21.1目的与要求.......................................21.2舍入误差和数值稳定性............................21.2.1概要........................................21.2.2程序和实例..................................2实验二:方程求根.........................................52.2二分法............................................52.2.1算法.........................................52.2.2程序与实例...................................5实验三牛顿迭代法.......................................72.3.1算法.........................................7实验三牛顿迭代法......................................102.3.1算法........................................10实验四:列主元高斯消去法...............................134.1算法.............................................134.2程序与实例.......................................14实验五:牛顿插值多项式..................................165.1算法...........................................165.2程序与实例.....................................162实验一:舍入误差与数值稳定1.1目的与要求(1)通过上机编程,复习巩固以前所学程序设计语言及上机操作指令;(2)通过上机计算,了解舍入误差所引起的数值不稳定性。1.2舍入误差和数值稳定性1.2.1概要舍入误差在计算方法中是一个很重要的概念。在实际计算中如果选用了不同的算法,由于舍入误差的影响,将会得到截然不同的结果。因此,选取稳定的算法在实际计算中是十分重要的。1.2.2程序和实例对n=0,1,2,…,40,计算定积分算法1利用递推公式)40,...,2,1(511nnynyn取101ln6ln55dxx≈0.182322算法2利用递推公式11155nnyyn(n=420,39,…,1)注意到4040111400001111246655205xxdxdxxdxx取340111()0.00447152205246y算法1C语言程序如下:#includestdio.h#includemath.hvoidmain(){doubley_0=log(6.0/5.0),y_1;//定义两个变量y_1,y_2的值//intn=1;//定义循环变量//printf(y[0]=%-20f,y_0);//输出y[0]的值//while(1)//用while循环进行递推运算//{y_1=1.0/n-5*y_0;//计算y[n]的值,y_0表示y[n+1],y[1]表示y[n]//printf(y[%d]=%-20f,n,y_1);//输出计算的y[n]值,输出的数值不足20位的补齐空格//if(n=40)break;//n=40,跳出循环//y_0=y_1;//将y_1的值给y_0成为下一次计算的y[n-1]//n++;//n逐渐叠加//if(n%2==0)printf(\n);//每两个为一组换行//}}4算法2C语言程序如下#includestdio.h#includemath.hvoidmain(){doubley_0=(1/205.0+1/246.0)/2,y_1;//定义两个双精度变量y_0,y_1,并给y_赋值//intn=40;//赋值n=40//printf(y[40]=%-20f,y_0);//将y以20的域宽输出,并输出y_0的值//while(1){y_1=1/(5.0*n)-y_0/5.0;//利用递推公式肌算y1//printf(y[%d]=%-20f,n-1,y_1);//输出计算次数n-1级y_(n-1)的值//if(n=1)break;//n=1,跳出循环//5y_0=y_1;//y_1的值赋给y_0//n--;//n自减//if(n%3==0)printf(\n);}//n为奇数,空一行//}实验二:方程求根2.2二分法2.2.1算法给定区间[a,b],并设f(a)与f(b)符号相反,取ε为根的容许误差,δ为|f(x)|的容许误差。令(a+b)/2。如果(c-a)ε或|f(c)|δ,则输出c,结束;否则执行。如果f(a)f(c)0,则令a=c;否则令b=c,重复。2.2.2程序与实例例2.1求方程0104)(23xxxf在1.5附近的根。6C语言程序如下:#includestdio.h#includemath.h/*调用库函数,定义eps和delta为5e-6e-6*/#defineeps5e-6#definedelta1e-6floatBisection(floata,floatb,float(*f)(float))/*bisection为二分法*/{floatc,fc,fa=(*f)(a),fb=(*f)(b);intn=1;printf(二分次数\t\tc\t\tf(c)\n);while(1)/*整个bisection的while循环*/{if(fa*fb0){printf(不能用二分法求解);break;}c=(a+b)/2,fc=(*f)(c);printf(%d\t\t%f\t\t%f\n,n++,c,fc);if(fabs(fc)delta)break;elseif(fa*fc0){b=c;fb=fc;}else{a=c;fa=fc;}if(b-aeps)break;}returnc;}floatf(floatx){returnx*x*x+4*x*x-10;}intmain(intargc,char*argv[])/*定义函数参数和数组*/{7floata=1,b=2;floatx;x=Bisection(a,b,f);printf(\n方程的根为%f,x);return0;}实验三牛顿迭代法2.3.1算法给定初始值0x,ε为根的容许误差,为|f(x)|的允许误差,N为迭代次数的容许值。果0)(f0‘x或迭代次数大于N,则算法失败,结束;否则执行②。②计算)(f)(fx0'001xxx。若|01xx|ε或|f(1x)|,则输出1x,程序结束;否则执行④。令10xx,转向①。82.3.2程序与实例求方程f(x)=033x23xx在1.5附近的根。C语言程序如下:#includestdio.h#includemath.h#defineN100/*定义迭代次数的容许值100*/#defineeps1e-6/*定义根的容许误差为1e-6*/#defineeta1e-8floatNewton(float(*f)(float),float(*f1)(float),floatx0)/*定义双精度函数Newton,其中定义了两个指针函数f和f1,其返回值都为float,还定义了双精度变量x0*/{floatx1,d;intk=0;do{x1=x0-(*f)(x0)/(*f1)(x0);/*迭代公式*/if(k++N||fabs((*f1)(x1))eps)/*如果k++N或者将x1代入函数f1所得的浮点数的绝对值大于eps*/{printf(\nNewton迭代发散);/*输出Newton迭代发散并换行*/break;}d=fabs(x1)1?x1-x0:(x1-x0)/x1;/*如果x1的绝对值小于1则把x1=x0赋值给d,反之则把(x1-x0)/x1赋值给d*/x0=x1;printf(x(%d)=%f\t,k,x0);/*输出类型为浮点型的数x0,并在9这个数后面空4个空格,并输出迭代次数k*/}while(fabs(d)eps&&fabs((*f)(x1))eta);/*当浮点数d的绝对值大于eps并且将x1代入函数f1所得浮点数的绝对值大于eta时*/returnx1;/*返回x1*/}floatf(floatx){returnx*x*x+x*x-3*x-3;/*f返回值/}floatf1(floatx)/*定义双精度函数f,自变量为双精度x1*/{return3.0*x*x+2*x-3;/*f1返回值*/}voidmain(){floatx0,y0;/*定义双精度变量x0,y0*/printf(请输入迭代初值x0\n);/*输数迭代初始值x0并换行*/scanf(%f,&x0);/*输入浮点数x0*/printf(x(0)=%f\n,x0);/*输出浮点数x*/y0=Newton(f,f1,x0);/*将f,f1,x0代入Newton所得值赋给y0*/printf(方程的根为%f\n,y0);/*输出方程的根为换行*/}10实验三牛顿迭代法2.3.1算法给定初始值0x,ε为根的容许误差,为|f(x)|的允许误差,N为迭代次数的容许值。a)果0)(f0‘x或迭代次数大于N,则算法失败,结束;否则执行②。b)②计算)(f)(fx0'001xxx。c)若|01xx|ε或|f(1x)|,则输出1x,程序结束;否则执行④。d)令10xx,转向①。2.3.2程序与实例求方程f(x)=033x23xx在1.5附近的根。C语言程序如下:#includestdio.h#includemath.h#defineN100/*定义迭代次数的容许值100*/#defineeps1e-6/*定义根的容许误差为1e-6*/#defineeta1e-8floatNewton(float(*f)(float),float(*f1)(float),floatx0)/*定义双精度函数Newton,其中定义了两个指针函数f和f1,其返回值都为float,还定义了双精度变量x0*/{floatx1,d;intk=0;do{x1=x0-(*f)(x0)/(*f1)(x0);/*迭代公式*/if(k++N||fabs((*f1)(x1))eps)/*如果k++N或者将x1代入11函数f1所得的浮点数的绝对值大于eps*/{printf(\nNewton迭代发散);/*输出Newton迭代发散并换行*/break;}d=fabs(x1)1?x1-x0:(x1-x0)/x1;/*如果x1的绝对值小于1则把x1=x0赋值给d,反之则把(x1-x0)/x1赋值给d*/x0=x1;printf(x(%d)=%f\t,k,x0);/*输出类型为浮点型的数x0,并在这个数后面空4个空格,并输出迭代次数k*/}while(fabs(d)eps&&fabs((*f)(x1))eta);/*当浮点数d的绝对值大于eps并且将x1代入函数f1所得浮点数的绝对值大于eta时*/returnx1;/*返回x1*/}floatf(floatx){returnx*x*x+x*x-3*x-3;/*f返回值/}floatf1(floatx)/*定义双精度函数f,自变