(实验报告的首页)本科实验报告课程名称:计算机数值方法实验项目:方程求根、解方程、迭代求解、插值、拟合实验地点:逸夫302专业班级:学号:学生姓名:指导教师:李志2013年04月23日学生姓名实验成绩实验名称实验一方程求根实验目的和要求(必填)(1)培养理论联系实际的思路,训练综合运用已经学过的理论和实际知识去分析和解决实际问题的能力。(2)帮助学生全面消化已学的相关课程内容,深刻理解计算数值方法课程的内涵,培养使用电子计算机进行科学计算和解决问题的能力。(3)进行基本技能训练和巩固。使学生得到选择算法、编写程序、分析数值结果、写数值试验报告、课堂讨论等环节的综合训练。实验内容和原理(必填)内容:熟悉使用二分法、迭代法、牛顿法、割线法等方法对给定的方程进行根的求解。原理:增值法基本思想是,从初始值x0开始,按规定的一个初始步长h来增值。Xn+1=Xn+h(n=0,1,2,……).在增值的计算过程中可能遇到三种情形:(1)ʄ(Xn+1)=0,此时Xn+1即为方程的根x*.(2)ʄ(Xn)和ʄ(Xn+1)同符号,这说明区间[Xn,Xn+1]内无根。(3)ʄ(Xn)和ʄ(Xn+1)异号,即有ʄ(Xn)*ʄ(Xn+1)0此时,当ʄ(x)在区间[Xn,Xn+1]上连续时,方程ʄ(x)=0在[Xn,Xn+1]一定有根。二分法:设ʄ(x)在区间[a,b]上连续,且ʄ(a)*ʄ(b)0,则由连续函数性质可知,方程ʄ(x)=0在(a,b)内至少有一实根。主要仪器设备笔记本计算机实验记录(写出实验内容中的程序代码和运行结果)(可分栏或加页)Y结束结束//二分法方程求根#includestdafx.h#includeiostream#includemath.husingnamespacestd;classequation{public:equation();doublebsolve();doublevalue(double);private:doublevar[10],cof[10];intk;doublelow,high,mid,bor;};/*构造函数,即输入方程,x,y,bor*/equation::equation(){inti;coutpleaseinputtheequationnumber:endl;cink;coutPleaseinputthevarandcof:endl;for(i=0;ik;i++){cout[;cinvar[i];cout];coutx^;cout[;cincof[i];cout]+;}coutPleaseinputthelowandhighvaulty:endl;coutthelow:;cinlow;coutthehigh:;cinhigh;coutPleaseinputthebordervaulty:endl;cinbor;}/*二分求解过程*/doubleequation::bsolve(){doublea=0,b=0,c=0;do{a=value(low);//求出a的值b=value(high);//求出b的值mid=(low+high)/2;//求中间值c=value(mid);if(c==0)//若c=0则输出midreturnmid;if(c*b0)a=c;elseb=c;}while(b-abor&&b-a-bor);//当所求的x在要求精度范围内时输出xreturnmid;};/*求出f(x)的值*/doubleequation::value(doublex){inti;doubley=0;for(i=0;ik;i++){y+=var[i]*pow(x,cof[i]);//即f(x)=a[0]*x^[n]+……}returny;};voidmain(){equationa;//定义方程,输入方程,a,b,bor.floatx;x=a.bsolve();//二分法求解couttherootisxendl;};/*利用迭代法求方程的根*/#includestdafx.h#includemath.h#includeiostreamusingnamespacestd;voidmain(){/*此阶段为输入阶段即直接输入的x=Y(x)的函数。其中的k为多项式的个数,low,high为精度要求值var为变量的系数、cof为变量的指数。*/inti,k;doublebor;doublevar[10];doublecof[10];coutpleaseinputtheequationnumber:endl;//输入多项式的长度cink;coutPleaseinputthevarandcof:endl;//输入多项式for(i=0;ik;i++){cinvar[i];coutx^;cincof[i];}coutPleaseinputthebordervaulty:endl;//输入精确度cinbor;/*计算阶段,通过利用循环函数来求满足精度的值*/doublea,b;while(abs(b-a)bor){for(i=0;ik;i++){b=var[i]*pow(a,cof[i]);}}/*输出满足条件的x的值*/couttherootisabout:bendl;};实验结果和分析可包括:结果的正确性;误差的估计和原因;方法对比等由答案可结果正确。误差的估计即给出的误差限|x*-xn|0.5×10-5。相比之下第一种方法较简单而对于第二种方法则由于无法确定好的迭代方程而导致所求较难。心得体会(遇到的问题和解决方法)对于二方法而言,如何设计好UI是一个很重要的问题,但同时也会占浪费一些空间和时间,而对于迭代而言由于无法找到很好的算法求出迭代方程因此较为困难,并且对于给出的方程也是很难进行输入处理和输出。实验名称实验二线性方程组的直接求解实验目的和要求(1)培养理论联系实际的思路,训练综合运用已经学过的理论和实际知识去分析和解决实际问题的能力。(2)帮助学生全面消化已学的相关课程内容,深刻理解计算数值方法课程的内涵,培养使用电子计算机进行科学计算和解决问题的能力。(3)进行基本技能训练和巩固。使学生得到选择算法、编写程序、分析数值结果、写数值试验报告、课堂讨论等环节的综合训练。实验内容合理选择利用Gauss消元法、LU分解法、追赶法求解下列方程组:②13814142210321321xxx②2178.4617.5911212592.1121130.6291.51314.59103.0432115xxxx③3772201161263841027851244321xxxx④55572112112112121nnxxxx(n=5,10,100,…)原理:即通过化解使得原方程组变形成一个可以通过迭代或是能够直接求出来方程组。主要仪器设备台式或笔记本计算机实验记录(写出实验内容中的程序代码和运行结果)(可分栏或加页)classmatrix//matrix类{private:doublea[10][10][10];doubleb[10][10];doublex[10];intlen;public:voidinput();voidoutput();voidoutvalue();voidgusssimply();voidgussback();};#includestdafx.h#includeiostreamusingnamespacestd;#includematrix.hint_tmain(intargc,_TCHAR*argv[]){matrixa;a.input();//输入矩阵a.gusssimply();//化简矩阵为上三角a.gussback();//回代求xa.outvalue();//输出值return0;}voidmatrix::input(){inti,j;/*输入矩阵长度*/coutPleaseinputthematrix'slength:endl;cinlen;/*输入矩阵元素,初始时,为a[0]*/coutPleaseinputthematrix:endl;for(i=0;ilen;i++){for(j=0;jlen;j++){cina[0][i][j];}}/*输出对应的值*/coutPleaseinputthematrix'svalue:endl;for(i=0;ilen;i++)结束高斯消元代为上三角矩阵输入矩阵及对就的函数值回代求解输出解开始开始输入矩阵及对就的函数值结束求出L、ULy=b;Ux=y;回代求解输出解{cinb[0][i];}}voidmatrix::outvalue(){inti;/*输出解*/for(i=0;ilen;i++){coutthex[i]is:x[i];}for(i=0;ilen;i++){coutb[len-1][i];}}voidmatrix::output(){inti,j;/*输出矩阵*/coutthematrixis:endl;for(i=0;ilen;i++){for(j=0;jlen;j++){couta[len-1][i][j];}coutendl;}coutendl;}voidmatrix::gusssimply(){inti,j,k;doublem[10][10];/*通过高斯消元使得该矩阵变为上三角矩阵*/for(k=1;klen;k++)//需进行n次消元for(i=0;ilen;i++){if(ik){for(j=0;jlen;j++)a[k][i][j]=a[k-1][i][j];b[k][i]=b[k-1][i];}else{m[i][k]=a[k-1][i][k-1]/a[k-1][k-1][k-1];for(j=0;jlen;j++){//求li1a[k][i][j]=a[k-1][i][j]-m[i][k]*a[k-1][k-1][j];}b[k][i]=b[k-1][i]-m[i][k]*b[k-1][k-1];}}}voidmatrix::gussback(){inti,j;doublet;/*回代过程求值*/x[len-1]=b[len-1][len-1]/a[len-1][len-1][len-1];//求出最后的一项的值for(i=len-2;i=0;i--){t=0;for(j=i+1;jlen;j++)//回代第i项的值{t+=a[len-1][i][j]*x[j];}x[i]=(b[len-1][i]-t)/a[len-1][i][i];}}////LU分解法classmatrix{private:doublea[10][10],l[10][10],u[10][10],d[10][10],d3[10][10],x[10][10],b[10],B1[10][10],B[10][10],f[10][10];intcol,row;voidgetL();voidgetD();voidgetU();public:doublecontray();voidinput();voidoutputx(intk);voidgetB();voidgetf();intLUresolve();doublexvalue(int);voidinputx();};#includestdafx.h#inclu