您好,欢迎访问三七文档
数值计算实验报告姓名:XX学号:XX专业:XX1实验一1.题目x5-3x3+x-1=0在区间[-8,8]上。试分别用:①二分法②Newton法③弦截法(割线法):双点弦法④Newton下山法,求方程的根,精确到6位有效数字.2.2.1二分法(1)二分法算法分析设函数有根区间表示为,ab。将有根区间,ab用中点01()2xab分成两半,计算函数值()2abf。如果()02abf,就得到方程组的实根*2abx,否则检查0()fx与()fa是否同号,若同号,则说明所求的根*x在0x的右侧,这时令101,axbb;否则,根*x在0x的左侧,这时令110,aabx,这样新的有根区间11,ab的长度为,ab之半。对压缩了的有根区间11,ab又施以同样的方法……如此反复二分下去,即可得出一系列有根区间1122,,,,kkabababab其中,每个区间都是前一个区间的一半,因此二分k次后的有根区间,kkab的长度为1()2kkkbaba可见,如果二分过程无限地下去,这些有根区间最终必收缩于一点*x,该点显然就是所求的根。取有根区间,kkab的中点*1()2kkxab作为根的近似值,此时的误差*111()()22kkkkxxbaab若事先给定的误差要求为,则只需*11()2kkxxab便可以停止二分计算。(2)Newton法算法分析对于非线性方程()0fx,若已知根*x的一个近似值kx(在这里是mih,将()fx在kx处展成一阶泰勒公式,忽略高次项,有()()()()kkkfxfxfxxx。右端是直线方程,用这个直线方程来近似非线性方程()fx。将非线性方程()0fx的根*x代入*()0fx,即*()()()0kkkfxfxxx2解得*()()kkkfxxxfx这就是Newton迭代公式。在具体的应用中,写为:1()()kkkkfxxxfx,则这样获得的1kx即为按Newton迭代法求得的近似解。(3)弦截法算法分析由于Newton迭代法有时收敛速度较慢,而且有时函数的一阶导数()fx不易求得或较为复杂,因此,改用两个端点都在变动的弦,即用差商11()()kkkkfxfxxx替代Newton迭代公式中的导数()fx,从而导出111()()()()kkkkkkkfxxxxxfxfx。这就是双点弦截法。双点弦截法详细的计算步骤为:1)选定初始值01,xx,计算0()fx,1()fx。2)按双点弦法迭代公式计算2x,并求2()fx。3)判断:如果2(),fx给定精度,则迭代停止;否则,用22(,())xfx和11(,())xfx分别代替1100(,())(,())xfxxfx和重复2)和3)。(4)牛顿下山法算法分析Newton下山法是扩大初值范围的修正Newton法。将Newton迭代法的计算结果1()()kkkkfxxxfx进行适当的加权平均作为新的改进值1kx,即11(1)kkkxxx。从而化简可得Newton下山法迭代公式1()()kkkkfxxxfx其中,称为下山因子。在本实验中,选取14为下山因子。2.源代码#includemath.h#includeiostreamtypedefdoubleD;doublef(Dx);doublefnewton(Dx);voiddivide(Da1,Da2);voidnewton(Da1);voidcord(Da1,Da2);3voidnewton2(Da1);usingnamespacestd;doublef(Dx){returnpow(x,5)-6*pow(x,3)+x-1;}doublefnewton(Dx){if((5*pow(x,4)-9*pow(x,2)+1)!=0)return(pow(x,5)-3*pow(x,3)-1)/(5*pow(x,4)-9*pow(x,2)+1);elsereturn1;}voiddivide(Da1,Da2){for(;fabs(fabs(a1)-fabs(a2))=1e-6;){if(f(a1)*f((a1+a2)/2)0)a2=(a1+a2)/2;elsea1=(a1+a2)/2;}coutendl二分法求得的结果是:(a1+a2)/2endlendl;//return0;}voidnewton(Da1){for(;fabs(fabs(a1)-fabs(a1-fnewton(a1)))=1e-6;)a1-=fnewton(a1);coutNewton法求得的结果是:a1endlendl;//return0;}voidcord(Da1,Da2){intn=0;for(;fabs(f(a2-f(a2)*(a2-a1)/(f(a2)-f(a1)))-0)=1e-6;n++){if(n==50)break;else{if(f(a2-f(a2)*(a2-a1)/(f(a2)-f(a1)))*f(a1)0||(f(a2)-f(a1))!=0)a1=a2-f(a2)*(a2-a1)/(f(a2)-f(a1));elsea2=a2-f(a2)*(a2-a1)/(f(a2)-f(a1));}}if(n==50)cout双点弦法求解失败!!endlendl;else4cout双点弦法求得的结果是:(a2-f(a2)*(a2-a1)/(f(a2)-f(a1)))endlendl;//return0;}voidnewton2(Da1){doublet=1.0;for(;fabs(f(a1))=fabs(f(a1-t*fnewton(a1)));t/=2.0)for(;fabs(fabs(a1)-fabs(a1-t*fnewton(a1)))=1e-6;)a1-=t*fnewton(a1);cout用Newton下山法求得的结果是:a1endlendl;//return0;}intmain(){doublex1,x2;cout方程是:x^5-3*x^3+x-1=0\n请给出求根区间的左值和右值:\n左值:;cinx1;cout右值:;cinx2;if(f(x1)*f(x2)0){cout此区间上方程无根endl;system(PAUSE);return0;}divide(x1,x2);newton((x1+x2)/2);cord(x1,x2);newton2((x1+x2)/2);system(PAUSE);return0;}3.截图5实验题目二1.题目用Gauss消元法、选主元的Gauss消元法求解以下线性方程组的解Ax=b,要求6输出消元过程中系数矩阵的变化情况4911427381265973274581221bA(1)高斯消元法算法分析在线性代数里就有用Gauss消元法线性方程组的解。通常,对线性方程组的增广矩阵A进行初等行变换化为上三角矩阵的方法,就成为Gauss消元法。对于任意一矩阵1111nmmnaaAaa,均可以用Gauss消元法求解对应线性方程组的解。当用k表示消元过程的次序时,Gauss消元法的计算步骤为:1)Gauss消元过程:设()0,kkka对1,2,,1kn计算()()(1)()()1()()/,1,2,,kkikikkkkkkijijikkjkkkiiikkmaaaamabbmbijkkn2)回代求解过程:()()()()()1/()/1,,2,1nnnnnnniiiiiijjiijixbaxbaxain(2)列主元的Gauss消元法算法分析列主元的Gauss消元法是在Gauss消元法的基础之上加上了列选主元的步2出绝对值最大的,然后通过行交换将其交换到kka的位置上。设主元在第()lkln个方程,即maxlkikkinaa。若lk,将l和k方程互易位置,使新的kka成为主元,然后继续进行,这一步骤称为列选主元。2.源代码#includeiostream7#includeiomanipusingnamespacestd;voidDisplayMatrix(double**a,intsize){coutendl======================================endl;for(inti=0;isize;i++){for(intj=0;jsize+1;j++)coutsetw(15)setprecision(8)a[i][j];;coutendl;}coutendl======================================endl;}voidGauss(double**a,intsize){inti,j,k;doubletmp;cout方程组对应的增广矩阵为:endl;DisplayMatrix(a,size);//输出矩阵,需自己实现该函数/********消元,第k列对角线以下全消成0************/for(k=0;ksize-1;k++){for(i=k+1;isize;i++){tmp=a[i][k]/a[k][k];for(j=k;j=size;j++)a[i][j]-=tmp*a[k][j];}coutendl第k+1列消元后的矩阵为:endl;DisplayMatrix(a,size);}/****************回代求解******************/for(i=size-1;i=0;i--){for(j=size-1;ji;j--)a[i][size]-=a[j][size]*a[i][j];a[i][size]/=a[i][i];}/*输出方程组的解,放在数组最后一列中*/coutendl方程的根为:endl;for(i=0;isize;i++)coutxi+1=setiosflags(ios::left)setw(15)setprecision(8)a[i][size];coutendl;}intmain(){intn,i,j;coutinputthesizeofequations!endl;cinn;8double**p=newdouble*[n];for(i=0;in;i++)p[i]=newdouble[n+1];coutInputthematrixofEquations!endl;for(i=0;in;i++)for(j=0;j=n;j++)cinp[i][j];Gauss(p,n);for(i=0;in;i++)delete[]p[i];delete[]p;system(pause);}3.截图9实验报告三.1.题目分别用雅格比法与高斯-赛德尔迭代法解下列方程组Ax=b,研究其收敛性,上机验证理论分析是否正确,比较它们的收敛速度,观察右端项对迭代收敛有无影响。(1)A行分别为A1=[6,2,-1],A2=[1,4,-2],A3=[-3,1,4],b1=[-3,2,4]T,b2=[100,-200,345]T(2)A行分别为A1=[1,0,8,0.8],A2[0.8,1,0.8],A3=[0.8,0.8,1];b1=[3,2,1]T,b2=[5,0,-10]T,(3)A行分别为A1=[1,3],A2=[-7,1];b=[4,6]T。(1)Jacobi迭代法算法分析线性方程组Ax=b,系数矩阵A非奇异,且aii≠0。即11112211211222221122nnnnnnnnnnax
本文标题:数值计算实验报告
链接地址:https://www.777doc.com/doc-5715614 .html